#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 {
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;
}
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);
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() {
static int data_key = 0;
return reinterpret_cast<void*>(&data_key);
}
CefRefPtr<CefLayout> layout_;
};
}
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);
}
}