| // Copyright 2016 The Chromium Embedded Framework Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be found |
| // in the LICENSE file. |
| |
| #include "libcef/browser/views/layout_util.h" |
| |
| #include <utility> |
| |
| #include "libcef/browser/views/layout_adapter.h" |
| |
| #include "ui/views/view.h" |
| |
| namespace layout_util { |
| |
| namespace { |
| |
| // Manages the association between views::View and CefLayout instances. |
| class UserData : public base::SupportsUserData::Data { |
| public: |
| static CefRefPtr<CefLayout> GetFor(const views::View* view) { |
| UserData* data = static_cast<UserData*>(view->GetUserData(UserDataKey())); |
| if (data) |
| return data->layout_; |
| return nullptr; |
| } |
| |
| // Assign ownership of the underlying views::LayoutManager to |owner_view|. |
| // The views::View that owns the views::LayoutManager will gain a ref-counted |
| // reference to the CefLayout and the CefLayout will keep an unowned reference |
| // to the views::LayoutManager. Destruction of the views::View will release |
| // the reference to the CefLayout. |
| static void Assign(CefRefPtr<CefLayout> cef_layout, views::View* owner_view) { |
| DCHECK(owner_view); |
| DCHECK(cef_layout->IsValid()); |
| |
| views::LayoutManager* layout = CefLayoutAdapter::GetFor(cef_layout)->Get(); |
| DCHECK(layout); |
| |
| // The CefLayout previously associated with |owner_view|, if any, will be |
| // destroyed by this call. |
| owner_view->SetUserData(UserDataKey(), |
| base::WrapUnique(new UserData(cef_layout))); |
| } |
| |
| private: |
| friend std::default_delete<UserData>; |
| |
| explicit UserData(CefRefPtr<CefLayout> cef_layout) : layout_(cef_layout) { |
| DCHECK(layout_); |
| } |
| |
| ~UserData() override { CefLayoutAdapter::GetFor(layout_)->Detach(); } |
| |
| static void* UserDataKey() { |
| // We just need a unique constant. Use the address of a static that |
| // COMDAT folding won't touch in an optimizing linker. |
| static int data_key = 0; |
| return reinterpret_cast<void*>(&data_key); |
| } |
| |
| CefRefPtr<CefLayout> layout_; |
| }; |
| |
| } // namespace |
| |
| CefRefPtr<CefLayout> GetFor(const views::View* view) { |
| return UserData::GetFor(view); |
| } |
| |
| void Assign(CefRefPtr<CefLayout> layout, views::View* owner_view) { |
| return UserData::Assign(layout, owner_view); |
| } |
| |
| } // namespace layout_util |