mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
chrome: Support usage of the Chrome toolbar from Views (see issue #2969)
This commit is contained in:
@ -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())
|
||||
|
@ -53,6 +53,7 @@ class CefBrowserViewImpl
|
||||
|
||||
// CefBrowserView methods:
|
||||
CefRefPtr<CefBrowser> GetBrowser() override;
|
||||
CefRefPtr<CefView> GetChromeToolbar() override;
|
||||
void SetPreferAccelerators(bool prefer_accelerators) override;
|
||||
|
||||
// CefView methods:
|
||||
|
@ -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.
|
||||
|
@ -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();
|
||||
|
@ -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(
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
|
Reference in New Issue
Block a user