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