chrome: Support usage of the Chrome toolbar from Views (see issue #2969)

This commit is contained in:
Marshall Greenblatt
2021-04-11 16:10:11 -04:00
parent 9c82785077
commit a4603c6f1a
55 changed files with 1057 additions and 156 deletions

View File

@ -123,6 +123,15 @@ CefRefPtr<CefBrowser> CefBrowserViewImpl::GetBrowser() {
return browser_;
}
CefRefPtr<CefView> CefBrowserViewImpl::GetChromeToolbar() {
CEF_REQUIRE_VALID_RETURN(nullptr);
if (cef::IsChromeRuntimeEnabled()) {
return static_cast<ChromeBrowserView*>(root_view())->cef_toolbar();
}
return nullptr;
}
void CefBrowserViewImpl::SetPreferAccelerators(bool prefer_accelerators) {
CEF_REQUIRE_VALID_RETURN_VOID();
if (web_view())

View File

@ -53,6 +53,7 @@ class CefBrowserViewImpl
// CefBrowserView methods:
CefRefPtr<CefBrowser> GetBrowser() override;
CefRefPtr<CefView> GetChromeToolbar() override;
void SetPreferAccelerators(bool prefer_accelerators) override;
// CefView methods:

View File

@ -28,8 +28,9 @@ CEF_BUTTON_VIEW_T class CefButtonView : public CEF_VIEW_VIEW_D {
typedef CEF_VIEW_VIEW_D ParentClass;
// |cef_delegate| may be nullptr.
explicit CefButtonView(CefViewDelegateClass* cef_delegate)
: ParentClass(cef_delegate) {}
template <typename... Args>
explicit CefButtonView(CefViewDelegateClass* cef_delegate, Args... args)
: ParentClass(cef_delegate, args...) {}
// Returns the CefButton associated with this view. See comments on
// CefViewView::GetCefView.

View File

@ -25,8 +25,9 @@ CEF_LABEL_BUTTON_VIEW_T class CefLabelButtonView : public CEF_BUTTON_VIEW_D {
typedef CEF_BUTTON_VIEW_D ParentClass;
// |cef_delegate| may be nullptr.
explicit CefLabelButtonView(CefViewDelegateClass* cef_delegate)
: ParentClass(cef_delegate) {}
template <typename... Args>
explicit CefLabelButtonView(CefViewDelegateClass* cef_delegate, Args... args)
: ParentClass(cef_delegate, args...) {}
void Initialize() override {
ParentClass::Initialize();

View File

@ -113,12 +113,14 @@ CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::AddChildView(CefRefPtr<CefView> view) {
CEF_REQUIRE_VALID_RETURN_VOID();
DCHECK(view.get());
DCHECK(view->IsValid());
DCHECK(!view->IsAttached());
if (!view.get() || !view->IsValid() || view->IsAttached())
if (!view.get() || !view->IsValid())
return;
std::unique_ptr<views::View> view_ptr = view_util::PassOwnership(view);
ParentClass::content_view()->AddChildView(view_ptr.release());
auto* view_ptr = view->IsAttached()
? view_util::GetFor(view)
: view_util::PassOwnership(view).release();
DCHECK(view_ptr);
ParentClass::content_view()->AddChildView(view_ptr);
}
CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::AddChildViewAt(CefRefPtr<CefView> view,
@ -126,18 +128,20 @@ CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::AddChildViewAt(CefRefPtr<CefView> view,
CEF_REQUIRE_VALID_RETURN_VOID();
DCHECK(view.get());
DCHECK(view->IsValid());
DCHECK(!view->IsAttached());
DCHECK_GE(index, 0);
DCHECK_LE(static_cast<unsigned int>(index),
ParentClass::content_view()->children().size());
if (!view.get() || !view->IsValid() || view->IsAttached() || index < 0 ||
if (!view.get() || !view->IsValid() || index < 0 ||
(static_cast<unsigned int>(index) >
ParentClass::content_view()->children().size())) {
return;
}
std::unique_ptr<views::View> view_ptr = view_util::PassOwnership(view);
ParentClass::content_view()->AddChildViewAt(view_ptr.release(), index);
auto* view_ptr = view->IsAttached()
? view_util::GetFor(view)
: view_util::PassOwnership(view).release();
DCHECK(view_ptr);
ParentClass::content_view()->AddChildViewAt(view_ptr, index);
}
CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::ReorderChildView(

View File

@ -26,8 +26,9 @@ CEF_PANEL_VIEW_T class CefPanelView : public CEF_VIEW_VIEW_D {
typedef CEF_VIEW_VIEW_D ParentClass;
// |cef_delegate| may be nullptr.
explicit CefPanelView(CefViewDelegateClass* cef_delegate)
: ParentClass(cef_delegate) {}
template <typename... Args>
explicit CefPanelView(CefViewDelegateClass* cef_delegate, Args... args)
: ParentClass(cef_delegate, args...) {}
// Returns the CefPanel associated with this view. See comments on
// CefViewView::GetCefView.

View File

@ -4,6 +4,7 @@
#include "libcef/browser/views/view_adapter.h"
#include "libcef/browser/chrome/views/toolbar_view_impl.h"
#include "libcef/browser/views/basic_label_button_impl.h"
#include "libcef/browser/views/basic_panel_impl.h"
#include "libcef/browser/views/browser_view_impl.h"
@ -40,6 +41,9 @@ CefViewAdapter* CefViewAdapter::GetFor(CefRefPtr<CefView> view) {
adapter = static_cast<CefScrollViewImpl*>(view->AsScrollView().get());
} else if (view->AsTextfield()) {
adapter = static_cast<CefTextfieldImpl*>(view->AsTextfield().get());
} else if (view->GetTypeString().ToString() ==
CefToolbarViewImpl::kTypeString) {
adapter = static_cast<CefToolbarViewImpl*>(view.get());
}
DCHECK(adapter);

View File

@ -34,8 +34,9 @@ CEF_VIEW_VIEW_T class CefViewView : public ViewsViewClass {
// Do not call complex views::View-derived methods from a CefViewView-derived
// constructor as they may attempt to call back into CefViewImpl before
// registration has been performed. |cef_delegate| may be nullptr.
explicit CefViewView(CefViewDelegateClass* cef_delegate)
: cef_delegate_(cef_delegate) {}
template <typename... Args>
explicit CefViewView(CefViewDelegateClass* cef_delegate, Args... args)
: ParentClass(args...), cef_delegate_(cef_delegate) {}
// Should be called from InitializeRootView() in the CefViewImpl-derived
// class that created this object. This method will be called after
@ -70,6 +71,8 @@ CEF_VIEW_VIEW_T class CefViewView : public ViewsViewClass {
void Layout() override;
void ViewHierarchyChanged(
const views::ViewHierarchyChangedDetails& details) override;
void AddedToWidget() override;
void RemovedFromWidget() override;
void OnFocus() override;
void OnBlur() override;
@ -84,7 +87,7 @@ CEF_VIEW_VIEW_T class CefViewView : public ViewsViewClass {
const views::ViewHierarchyChangedDetails& details);
// Not owned by this object.
CefViewDelegateClass* cef_delegate_;
CefViewDelegateClass* const cef_delegate_;
};
CEF_VIEW_VIEW_T gfx::Size CEF_VIEW_VIEW_D::CalculatePreferredSize() const {
@ -162,6 +165,18 @@ CEF_VIEW_VIEW_T void CEF_VIEW_VIEW_D::ViewHierarchyChanged(
ParentClass::ViewHierarchyChanged(details);
}
CEF_VIEW_VIEW_T void CEF_VIEW_VIEW_D::AddedToWidget() {
ParentClass::AddedToWidget();
if (cef_delegate())
cef_delegate()->OnWindowChanged(GetCefView(), /*added=*/true);
}
CEF_VIEW_VIEW_T void CEF_VIEW_VIEW_D::RemovedFromWidget() {
if (cef_delegate())
cef_delegate()->OnWindowChanged(GetCefView(), /*added=*/false);
ParentClass::RemovedFromWidget();
}
CEF_VIEW_VIEW_T void CEF_VIEW_VIEW_D::OnFocus() {
if (cef_delegate())
cef_delegate()->OnFocus(GetCefView());