From a4603c6f1a06d858f659ae9390c05b8b71eae3cc Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Sun, 11 Apr 2021 16:10:11 -0400 Subject: [PATCH] chrome: Support usage of the Chrome toolbar from Views (see issue #2969) --- BUILD.gn | 4 + include/capi/views/cef_browser_view_capi.h | 13 +- .../views/cef_browser_view_delegate_capi.h | 10 +- include/capi/views/cef_view_delegate_capi.h | 9 +- include/cef_api_hash.h | 8 +- include/internal/cef_types.h | 9 + include/views/cef_browser_view.h | 11 + include/views/cef_browser_view_delegate.h | 10 + include/views/cef_view_delegate.h | 6 + libcef/browser/browser_contents_delegate.cc | 7 +- .../browser/chrome/chrome_browser_context.cc | 6 +- .../chrome/views/chrome_browser_view.cc | 28 +++ .../chrome/views/chrome_browser_view.h | 9 + .../browser/chrome/views/toolbar_view_impl.cc | 40 +++ .../browser/chrome/views/toolbar_view_impl.h | 55 +++++ .../browser/chrome/views/toolbar_view_view.cc | 11 + .../browser/chrome/views/toolbar_view_view.h | 27 ++ libcef/browser/views/browser_view_impl.cc | 9 + libcef/browser/views/browser_view_impl.h | 1 + libcef/browser/views/button_view.h | 5 +- libcef/browser/views/label_button_view.h | 5 +- libcef/browser/views/panel_impl.h | 20 +- libcef/browser/views/panel_view.h | 5 +- libcef/browser/views/view_adapter.cc | 4 + libcef/browser/views/view_view.h | 21 +- .../cpptoc/views/browser_view_cpptoc.cc | 21 +- .../views/browser_view_delegate_cpptoc.cc | 46 +++- .../cpptoc/views/button_delegate_cpptoc.cc | 24 +- .../views/menu_button_delegate_cpptoc.cc | 26 +- .../cpptoc/views/panel_delegate_cpptoc.cc | 24 +- .../cpptoc/views/textfield_delegate_cpptoc.cc | 25 +- .../cpptoc/views/view_delegate_cpptoc.cc | 24 +- .../cpptoc/views/window_delegate_cpptoc.cc | 24 +- .../ctocpp/views/browser_view_ctocpp.cc | 19 +- libcef_dll/ctocpp/views/browser_view_ctocpp.h | 3 +- .../views/browser_view_delegate_ctocpp.cc | 56 ++++- .../views/browser_view_delegate_ctocpp.h | 4 +- .../ctocpp/views/button_delegate_ctocpp.cc | 23 +- .../ctocpp/views/button_delegate_ctocpp.h | 3 +- .../views/menu_button_delegate_ctocpp.cc | 23 +- .../views/menu_button_delegate_ctocpp.h | 3 +- .../ctocpp/views/panel_delegate_ctocpp.cc | 23 +- .../ctocpp/views/panel_delegate_ctocpp.h | 3 +- .../ctocpp/views/textfield_delegate_ctocpp.cc | 23 +- .../ctocpp/views/textfield_delegate_ctocpp.h | 3 +- .../ctocpp/views/view_delegate_ctocpp.cc | 22 +- .../ctocpp/views/view_delegate_ctocpp.h | 3 +- .../ctocpp/views/window_delegate_ctocpp.cc | 23 +- .../ctocpp/views/window_delegate_ctocpp.h | 3 +- patch/patches/chrome_browser_browser.patch | 31 ++- patch/patches/chrome_runtime_views.patch | 160 +++++++++++- tests/cefclient/browser/views_window.cc | 231 +++++++++++------- tests/cefclient/browser/views_window.h | 5 + tests/shared/common/client_switches.cc | 1 + tests/shared/common/client_switches.h | 1 + 55 files changed, 1057 insertions(+), 156 deletions(-) create mode 100644 libcef/browser/chrome/views/toolbar_view_impl.cc create mode 100644 libcef/browser/chrome/views/toolbar_view_impl.h create mode 100644 libcef/browser/chrome/views/toolbar_view_view.cc create mode 100644 libcef/browser/chrome/views/toolbar_view_view.h diff --git a/BUILD.gn b/BUILD.gn index 51fdb0016..eebbbe047 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -1068,6 +1068,10 @@ static_library("libcef_static") { "libcef/browser/chrome/views/chrome_browser_frame.h", "libcef/browser/chrome/views/chrome_browser_view.cc", "libcef/browser/chrome/views/chrome_browser_view.h", + "libcef/browser/chrome/views/toolbar_view_impl.cc", + "libcef/browser/chrome/views/toolbar_view_impl.h", + "libcef/browser/chrome/views/toolbar_view_view.cc", + "libcef/browser/chrome/views/toolbar_view_view.h", "libcef/browser/native/window_delegate_view.cc", "libcef/browser/native/window_delegate_view.h", "libcef/browser/views/basic_label_button_impl.cc", diff --git a/include/capi/views/cef_browser_view_capi.h b/include/capi/views/cef_browser_view_capi.h index 9694ea74c..30fd5db04 100644 --- a/include/capi/views/cef_browser_view_capi.h +++ b/include/capi/views/cef_browser_view_capi.h @@ -33,7 +33,7 @@ // by hand. See the translator.README.txt file in the tools directory for // more information. // -// $hash=0fbd582ed5d0231550840ebf3eed2e488ac546d4$ +// $hash=3e4eb9ed3a0cb28ae0459a50f20c8405c7722437$ // #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BROWSER_VIEW_CAPI_H_ @@ -65,6 +65,17 @@ typedef struct _cef_browser_view_t { struct _cef_browser_t*(CEF_CALLBACK* get_browser)( struct _cef_browser_view_t* self); + /// + // Returns the Chrome toolbar associated with this BrowserView. Only supported + // when using the Chrome runtime. The cef_browser_view_delegate_t:: + // get_chrome_toolbar_type() function must return a value other than + // CEF_CTT_NONE and the toolbar will not be available until after this + // BrowserView is added to a cef_window_t and + // cef_view_delegate_t::on_window_changed() has been called. + /// + struct _cef_view_t*(CEF_CALLBACK* get_chrome_toolbar)( + struct _cef_browser_view_t* self); + /// // Sets whether accelerators registered with cef_window_t::SetAccelerator are // triggered before or after the event is sent to the cef_browser_t. If diff --git a/include/capi/views/cef_browser_view_delegate_capi.h b/include/capi/views/cef_browser_view_delegate_capi.h index b4a43a363..9852c37bd 100644 --- a/include/capi/views/cef_browser_view_delegate_capi.h +++ b/include/capi/views/cef_browser_view_delegate_capi.h @@ -33,7 +33,7 @@ // by hand. See the translator.README.txt file in the tools directory for // more information. // -// $hash=37bbfadf761b3a1996276885d593d27d3fed5f8d$ +// $hash=220a126af3682f716f10b9019e8d1461702aa7c9$ // #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BROWSER_VIEW_DELEGATE_CAPI_H_ @@ -112,6 +112,14 @@ typedef struct _cef_browser_view_delegate_t { struct _cef_browser_view_t* browser_view, struct _cef_browser_view_t* popup_browser_view, int is_devtools); + + /// + // Returns the Chrome toolbar type that will be available via + // cef_browser_view_t::get_chrome_toolbar(). See that function for related + // documentation. + /// + cef_chrome_toolbar_type_t(CEF_CALLBACK* get_chrome_toolbar_type)( + struct _cef_browser_view_delegate_t* self); } cef_browser_view_delegate_t; #ifdef __cplusplus diff --git a/include/capi/views/cef_view_delegate_capi.h b/include/capi/views/cef_view_delegate_capi.h index 42cc555fe..9c2a0844e 100644 --- a/include/capi/views/cef_view_delegate_capi.h +++ b/include/capi/views/cef_view_delegate_capi.h @@ -33,7 +33,7 @@ // by hand. See the translator.README.txt file in the tools directory for // more information. // -// $hash=8bd92dd03af4f5cf8c359c45a2d6d013565c2ead$ +// $hash=a060cb3c53317d758e7f6b4a275288cd08f086e7$ // #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_VIEW_DELEGATE_CAPI_H_ @@ -114,6 +114,13 @@ typedef struct _cef_view_delegate_t { int added, struct _cef_view_t* child); + /// + // Called when |view| is added or removed from the cef_window_t. + /// + void(CEF_CALLBACK* on_window_changed)(struct _cef_view_delegate_t* self, + struct _cef_view_t* view, + int added); + /// // Called when |view| gains focus. /// diff --git a/include/cef_api_hash.h b/include/cef_api_hash.h index c5365492d..9c2ab6c8a 100644 --- a/include/cef_api_hash.h +++ b/include/cef_api_hash.h @@ -42,13 +42,13 @@ // way that may cause binary incompatibility with other builds. The universal // hash value will change if any platform is affected whereas the platform hash // values will change only if that particular platform is affected. -#define CEF_API_HASH_UNIVERSAL "09fa2caf6574279a82c1293ab731add98d6124fd" +#define CEF_API_HASH_UNIVERSAL "0468b890ed1832b3763cb5f16c7b007219964b06" #if defined(OS_WIN) -#define CEF_API_HASH_PLATFORM "1cf8e3e6d8163fc9f600b919bec62dbd3687a481" +#define CEF_API_HASH_PLATFORM "dbe7a5bb3fa66b97a57175575d870a003ce632fe" #elif defined(OS_MAC) -#define CEF_API_HASH_PLATFORM "74b89a1b187e5bb5ecd4b97aa21d4abc80d3dcbe" +#define CEF_API_HASH_PLATFORM "f1f736e3e19916d0f3f11de71deff8448dc3a35f" #elif defined(OS_LINUX) -#define CEF_API_HASH_PLATFORM "b78332272b672f9d3db77a83af92857b226bb294" +#define CEF_API_HASH_PLATFORM "de19204124690a84b9b24102f3bd41991781e044" #endif #ifdef __cplusplus diff --git a/include/internal/cef_types.h b/include/internal/cef_types.h index 4ad3832df..c455f0064 100644 --- a/include/internal/cef_types.h +++ b/include/internal/cef_types.h @@ -3214,6 +3214,15 @@ typedef enum { CEF_TFC_SELECT_ALL, } cef_text_field_commands_t; +/// +// Supported Chrome toolbar types. +/// +typedef enum { + CEF_CTT_NONE = 1, + CEF_CTT_NORMAL, + CEF_CTT_LOCATION, +} cef_chrome_toolbar_type_t; + #ifdef __cplusplus } #endif diff --git a/include/views/cef_browser_view.h b/include/views/cef_browser_view.h index a310eb0a2..cbb4e93f8 100644 --- a/include/views/cef_browser_view.h +++ b/include/views/cef_browser_view.h @@ -80,6 +80,17 @@ class CefBrowserView : public CefView { /*--cef()--*/ virtual CefRefPtr GetBrowser() = 0; + /// + // Returns the Chrome toolbar associated with this BrowserView. Only supported + // when using the Chrome runtime. The CefBrowserViewDelegate:: + // GetChromeToolbarType() method must return a value other than + // CEF_CTT_NONE and the toolbar will not be available until after this + // BrowserView is added to a CefWindow and CefViewDelegate::OnWindowChanged() + // has been called. + /// + /*--cef()--*/ + virtual CefRefPtr GetChromeToolbar() = 0; + /// // Sets whether accelerators registered with CefWindow::SetAccelerator are // triggered before or after the event is sent to the CefBrowser. If diff --git a/include/views/cef_browser_view_delegate.h b/include/views/cef_browser_view_delegate.h index 93eea91a0..2612f8657 100644 --- a/include/views/cef_browser_view_delegate.h +++ b/include/views/cef_browser_view_delegate.h @@ -52,6 +52,8 @@ class CefBrowserView; /*--cef(source=client)--*/ class CefBrowserViewDelegate : public CefViewDelegate { public: + typedef cef_chrome_toolbar_type_t ChromeToolbarType; + /// // Called when |browser| associated with |browser_view| is created. This // method will be called after CefLifeSpanHandler::OnAfterCreated() is called @@ -104,6 +106,14 @@ class CefBrowserViewDelegate : public CefViewDelegate { bool is_devtools) { return false; } + + /// + // Returns the Chrome toolbar type that will be available via + // CefBrowserView::GetChromeToolbar(). See that method for related + // documentation. + /// + /*--cef(default_retval=CEF_CTT_NONE)--*/ + virtual ChromeToolbarType GetChromeToolbarType() { return CEF_CTT_NONE; } }; #endif // CEF_INCLUDE_VIEWS_CEF_BROWSER_VIEW_DELEGATE_H_ diff --git a/include/views/cef_view_delegate.h b/include/views/cef_view_delegate.h index 438896c28..152bd99fb 100644 --- a/include/views/cef_view_delegate.h +++ b/include/views/cef_view_delegate.h @@ -105,6 +105,12 @@ class CefViewDelegate : public virtual CefBaseRefCounted { bool added, CefRefPtr child) {} + /// + // Called when |view| is added or removed from the CefWindow. + /// + /*--cef(optional_param=window)--*/ + virtual void OnWindowChanged(CefRefPtr view, bool added) {} + /// // Called when |view| gains focus. /// diff --git a/libcef/browser/browser_contents_delegate.cc b/libcef/browser/browser_contents_delegate.cc index c86c55ec4..ca9b252c9 100644 --- a/libcef/browser/browser_contents_delegate.cc +++ b/libcef/browser/browser_contents_delegate.cc @@ -68,9 +68,12 @@ content::WebContents* CefBrowserContentsDelegate::OpenURLFromTab( if (auto c = client()) { if (auto handler = c->GetRequestHandler()) { + // May return nullptr for omnibox navigations. + auto frame = browser()->GetFrame(params.frame_tree_node_id); + if (!frame) + frame = browser()->GetMainFrame(); cancel = handler->OnOpenURLFromTab( - browser(), browser()->GetFrame(params.frame_tree_node_id), - params.url.spec(), + browser(), frame, params.url.spec(), static_cast(params.disposition), params.user_gesture); } diff --git a/libcef/browser/chrome/chrome_browser_context.cc b/libcef/browser/chrome/chrome_browser_context.cc index 4d6f4d17a..f514b03fc 100644 --- a/libcef/browser/chrome/chrome_browser_context.cc +++ b/libcef/browser/chrome/chrome_browser_context.cc @@ -34,7 +34,7 @@ void ChromeBrowserContext::InitializeAsync(base::OnceClosure initialized_cb) { if (cache_path_ == user_data_dir) { // Use the default disk-based profile. - auto profile = profile_manager->GetActiveUserProfile(); + auto profile = profile_manager->GetPrimaryUserProfile(); ProfileCreated(profile, Profile::CreateStatus::CREATE_STATUS_CREATED); ProfileCreated(profile, Profile::CreateStatus::CREATE_STATUS_INITIALIZED); return; @@ -63,7 +63,7 @@ void ChromeBrowserContext::Shutdown() { // |g_browser_process| may be nullptr during shutdown. if (should_destroy_ && g_browser_process) { g_browser_process->profile_manager() - ->GetActiveUserProfile() + ->GetPrimaryUserProfile() ->DestroyOffTheRecordProfile(profile_); } profile_ = nullptr; @@ -83,7 +83,7 @@ void ChromeBrowserContext::ProfileCreated(Profile* profile, // new/unique OffTheRecord profile instead. const auto& profile_id = Profile::OTRProfileID::CreateUniqueForCEF(); parent_profile = - g_browser_process->profile_manager()->GetActiveUserProfile(); + g_browser_process->profile_manager()->GetPrimaryUserProfile(); profile_ = parent_profile->GetOffTheRecordProfile(profile_id); otr_profile = static_cast(profile_); status = Profile::CreateStatus::CREATE_STATUS_INITIALIZED; diff --git a/libcef/browser/chrome/views/chrome_browser_view.cc b/libcef/browser/chrome/views/chrome_browser_view.cc index bbd58d5af..07d21a6d4 100644 --- a/libcef/browser/chrome/views/chrome_browser_view.cc +++ b/libcef/browser/chrome/views/chrome_browser_view.cc @@ -68,3 +68,31 @@ void ChromeBrowserView::OnBoundsChanged(const gfx::Rect& previous_bounds) { ParentClass::OnBoundsChanged(previous_bounds); browser_view_delegate_->OnBoundsChanged(); } + +ToolbarView* ChromeBrowserView::OverrideCreateToolbar( + Browser* browser, + BrowserView* browser_view) { + if (cef_delegate()) { + auto toolbar_type = cef_delegate()->GetChromeToolbarType(); + base::Optional display_mode; + switch (toolbar_type) { + case CEF_CTT_NORMAL: + display_mode = ToolbarView::DisplayMode::NORMAL; + break; + case CEF_CTT_LOCATION: + display_mode = ToolbarView::DisplayMode::LOCATION; + break; + default: + break; + } + if (display_mode) { + cef_toolbar_ = CefToolbarViewImpl::Create(nullptr, browser, browser_view, + display_mode); + // Ownership will be taken by BrowserView. + view_util::PassOwnership(cef_toolbar_).release(); + return cef_toolbar_->root_view(); + } + } + + return nullptr; +} diff --git a/libcef/browser/chrome/views/chrome_browser_view.h b/libcef/browser/chrome/views/chrome_browser_view.h index d9246eed8..7583603ca 100644 --- a/libcef/browser/chrome/views/chrome_browser_view.h +++ b/libcef/browser/chrome/views/chrome_browser_view.h @@ -8,6 +8,7 @@ #include "include/views/cef_browser_view.h" #include "include/views/cef_browser_view_delegate.h" +#include "libcef/browser/chrome/views/toolbar_view_impl.h" #include "libcef/browser/views/browser_view_view.h" #include "libcef/browser/views/view_view.h" @@ -42,6 +43,12 @@ class ChromeBrowserView void AddedToWidget() override; void OnBoundsChanged(const gfx::Rect& previous_bounds) override; + // BrowserView methods: + ToolbarView* OverrideCreateToolbar(Browser* browser, + BrowserView* browser_view) override; + + CefRefPtr cef_toolbar() const { return cef_toolbar_; } + private: // Not owned by this object. Delegate* browser_view_delegate_; @@ -51,6 +58,8 @@ class ChromeBrowserView bool destroyed_ = false; + CefRefPtr cef_toolbar_; + DISALLOW_COPY_AND_ASSIGN(ChromeBrowserView); }; diff --git a/libcef/browser/chrome/views/toolbar_view_impl.cc b/libcef/browser/chrome/views/toolbar_view_impl.cc new file mode 100644 index 000000000..de010b80e --- /dev/null +++ b/libcef/browser/chrome/views/toolbar_view_impl.cc @@ -0,0 +1,40 @@ +// Copyright 2021 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/chrome/views/toolbar_view_impl.h" + +// static +CefRefPtr CefToolbarViewImpl::Create( + CefRefPtr delegate, + Browser* browser, + BrowserView* browser_view, + base::Optional display_mode) { + CEF_REQUIRE_UIT_RETURN(nullptr); + CefRefPtr view = + new CefToolbarViewImpl(delegate, browser, browser_view, display_mode); + view->Initialize(); + return view; +} + +// static +const char* const CefToolbarViewImpl::kTypeString = "ToolbarView"; + +CefToolbarViewImpl::CefToolbarViewImpl( + CefRefPtr delegate, + Browser* browser, + BrowserView* browser_view, + base::Optional display_mode) + : ParentClass(delegate), + browser_(browser), + browser_view_(browser_view), + display_mode_(display_mode) {} + +CefToolbarViewView* CefToolbarViewImpl::CreateRootView() { + return new CefToolbarViewView(delegate(), browser_, browser_view_, + display_mode_); +} + +void CefToolbarViewImpl::InitializeRootView() { + static_cast(root_view())->Initialize(); +} diff --git a/libcef/browser/chrome/views/toolbar_view_impl.h b/libcef/browser/chrome/views/toolbar_view_impl.h new file mode 100644 index 000000000..848ab0d39 --- /dev/null +++ b/libcef/browser/chrome/views/toolbar_view_impl.h @@ -0,0 +1,55 @@ +// Copyright 2021 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. + +#ifndef CEF_LIBCEF_BROWSER_CHROME_VIEWS_TOOLBAR_VIEW_IMPL_H_ +#define CEF_LIBCEF_BROWSER_CHROME_VIEWS_TOOLBAR_VIEW_IMPL_H_ +#pragma once + +#include "include/views/cef_view_delegate.h" + +#include "libcef/browser/chrome/views/toolbar_view_view.h" +#include "libcef/browser/views/view_impl.h" + +class Browser; +class BrowserView; + +class CefToolbarViewImpl + : public CefViewImpl { + public: + typedef CefViewImpl ParentClass; + + // Create a new CefToolbarViewImpl instance. |delegate| may be nullptr. + static CefRefPtr Create( + CefRefPtr delegate, + Browser* browser, + BrowserView* browser_view, + base::Optional display_mode); + + static const char* const kTypeString; + + // CefViewAdapter methods: + std::string GetDebugType() override { return kTypeString; } + + private: + // Create a new implementation object. + // Always call Initialize() after creation. + // |delegate| may be nullptr. + CefToolbarViewImpl(CefRefPtr delegate, + Browser* browser, + BrowserView* browser_view, + base::Optional display_mode); + + // CefViewImpl methods: + CefToolbarViewView* CreateRootView() override; + void InitializeRootView() override; + + Browser* const browser_; + BrowserView* const browser_view_; + base::Optional const display_mode_; + + IMPLEMENT_REFCOUNTING_DELETE_ON_UIT(CefToolbarViewImpl); + DISALLOW_COPY_AND_ASSIGN(CefToolbarViewImpl); +}; + +#endif // CEF_LIBCEF_BROWSER_VIEWS_SCROLL_VIEW_IMPL_H_ diff --git a/libcef/browser/chrome/views/toolbar_view_view.cc b/libcef/browser/chrome/views/toolbar_view_view.cc new file mode 100644 index 000000000..aeb20b307 --- /dev/null +++ b/libcef/browser/chrome/views/toolbar_view_view.cc @@ -0,0 +1,11 @@ +// Copyright 2021 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/chrome/views/toolbar_view_view.h" + +CefToolbarViewView::CefToolbarViewView(CefViewDelegate* cef_delegate, + Browser* browser, + BrowserView* browser_view, + base::Optional display_mode) + : ParentClass(cef_delegate, browser, browser_view, display_mode) {} diff --git a/libcef/browser/chrome/views/toolbar_view_view.h b/libcef/browser/chrome/views/toolbar_view_view.h new file mode 100644 index 000000000..8eed6c037 --- /dev/null +++ b/libcef/browser/chrome/views/toolbar_view_view.h @@ -0,0 +1,27 @@ +// Copyright 2021 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. + +#ifndef CEF_LIBCEF_BROWSER_CHROME_VIEWS_TOOLBAR_VIEW_VIEW_H_ +#define CEF_LIBCEF_BROWSER_CHROME_VIEWS_TOOLBAR_VIEW_VIEW_H_ +#pragma once + +#include "libcef/browser/views/view_view.h" + +#include "chrome/browser/ui/views/toolbar/toolbar_view.h" + +class CefToolbarViewView : public CefViewView { + public: + typedef CefViewView ParentClass; + + // |cef_delegate| may be nullptr. + explicit CefToolbarViewView(CefViewDelegate* cef_delegate, + Browser* browser, + BrowserView* browser_view, + base::Optional display_mode); + + private: + DISALLOW_COPY_AND_ASSIGN(CefToolbarViewView); +}; + +#endif // CEF_LIBCEF_BROWSER_CHROME_VIEWS_TOOLBAR_VIEW_VIEW_H_ diff --git a/libcef/browser/views/browser_view_impl.cc b/libcef/browser/views/browser_view_impl.cc index bc7d23ce1..26dbfa47a 100644 --- a/libcef/browser/views/browser_view_impl.cc +++ b/libcef/browser/views/browser_view_impl.cc @@ -123,6 +123,15 @@ CefRefPtr CefBrowserViewImpl::GetBrowser() { return browser_; } +CefRefPtr CefBrowserViewImpl::GetChromeToolbar() { + CEF_REQUIRE_VALID_RETURN(nullptr); + if (cef::IsChromeRuntimeEnabled()) { + return static_cast(root_view())->cef_toolbar(); + } + + return nullptr; +} + void CefBrowserViewImpl::SetPreferAccelerators(bool prefer_accelerators) { CEF_REQUIRE_VALID_RETURN_VOID(); if (web_view()) diff --git a/libcef/browser/views/browser_view_impl.h b/libcef/browser/views/browser_view_impl.h index 3a9770039..d01a6e153 100644 --- a/libcef/browser/views/browser_view_impl.h +++ b/libcef/browser/views/browser_view_impl.h @@ -53,6 +53,7 @@ class CefBrowserViewImpl // CefBrowserView methods: CefRefPtr GetBrowser() override; + CefRefPtr GetChromeToolbar() override; void SetPreferAccelerators(bool prefer_accelerators) override; // CefView methods: diff --git a/libcef/browser/views/button_view.h b/libcef/browser/views/button_view.h index d297aa86b..5538e6089 100644 --- a/libcef/browser/views/button_view.h +++ b/libcef/browser/views/button_view.h @@ -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 + explicit CefButtonView(CefViewDelegateClass* cef_delegate, Args... args) + : ParentClass(cef_delegate, args...) {} // Returns the CefButton associated with this view. See comments on // CefViewView::GetCefView. diff --git a/libcef/browser/views/label_button_view.h b/libcef/browser/views/label_button_view.h index e159724ee..db0738b97 100644 --- a/libcef/browser/views/label_button_view.h +++ b/libcef/browser/views/label_button_view.h @@ -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 + explicit CefLabelButtonView(CefViewDelegateClass* cef_delegate, Args... args) + : ParentClass(cef_delegate, args...) {} void Initialize() override { ParentClass::Initialize(); diff --git a/libcef/browser/views/panel_impl.h b/libcef/browser/views/panel_impl.h index 990f93100..c8b11003b 100644 --- a/libcef/browser/views/panel_impl.h +++ b/libcef/browser/views/panel_impl.h @@ -113,12 +113,14 @@ CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::AddChildView(CefRefPtr 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 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 view, @@ -126,18 +128,20 @@ CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::AddChildViewAt(CefRefPtr view, CEF_REQUIRE_VALID_RETURN_VOID(); DCHECK(view.get()); DCHECK(view->IsValid()); - DCHECK(!view->IsAttached()); DCHECK_GE(index, 0); DCHECK_LE(static_cast(index), ParentClass::content_view()->children().size()); - if (!view.get() || !view->IsValid() || view->IsAttached() || index < 0 || + if (!view.get() || !view->IsValid() || index < 0 || (static_cast(index) > ParentClass::content_view()->children().size())) { return; } - std::unique_ptr 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( diff --git a/libcef/browser/views/panel_view.h b/libcef/browser/views/panel_view.h index 13d780841..ebbab9936 100644 --- a/libcef/browser/views/panel_view.h +++ b/libcef/browser/views/panel_view.h @@ -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 + explicit CefPanelView(CefViewDelegateClass* cef_delegate, Args... args) + : ParentClass(cef_delegate, args...) {} // Returns the CefPanel associated with this view. See comments on // CefViewView::GetCefView. diff --git a/libcef/browser/views/view_adapter.cc b/libcef/browser/views/view_adapter.cc index 8f3aa4bff..4dfbd482d 100644 --- a/libcef/browser/views/view_adapter.cc +++ b/libcef/browser/views/view_adapter.cc @@ -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 view) { adapter = static_cast(view->AsScrollView().get()); } else if (view->AsTextfield()) { adapter = static_cast(view->AsTextfield().get()); + } else if (view->GetTypeString().ToString() == + CefToolbarViewImpl::kTypeString) { + adapter = static_cast(view.get()); } DCHECK(adapter); diff --git a/libcef/browser/views/view_view.h b/libcef/browser/views/view_view.h index 4ebce179b..7073b687e 100644 --- a/libcef/browser/views/view_view.h +++ b/libcef/browser/views/view_view.h @@ -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 + 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()); diff --git a/libcef_dll/cpptoc/views/browser_view_cpptoc.cc b/libcef_dll/cpptoc/views/browser_view_cpptoc.cc index ab9496f2c..bed65f7d6 100644 --- a/libcef_dll/cpptoc/views/browser_view_cpptoc.cc +++ b/libcef_dll/cpptoc/views/browser_view_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=d69aae0b968db9610e29d956d629f1789eca922d$ +// $hash=312985bb5cc971d1fe9d77af1f985f6a544e9db5$ // #include "libcef_dll/cpptoc/views/browser_view_cpptoc.h" @@ -102,6 +102,24 @@ browser_view_get_browser(struct _cef_browser_view_t* self) { return CefBrowserCppToC::Wrap(_retval); } +struct _cef_view_t* CEF_CALLBACK +browser_view_get_chrome_toolbar(struct _cef_browser_view_t* self) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return NULL; + + // Execute + CefRefPtr _retval = + CefBrowserViewCppToC::Get(self)->GetChromeToolbar(); + + // Return type: refptr_same + return CefViewCppToC::Wrap(_retval); +} + void CEF_CALLBACK browser_view_set_prefer_accelerators(struct _cef_browser_view_t* self, int prefer_accelerators) { @@ -1075,6 +1093,7 @@ int CEF_CALLBACK browser_view_convert_point_from_view(struct _cef_view_t* self, CefBrowserViewCppToC::CefBrowserViewCppToC() { GetStruct()->get_browser = browser_view_get_browser; + GetStruct()->get_chrome_toolbar = browser_view_get_chrome_toolbar; GetStruct()->set_prefer_accelerators = browser_view_set_prefer_accelerators; GetStruct()->base.as_browser_view = browser_view_as_browser_view; GetStruct()->base.as_button = browser_view_as_button; diff --git a/libcef_dll/cpptoc/views/browser_view_delegate_cpptoc.cc b/libcef_dll/cpptoc/views/browser_view_delegate_cpptoc.cc index 1a4771907..6cdb81427 100644 --- a/libcef_dll/cpptoc/views/browser_view_delegate_cpptoc.cc +++ b/libcef_dll/cpptoc/views/browser_view_delegate_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=dceaf28fbed0456dce3c34fcbc8177f3c2537cec$ +// $hash=8e8daae6a8ed718582045ea42e16906813b77337$ // #include "libcef_dll/cpptoc/views/browser_view_delegate_cpptoc.h" @@ -149,6 +149,25 @@ int CEF_CALLBACK browser_view_delegate_on_popup_browser_view_created( return _retval; } +cef_chrome_toolbar_type_t CEF_CALLBACK +browser_view_delegate_get_chrome_toolbar_type( + struct _cef_browser_view_delegate_t* self) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return CEF_CTT_NONE; + + // Execute + cef_chrome_toolbar_type_t _retval = + CefBrowserViewDelegateCppToC::Get(self)->GetChromeToolbarType(); + + // Return type: simple + return _retval; +} + cef_size_t CEF_CALLBACK browser_view_delegate_get_preferred_size(struct _cef_view_delegate_t* self, cef_view_t* view) { @@ -302,6 +321,28 @@ browser_view_delegate_on_child_view_changed(struct _cef_view_delegate_t* self, CefViewCToCpp::Wrap(child)); } +void CEF_CALLBACK +browser_view_delegate_on_window_changed(struct _cef_view_delegate_t* self, + cef_view_t* view, + int added) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: view; type: refptr_diff + DCHECK(view); + if (!view) + return; + + // Execute + CefBrowserViewDelegateCppToC::Get( + reinterpret_cast(self)) + ->OnWindowChanged(CefViewCToCpp::Wrap(view), added ? true : false); +} + void CEF_CALLBACK browser_view_delegate_on_focus(struct _cef_view_delegate_t* self, cef_view_t* view) { @@ -356,6 +397,8 @@ CefBrowserViewDelegateCppToC::CefBrowserViewDelegateCppToC() { browser_view_delegate_get_delegate_for_popup_browser_view; GetStruct()->on_popup_browser_view_created = browser_view_delegate_on_popup_browser_view_created; + GetStruct()->get_chrome_toolbar_type = + browser_view_delegate_get_chrome_toolbar_type; GetStruct()->base.get_preferred_size = browser_view_delegate_get_preferred_size; GetStruct()->base.get_minimum_size = browser_view_delegate_get_minimum_size; @@ -366,6 +409,7 @@ CefBrowserViewDelegateCppToC::CefBrowserViewDelegateCppToC() { browser_view_delegate_on_parent_view_changed; GetStruct()->base.on_child_view_changed = browser_view_delegate_on_child_view_changed; + GetStruct()->base.on_window_changed = browser_view_delegate_on_window_changed; GetStruct()->base.on_focus = browser_view_delegate_on_focus; GetStruct()->base.on_blur = browser_view_delegate_on_blur; } diff --git a/libcef_dll/cpptoc/views/button_delegate_cpptoc.cc b/libcef_dll/cpptoc/views/button_delegate_cpptoc.cc index d5e9ba6e2..2870db70e 100644 --- a/libcef_dll/cpptoc/views/button_delegate_cpptoc.cc +++ b/libcef_dll/cpptoc/views/button_delegate_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=0fa0f3d240a017c67e65fc7e965c9b8c61e64649$ +// $hash=52a0deb8b7ae62e474acb1474cf922c3e9a04f14$ // #include "libcef_dll/cpptoc/views/button_delegate_cpptoc.h" @@ -213,6 +213,27 @@ button_delegate_on_child_view_changed(struct _cef_view_delegate_t* self, CefViewCToCpp::Wrap(child)); } +void CEF_CALLBACK +button_delegate_on_window_changed(struct _cef_view_delegate_t* self, + cef_view_t* view, + int added) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: view; type: refptr_diff + DCHECK(view); + if (!view) + return; + + // Execute + CefButtonDelegateCppToC::Get(reinterpret_cast(self)) + ->OnWindowChanged(CefViewCToCpp::Wrap(view), added ? true : false); +} + void CEF_CALLBACK button_delegate_on_focus(struct _cef_view_delegate_t* self, cef_view_t* view) { shutdown_checker::AssertNotShutdown(); @@ -267,6 +288,7 @@ CefButtonDelegateCppToC::CefButtonDelegateCppToC() { button_delegate_on_parent_view_changed; GetStruct()->base.on_child_view_changed = button_delegate_on_child_view_changed; + GetStruct()->base.on_window_changed = button_delegate_on_window_changed; GetStruct()->base.on_focus = button_delegate_on_focus; GetStruct()->base.on_blur = button_delegate_on_blur; } diff --git a/libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.cc b/libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.cc index 90e52b4eb..f76e3053b 100644 --- a/libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.cc +++ b/libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=8c598c348857748e3eca7629326f2eff46e7c06c$ +// $hash=2fcd1d4d2126285209e1fa782beccbb363693bf3$ // #include "libcef_dll/cpptoc/views/menu_button_delegate_cpptoc.h" @@ -252,6 +252,28 @@ menu_button_delegate_on_child_view_changed(struct _cef_view_delegate_t* self, CefViewCToCpp::Wrap(child)); } +void CEF_CALLBACK +menu_button_delegate_on_window_changed(struct _cef_view_delegate_t* self, + cef_view_t* view, + int added) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: view; type: refptr_diff + DCHECK(view); + if (!view) + return; + + // Execute + CefMenuButtonDelegateCppToC::Get( + reinterpret_cast(self)) + ->OnWindowChanged(CefViewCToCpp::Wrap(view), added ? true : false); +} + void CEF_CALLBACK menu_button_delegate_on_focus(struct _cef_view_delegate_t* self, cef_view_t* view) { @@ -316,6 +338,8 @@ CefMenuButtonDelegateCppToC::CefMenuButtonDelegateCppToC() { menu_button_delegate_on_parent_view_changed; GetStruct()->base.base.on_child_view_changed = menu_button_delegate_on_child_view_changed; + GetStruct()->base.base.on_window_changed = + menu_button_delegate_on_window_changed; GetStruct()->base.base.on_focus = menu_button_delegate_on_focus; GetStruct()->base.base.on_blur = menu_button_delegate_on_blur; } diff --git a/libcef_dll/cpptoc/views/panel_delegate_cpptoc.cc b/libcef_dll/cpptoc/views/panel_delegate_cpptoc.cc index 56cf64f04..11f8ebfd1 100644 --- a/libcef_dll/cpptoc/views/panel_delegate_cpptoc.cc +++ b/libcef_dll/cpptoc/views/panel_delegate_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=e3a1c9fc1175aef66bd4f2c2c9a11263502977ff$ +// $hash=dd29f2990766a766a27dece7e39501eb11a296fd$ // #include "libcef_dll/cpptoc/views/panel_delegate_cpptoc.h" @@ -172,6 +172,27 @@ panel_delegate_on_child_view_changed(struct _cef_view_delegate_t* self, CefViewCToCpp::Wrap(child)); } +void CEF_CALLBACK +panel_delegate_on_window_changed(struct _cef_view_delegate_t* self, + cef_view_t* view, + int added) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: view; type: refptr_diff + DCHECK(view); + if (!view) + return; + + // Execute + CefPanelDelegateCppToC::Get(reinterpret_cast(self)) + ->OnWindowChanged(CefViewCToCpp::Wrap(view), added ? true : false); +} + void CEF_CALLBACK panel_delegate_on_focus(struct _cef_view_delegate_t* self, cef_view_t* view) { shutdown_checker::AssertNotShutdown(); @@ -223,6 +244,7 @@ CefPanelDelegateCppToC::CefPanelDelegateCppToC() { panel_delegate_on_parent_view_changed; GetStruct()->base.on_child_view_changed = panel_delegate_on_child_view_changed; + GetStruct()->base.on_window_changed = panel_delegate_on_window_changed; GetStruct()->base.on_focus = panel_delegate_on_focus; GetStruct()->base.on_blur = panel_delegate_on_blur; } diff --git a/libcef_dll/cpptoc/views/textfield_delegate_cpptoc.cc b/libcef_dll/cpptoc/views/textfield_delegate_cpptoc.cc index b8e5f898c..7282c488c 100644 --- a/libcef_dll/cpptoc/views/textfield_delegate_cpptoc.cc +++ b/libcef_dll/cpptoc/views/textfield_delegate_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=2762af8abc72d877fd2a44a07701861face6013d$ +// $hash=e35b635ec442c8910b02aca64d48760b1360c868$ // #include "libcef_dll/cpptoc/views/textfield_delegate_cpptoc.h" @@ -227,6 +227,28 @@ textfield_delegate_on_child_view_changed(struct _cef_view_delegate_t* self, CefViewCToCpp::Wrap(child)); } +void CEF_CALLBACK +textfield_delegate_on_window_changed(struct _cef_view_delegate_t* self, + cef_view_t* view, + int added) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: view; type: refptr_diff + DCHECK(view); + if (!view) + return; + + // Execute + CefTextfieldDelegateCppToC::Get( + reinterpret_cast(self)) + ->OnWindowChanged(CefViewCToCpp::Wrap(view), added ? true : false); +} + void CEF_CALLBACK textfield_delegate_on_focus(struct _cef_view_delegate_t* self, cef_view_t* view) { shutdown_checker::AssertNotShutdown(); @@ -283,6 +305,7 @@ CefTextfieldDelegateCppToC::CefTextfieldDelegateCppToC() { textfield_delegate_on_parent_view_changed; GetStruct()->base.on_child_view_changed = textfield_delegate_on_child_view_changed; + GetStruct()->base.on_window_changed = textfield_delegate_on_window_changed; GetStruct()->base.on_focus = textfield_delegate_on_focus; GetStruct()->base.on_blur = textfield_delegate_on_blur; } diff --git a/libcef_dll/cpptoc/views/view_delegate_cpptoc.cc b/libcef_dll/cpptoc/views/view_delegate_cpptoc.cc index 321358ff2..9a06b6ff4 100644 --- a/libcef_dll/cpptoc/views/view_delegate_cpptoc.cc +++ b/libcef_dll/cpptoc/views/view_delegate_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=918764cb2b4346405ddfb1f4eeb26f3042d93bb9$ +// $hash=7c6283658d49420281d02b4793f65f478f261461$ // #include "libcef_dll/cpptoc/views/view_delegate_cpptoc.h" @@ -173,6 +173,27 @@ view_delegate_on_child_view_changed(struct _cef_view_delegate_t* self, CefViewCToCpp::Wrap(child)); } +void CEF_CALLBACK +view_delegate_on_window_changed(struct _cef_view_delegate_t* self, + cef_view_t* view, + int added) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: view; type: refptr_diff + DCHECK(view); + if (!view) + return; + + // Execute + CefViewDelegateCppToC::Get(self)->OnWindowChanged(CefViewCToCpp::Wrap(view), + added ? true : false); +} + void CEF_CALLBACK view_delegate_on_focus(struct _cef_view_delegate_t* self, cef_view_t* view) { shutdown_checker::AssertNotShutdown(); @@ -220,6 +241,7 @@ CefViewDelegateCppToC::CefViewDelegateCppToC() { GetStruct()->get_height_for_width = view_delegate_get_height_for_width; GetStruct()->on_parent_view_changed = view_delegate_on_parent_view_changed; GetStruct()->on_child_view_changed = view_delegate_on_child_view_changed; + GetStruct()->on_window_changed = view_delegate_on_window_changed; GetStruct()->on_focus = view_delegate_on_focus; GetStruct()->on_blur = view_delegate_on_blur; } diff --git a/libcef_dll/cpptoc/views/window_delegate_cpptoc.cc b/libcef_dll/cpptoc/views/window_delegate_cpptoc.cc index c3e8f9196..b3fb17135 100644 --- a/libcef_dll/cpptoc/views/window_delegate_cpptoc.cc +++ b/libcef_dll/cpptoc/views/window_delegate_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=041bb67146f8e803a9eeb7790528441f2f8ceb28$ +// $hash=a201b988556a825fffe39f58e378664b93795c72$ // #include "libcef_dll/cpptoc/views/window_delegate_cpptoc.h" @@ -452,6 +452,27 @@ window_delegate_on_child_view_changed(struct _cef_view_delegate_t* self, CefViewCToCpp::Wrap(child)); } +void CEF_CALLBACK +window_delegate_on_window_changed(struct _cef_view_delegate_t* self, + cef_view_t* view, + int added) { + shutdown_checker::AssertNotShutdown(); + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: view; type: refptr_diff + DCHECK(view); + if (!view) + return; + + // Execute + CefWindowDelegateCppToC::Get(reinterpret_cast(self)) + ->OnWindowChanged(CefViewCToCpp::Wrap(view), added ? true : false); +} + void CEF_CALLBACK window_delegate_on_focus(struct _cef_view_delegate_t* self, cef_view_t* view) { shutdown_checker::AssertNotShutdown(); @@ -516,6 +537,7 @@ CefWindowDelegateCppToC::CefWindowDelegateCppToC() { window_delegate_on_parent_view_changed; GetStruct()->base.base.on_child_view_changed = window_delegate_on_child_view_changed; + GetStruct()->base.base.on_window_changed = window_delegate_on_window_changed; GetStruct()->base.base.on_focus = window_delegate_on_focus; GetStruct()->base.base.on_blur = window_delegate_on_blur; } diff --git a/libcef_dll/ctocpp/views/browser_view_ctocpp.cc b/libcef_dll/ctocpp/views/browser_view_ctocpp.cc index 558fb43f7..d2420a9f7 100644 --- a/libcef_dll/ctocpp/views/browser_view_ctocpp.cc +++ b/libcef_dll/ctocpp/views/browser_view_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=60dd60fe326607167c50e97f55a673151c1dcc69$ +// $hash=912a0807db8bc1405188d61961545cc8e540aacf$ // #include "libcef_dll/ctocpp/views/browser_view_ctocpp.h" @@ -93,6 +93,23 @@ CefRefPtr CefBrowserViewCToCpp::GetBrowser() { return CefBrowserCToCpp::Wrap(_retval); } +NO_SANITIZE("cfi-icall") +CefRefPtr CefBrowserViewCToCpp::GetChromeToolbar() { + shutdown_checker::AssertNotShutdown(); + + cef_browser_view_t* _struct = GetStruct(); + if (CEF_MEMBER_MISSING(_struct, get_chrome_toolbar)) + return nullptr; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Execute + cef_view_t* _retval = _struct->get_chrome_toolbar(_struct); + + // Return type: refptr_same + return CefViewCToCpp::Wrap(_retval); +} + NO_SANITIZE("cfi-icall") void CefBrowserViewCToCpp::SetPreferAccelerators(bool prefer_accelerators) { shutdown_checker::AssertNotShutdown(); diff --git a/libcef_dll/ctocpp/views/browser_view_ctocpp.h b/libcef_dll/ctocpp/views/browser_view_ctocpp.h index a85424aa7..af2222ccc 100644 --- a/libcef_dll/ctocpp/views/browser_view_ctocpp.h +++ b/libcef_dll/ctocpp/views/browser_view_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=b9bb98216be4ad0a91215e146dfd330ebe790721$ +// $hash=f17d395c61d650a824016d14bc06d0cb9db9a6e6$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_BROWSER_VIEW_CTOCPP_H_ @@ -35,6 +35,7 @@ class CefBrowserViewCToCpp : public CefCToCppRefCounted GetBrowser() OVERRIDE; + CefRefPtr GetChromeToolbar() OVERRIDE; void SetPreferAccelerators(bool prefer_accelerators) OVERRIDE; // CefView methods. diff --git a/libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.cc b/libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.cc index bdbd15d7f..40f6734d3 100644 --- a/libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.cc +++ b/libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=902dae801096930c473e8cd7c86945fc0e703a98$ +// $hash=9aed01b6014f1c22815e7847eba321d75dbfa45d$ // #include "libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.h" @@ -75,11 +75,12 @@ void CefBrowserViewDelegateCToCpp::OnBrowserDestroyed( } NO_SANITIZE("cfi-icall") -CefRefPtr CefBrowserViewDelegateCToCpp:: - GetDelegateForPopupBrowserView(CefRefPtr browser_view, - const CefBrowserSettings& settings, - CefRefPtr client, - bool is_devtools) { +CefRefPtr +CefBrowserViewDelegateCToCpp::GetDelegateForPopupBrowserView( + CefRefPtr browser_view, + const CefBrowserSettings& settings, + CefRefPtr client, + bool is_devtools) { shutdown_checker::AssertNotShutdown(); cef_browser_view_delegate_t* _struct = GetStruct(); @@ -139,8 +140,26 @@ bool CefBrowserViewDelegateCToCpp::OnPopupBrowserViewCreated( } NO_SANITIZE("cfi-icall") -CefSize - CefBrowserViewDelegateCToCpp::GetPreferredSize(CefRefPtr view) { +CefBrowserViewDelegate::ChromeToolbarType +CefBrowserViewDelegateCToCpp::GetChromeToolbarType() { + shutdown_checker::AssertNotShutdown(); + + cef_browser_view_delegate_t* _struct = GetStruct(); + if (CEF_MEMBER_MISSING(_struct, get_chrome_toolbar_type)) + return CEF_CTT_NONE; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Execute + cef_chrome_toolbar_type_t _retval = _struct->get_chrome_toolbar_type(_struct); + + // Return type: simple + return _retval; +} + +NO_SANITIZE("cfi-icall") +CefSize CefBrowserViewDelegateCToCpp::GetPreferredSize( + CefRefPtr view) { shutdown_checker::AssertNotShutdown(); cef_view_delegate_t* _struct = @@ -292,6 +311,27 @@ void CefBrowserViewDelegateCToCpp::OnChildViewChanged( CefViewCppToC::Wrap(child)); } +NO_SANITIZE("cfi-icall") +void CefBrowserViewDelegateCToCpp::OnWindowChanged(CefRefPtr view, + bool added) { + shutdown_checker::AssertNotShutdown(); + + cef_view_delegate_t* _struct = + reinterpret_cast(GetStruct()); + if (CEF_MEMBER_MISSING(_struct, on_window_changed)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: view; type: refptr_diff + DCHECK(view.get()); + if (!view.get()) + return; + + // Execute + _struct->on_window_changed(_struct, CefViewCppToC::Wrap(view), added); +} + NO_SANITIZE("cfi-icall") void CefBrowserViewDelegateCToCpp::OnFocus(CefRefPtr view) { shutdown_checker::AssertNotShutdown(); diff --git a/libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.h b/libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.h index 8f4776fc4..371638af5 100644 --- a/libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.h +++ b/libcef_dll/ctocpp/views/browser_view_delegate_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=83b4092b1523348b483a411ad80d64fa8b9db63d$ +// $hash=20b067cabc4baa4c9edecaffb38a2ebb28524ccc$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_BROWSER_VIEW_DELEGATE_CTOCPP_H_ @@ -51,6 +51,7 @@ class CefBrowserViewDelegateCToCpp bool OnPopupBrowserViewCreated(CefRefPtr browser_view, CefRefPtr popup_browser_view, bool is_devtools) override; + ChromeToolbarType GetChromeToolbarType() override; // CefViewDelegate methods. CefSize GetPreferredSize(CefRefPtr view) override; @@ -63,6 +64,7 @@ class CefBrowserViewDelegateCToCpp void OnChildViewChanged(CefRefPtr view, bool added, CefRefPtr child) override; + void OnWindowChanged(CefRefPtr view, bool added) override; void OnFocus(CefRefPtr view) override; void OnBlur(CefRefPtr view) override; }; diff --git a/libcef_dll/ctocpp/views/button_delegate_ctocpp.cc b/libcef_dll/ctocpp/views/button_delegate_ctocpp.cc index a2cebd7c8..8f71a1612 100644 --- a/libcef_dll/ctocpp/views/button_delegate_ctocpp.cc +++ b/libcef_dll/ctocpp/views/button_delegate_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=3dcc24823032b36d6566eea42fd3ccdcee286e92$ +// $hash=fc962d2832eeb3dee99e9a201f234d4a4b4d6f0f$ // #include "libcef_dll/ctocpp/views/button_delegate_ctocpp.h" @@ -210,6 +210,27 @@ void CefButtonDelegateCToCpp::OnChildViewChanged(CefRefPtr view, CefViewCppToC::Wrap(child)); } +NO_SANITIZE("cfi-icall") +void CefButtonDelegateCToCpp::OnWindowChanged(CefRefPtr view, + bool added) { + shutdown_checker::AssertNotShutdown(); + + cef_view_delegate_t* _struct = + reinterpret_cast(GetStruct()); + if (CEF_MEMBER_MISSING(_struct, on_window_changed)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: view; type: refptr_diff + DCHECK(view.get()); + if (!view.get()) + return; + + // Execute + _struct->on_window_changed(_struct, CefViewCppToC::Wrap(view), added); +} + NO_SANITIZE("cfi-icall") void CefButtonDelegateCToCpp::OnFocus(CefRefPtr view) { shutdown_checker::AssertNotShutdown(); diff --git a/libcef_dll/ctocpp/views/button_delegate_ctocpp.h b/libcef_dll/ctocpp/views/button_delegate_ctocpp.h index f1451d74e..cffab417e 100644 --- a/libcef_dll/ctocpp/views/button_delegate_ctocpp.h +++ b/libcef_dll/ctocpp/views/button_delegate_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=532ee88167e55b11e3bce9330b93f33fa382e24a$ +// $hash=6a72a71a9becd6103d44719ed88b000d576d95eb$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_BUTTON_DELEGATE_CTOCPP_H_ @@ -51,6 +51,7 @@ class CefButtonDelegateCToCpp void OnChildViewChanged(CefRefPtr view, bool added, CefRefPtr child) override; + void OnWindowChanged(CefRefPtr view, bool added) override; void OnFocus(CefRefPtr view) override; void OnBlur(CefRefPtr view) override; }; diff --git a/libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.cc b/libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.cc index 47096167c..89d2e9c61 100644 --- a/libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.cc +++ b/libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=c4cdaa3fa15fb7559a199e37448fec7fe9d81711$ +// $hash=9ecd07954f90dc14ddf36072285c942f2ee8082f$ // #include "libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.h" @@ -242,6 +242,27 @@ void CefMenuButtonDelegateCToCpp::OnChildViewChanged(CefRefPtr view, CefViewCppToC::Wrap(child)); } +NO_SANITIZE("cfi-icall") +void CefMenuButtonDelegateCToCpp::OnWindowChanged(CefRefPtr view, + bool added) { + shutdown_checker::AssertNotShutdown(); + + cef_view_delegate_t* _struct = + reinterpret_cast(GetStruct()); + if (CEF_MEMBER_MISSING(_struct, on_window_changed)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: view; type: refptr_diff + DCHECK(view.get()); + if (!view.get()) + return; + + // Execute + _struct->on_window_changed(_struct, CefViewCppToC::Wrap(view), added); +} + NO_SANITIZE("cfi-icall") void CefMenuButtonDelegateCToCpp::OnFocus(CefRefPtr view) { shutdown_checker::AssertNotShutdown(); diff --git a/libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.h b/libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.h index c3f6b3bad..cfdf7c169 100644 --- a/libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.h +++ b/libcef_dll/ctocpp/views/menu_button_delegate_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=1bbd5144528b748527fb1ef3fe49e29e84a642de$ +// $hash=7836ec7b53349057b1d1d75c6ba8506620bed53d$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_MENU_BUTTON_DELEGATE_CTOCPP_H_ @@ -57,6 +57,7 @@ class CefMenuButtonDelegateCToCpp void OnChildViewChanged(CefRefPtr view, bool added, CefRefPtr child) override; + void OnWindowChanged(CefRefPtr view, bool added) override; void OnFocus(CefRefPtr view) override; void OnBlur(CefRefPtr view) override; }; diff --git a/libcef_dll/ctocpp/views/panel_delegate_ctocpp.cc b/libcef_dll/ctocpp/views/panel_delegate_ctocpp.cc index f14e1e56d..0553e5896 100644 --- a/libcef_dll/ctocpp/views/panel_delegate_ctocpp.cc +++ b/libcef_dll/ctocpp/views/panel_delegate_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=785b996793338a2ac1918b48d2046954c58a6237$ +// $hash=4bffffc0fe09523839a08109aef1e3de90f6e25c$ // #include "libcef_dll/ctocpp/views/panel_delegate_ctocpp.h" @@ -170,6 +170,27 @@ void CefPanelDelegateCToCpp::OnChildViewChanged(CefRefPtr view, CefViewCppToC::Wrap(child)); } +NO_SANITIZE("cfi-icall") +void CefPanelDelegateCToCpp::OnWindowChanged(CefRefPtr view, + bool added) { + shutdown_checker::AssertNotShutdown(); + + cef_view_delegate_t* _struct = + reinterpret_cast(GetStruct()); + if (CEF_MEMBER_MISSING(_struct, on_window_changed)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: view; type: refptr_diff + DCHECK(view.get()); + if (!view.get()) + return; + + // Execute + _struct->on_window_changed(_struct, CefViewCppToC::Wrap(view), added); +} + NO_SANITIZE("cfi-icall") void CefPanelDelegateCToCpp::OnFocus(CefRefPtr view) { shutdown_checker::AssertNotShutdown(); diff --git a/libcef_dll/ctocpp/views/panel_delegate_ctocpp.h b/libcef_dll/ctocpp/views/panel_delegate_ctocpp.h index 3c0050b21..5830b5edd 100644 --- a/libcef_dll/ctocpp/views/panel_delegate_ctocpp.h +++ b/libcef_dll/ctocpp/views/panel_delegate_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=88ff4d04d59ca5e3b5add12c0360750844f0263f$ +// $hash=d508126f22cba29931a4d53aecbdaaca7dd39b9d$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_PANEL_DELEGATE_CTOCPP_H_ @@ -47,6 +47,7 @@ class CefPanelDelegateCToCpp void OnChildViewChanged(CefRefPtr view, bool added, CefRefPtr child) override; + void OnWindowChanged(CefRefPtr view, bool added) override; void OnFocus(CefRefPtr view) override; void OnBlur(CefRefPtr view) override; }; diff --git a/libcef_dll/ctocpp/views/textfield_delegate_ctocpp.cc b/libcef_dll/ctocpp/views/textfield_delegate_ctocpp.cc index c12502bf8..d2d841a3d 100644 --- a/libcef_dll/ctocpp/views/textfield_delegate_ctocpp.cc +++ b/libcef_dll/ctocpp/views/textfield_delegate_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=042f9e7c31678915a88af146b06a34c842a8796f$ +// $hash=8582eda62f90bab166d04bb6a2f8783a98fabe15$ // #include "libcef_dll/ctocpp/views/textfield_delegate_ctocpp.h" @@ -215,6 +215,27 @@ void CefTextfieldDelegateCToCpp::OnChildViewChanged(CefRefPtr view, CefViewCppToC::Wrap(child)); } +NO_SANITIZE("cfi-icall") +void CefTextfieldDelegateCToCpp::OnWindowChanged(CefRefPtr view, + bool added) { + shutdown_checker::AssertNotShutdown(); + + cef_view_delegate_t* _struct = + reinterpret_cast(GetStruct()); + if (CEF_MEMBER_MISSING(_struct, on_window_changed)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: view; type: refptr_diff + DCHECK(view.get()); + if (!view.get()) + return; + + // Execute + _struct->on_window_changed(_struct, CefViewCppToC::Wrap(view), added); +} + NO_SANITIZE("cfi-icall") void CefTextfieldDelegateCToCpp::OnFocus(CefRefPtr view) { shutdown_checker::AssertNotShutdown(); diff --git a/libcef_dll/ctocpp/views/textfield_delegate_ctocpp.h b/libcef_dll/ctocpp/views/textfield_delegate_ctocpp.h index b26fd5d61..dd2af4586 100644 --- a/libcef_dll/ctocpp/views/textfield_delegate_ctocpp.h +++ b/libcef_dll/ctocpp/views/textfield_delegate_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=5e71b48999ec32b734dad95bfe8ce37e29a02537$ +// $hash=3a83b906a29ba302874b73804e457680d2b7251e$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_TEXTFIELD_DELEGATE_CTOCPP_H_ @@ -52,6 +52,7 @@ class CefTextfieldDelegateCToCpp void OnChildViewChanged(CefRefPtr view, bool added, CefRefPtr child) override; + void OnWindowChanged(CefRefPtr view, bool added) override; void OnFocus(CefRefPtr view) override; void OnBlur(CefRefPtr view) override; }; diff --git a/libcef_dll/ctocpp/views/view_delegate_ctocpp.cc b/libcef_dll/ctocpp/views/view_delegate_ctocpp.cc index 6c2ff8aca..a0351ab67 100644 --- a/libcef_dll/ctocpp/views/view_delegate_ctocpp.cc +++ b/libcef_dll/ctocpp/views/view_delegate_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=2d7b3c7d174f5669f039e25c93da73e6f29de471$ +// $hash=7a6d2ca91509c2e6c510d5c9585a74c2fe10499b$ // #include "libcef_dll/ctocpp/views/view_delegate_ctocpp.h" @@ -169,6 +169,26 @@ void CefViewDelegateCToCpp::OnChildViewChanged(CefRefPtr view, CefViewCppToC::Wrap(child)); } +NO_SANITIZE("cfi-icall") +void CefViewDelegateCToCpp::OnWindowChanged(CefRefPtr view, + bool added) { + shutdown_checker::AssertNotShutdown(); + + cef_view_delegate_t* _struct = GetStruct(); + if (CEF_MEMBER_MISSING(_struct, on_window_changed)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: view; type: refptr_diff + DCHECK(view.get()); + if (!view.get()) + return; + + // Execute + _struct->on_window_changed(_struct, CefViewCppToC::Wrap(view), added); +} + NO_SANITIZE("cfi-icall") void CefViewDelegateCToCpp::OnFocus(CefRefPtr view) { shutdown_checker::AssertNotShutdown(); diff --git a/libcef_dll/ctocpp/views/view_delegate_ctocpp.h b/libcef_dll/ctocpp/views/view_delegate_ctocpp.h index 85a828233..c1465a6ff 100644 --- a/libcef_dll/ctocpp/views/view_delegate_ctocpp.h +++ b/libcef_dll/ctocpp/views/view_delegate_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=ae050ad2368c8741e90ee0653f8bc6c6e1be4ad8$ +// $hash=f049a053042a00be15899439f324a376ee309dbb$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_VIEW_DELEGATE_CTOCPP_H_ @@ -46,6 +46,7 @@ class CefViewDelegateCToCpp : public CefCToCppRefCounted view, bool added, CefRefPtr child) override; + void OnWindowChanged(CefRefPtr view, bool added) override; void OnFocus(CefRefPtr view) override; void OnBlur(CefRefPtr view) override; }; diff --git a/libcef_dll/ctocpp/views/window_delegate_ctocpp.cc b/libcef_dll/ctocpp/views/window_delegate_ctocpp.cc index baf33ae36..6e724157e 100644 --- a/libcef_dll/ctocpp/views/window_delegate_ctocpp.cc +++ b/libcef_dll/ctocpp/views/window_delegate_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=c15191d56329def4089fb5d3944e2991b55876ca$ +// $hash=dda345b957ac58c71770da1cf4813ce16ea568b8$ // #include "libcef_dll/ctocpp/views/window_delegate_ctocpp.h" @@ -436,6 +436,27 @@ void CefWindowDelegateCToCpp::OnChildViewChanged(CefRefPtr view, CefViewCppToC::Wrap(child)); } +NO_SANITIZE("cfi-icall") +void CefWindowDelegateCToCpp::OnWindowChanged(CefRefPtr view, + bool added) { + shutdown_checker::AssertNotShutdown(); + + cef_view_delegate_t* _struct = + reinterpret_cast(GetStruct()); + if (CEF_MEMBER_MISSING(_struct, on_window_changed)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: view; type: refptr_diff + DCHECK(view.get()); + if (!view.get()) + return; + + // Execute + _struct->on_window_changed(_struct, CefViewCppToC::Wrap(view), added); +} + NO_SANITIZE("cfi-icall") void CefWindowDelegateCToCpp::OnFocus(CefRefPtr view) { shutdown_checker::AssertNotShutdown(); diff --git a/libcef_dll/ctocpp/views/window_delegate_ctocpp.h b/libcef_dll/ctocpp/views/window_delegate_ctocpp.h index 34f26dd31..5790e9a73 100644 --- a/libcef_dll/ctocpp/views/window_delegate_ctocpp.h +++ b/libcef_dll/ctocpp/views/window_delegate_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=22e538be2af31decaefcfc0b3e2879586530ad71$ +// $hash=4e5e470d6aa929b3b2d4286eb4bcdc90dba052dc$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_WINDOW_DELEGATE_CTOCPP_H_ @@ -65,6 +65,7 @@ class CefWindowDelegateCToCpp void OnChildViewChanged(CefRefPtr view, bool added, CefRefPtr child) override; + void OnWindowChanged(CefRefPtr view, bool added) override; void OnFocus(CefRefPtr view) override; void OnBlur(CefRefPtr view) override; }; diff --git a/patch/patches/chrome_browser_browser.patch b/patch/patches/chrome_browser_browser.patch index 53c277d73..b554d0f5c 100644 --- a/patch/patches/chrome_browser_browser.patch +++ b/patch/patches/chrome_browser_browser.patch @@ -200,7 +200,7 @@ index f225525e74eb..2f3d13b087b0 100644 void Browser::CloseFrame() { diff --git chrome/browser/ui/browser.h chrome/browser/ui/browser.h -index 3a0202c2139b..700de9a44461 100644 +index 3a0202c2139b..5b950c1146d0 100644 --- chrome/browser/ui/browser.h +++ chrome/browser/ui/browser.h @@ -22,6 +22,7 @@ @@ -234,7 +234,21 @@ index 3a0202c2139b..700de9a44461 100644 private: friend class Browser; friend class WindowSizerChromeOSTest; -@@ -403,6 +413,12 @@ class Browser : public TabStripModelObserver, +@@ -345,6 +355,13 @@ class Browser : public TabStripModelObserver, + + bool is_focus_mode() const { return is_focus_mode_; } + ++ // Return true if CEF will expose the toolbar to the client. This value is ++ // used to selectively enable toolbar behaviors such as command processing ++ // and omnibox focus without also including the toolbar in BrowserView layout ++ // calculations. ++ void set_toolbar_overridden(bool val) { toolbar_overridden_ = val; } ++ bool toolbar_overridden() const { return toolbar_overridden_; } ++ + // Accessors //////////////////////////////////////////////////////////////// + + const CreateParams& create_params() const { return create_params_; } +@@ -403,6 +420,12 @@ class Browser : public TabStripModelObserver, base::WeakPtr AsWeakPtr(); @@ -247,7 +261,7 @@ index 3a0202c2139b..700de9a44461 100644 // Get the FindBarController for this browser, creating it if it does not // yet exist. FindBarController* GetFindBarController(); -@@ -783,6 +799,11 @@ class Browser : public TabStripModelObserver, +@@ -783,6 +806,11 @@ class Browser : public TabStripModelObserver, void SetContentsBounds(content::WebContents* source, const gfx::Rect& bounds) override; void UpdateTargetURL(content::WebContents* source, const GURL& url) override; @@ -259,7 +273,16 @@ index 3a0202c2139b..700de9a44461 100644 void ContentsMouseEvent(content::WebContents* source, bool motion, bool exited) override; -@@ -1242,6 +1263,10 @@ class Browser : public TabStripModelObserver, +@@ -1182,6 +1210,8 @@ class Browser : public TabStripModelObserver, + const std::string initial_workspace_; + bool initial_visible_on_all_workspaces_state_; + ++ bool toolbar_overridden_ = false; ++ + // Tracks when this browser is being created by session restore. + bool is_session_restore_; + +@@ -1242,6 +1272,10 @@ class Browser : public TabStripModelObserver, extension_browser_window_helper_; #endif diff --git a/patch/patches/chrome_runtime_views.patch b/patch/patches/chrome_runtime_views.patch index 55fe0164d..12ac6e28f 100644 --- a/patch/patches/chrome_runtime_views.patch +++ b/patch/patches/chrome_runtime_views.patch @@ -1,3 +1,35 @@ +diff --git chrome/browser/ui/browser_command_controller.cc chrome/browser/ui/browser_command_controller.cc +index 8faaa9afc1e6..4dd8937fdc7b 100644 +--- chrome/browser/ui/browser_command_controller.cc ++++ chrome/browser/ui/browser_command_controller.cc +@@ -354,8 +354,10 @@ bool BrowserCommandController::ExecuteCommandWithDisposition( + // CommandUpdaterDelegate and CommandUpdater declare this function so we + // choose to not implement CommandUpdaterDelegate inside this class and + // therefore command_updater_ doesn't have the delegate set). +- if (!SupportsCommand(id) || !IsCommandEnabled(id)) ++ if (!SupportsCommand(id) || !IsCommandEnabled(id)) { ++ LOG(WARNING) << "Invalid/disabled command " << id; + return false; ++ } + + // No commands are enabled if there is not yet any selected tab. + // TODO(pkasting): It seems like we should not need this, because either +@@ -952,11 +954,13 @@ void BrowserCommandController::TabRestoreServiceLoaded( + // BrowserCommandController, private: + + bool BrowserCommandController::IsShowingMainUI() { +- return browser_->SupportsWindowFeature(Browser::FEATURE_TABSTRIP); ++ return browser_->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) || ++ browser_->toolbar_overridden(); + } + + bool BrowserCommandController::IsShowingLocationBar() { +- return browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR); ++ return browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR) || ++ browser_->toolbar_overridden(); + } + + void BrowserCommandController::InitCommandState() { diff --git chrome/browser/ui/views/frame/browser_frame.cc chrome/browser/ui/views/frame/browser_frame.cc index 7c0229c202ca..67320e907526 100644 --- chrome/browser/ui/views/frame/browser_frame.cc @@ -88,7 +120,7 @@ index 050c0e05e4e3..0bbcf4af9a92 100644 // Initialize the frame (creates the underlying native window). diff --git chrome/browser/ui/views/frame/browser_view.cc chrome/browser/ui/views/frame/browser_view.cc -index 7d93faeadd2c..9b10c7f86c5c 100644 +index 7d93faeadd2c..8208964c4a88 100644 --- chrome/browser/ui/views/frame/browser_view.cc +++ chrome/browser/ui/views/frame/browser_view.cc @@ -557,11 +557,22 @@ class BrowserView::AccessibilityModeObserver : public ui::AXModeObserver { @@ -123,7 +155,25 @@ index 7d93faeadd2c..9b10c7f86c5c 100644 // Top container holds tab strip region and toolbar and lives at the front of // the view hierarchy. -@@ -1368,6 +1378,8 @@ bool BrowserView::ShouldHideUIForFullscreen() const { +@@ -619,8 +629,15 @@ BrowserView::BrowserView(std::unique_ptr browser) + contents_container->SetLayoutManager(std::make_unique( + devtools_web_view_, contents_web_view_)); + +- toolbar_ = top_container_->AddChildView( +- std::make_unique(browser_.get(), this)); ++ toolbar_ = OverrideCreateToolbar(browser_.get(), this); ++ if (!toolbar_) { ++ toolbar_ = new ToolbarView(browser_.get(), this, base::nullopt); ++ } else { ++ browser_->set_toolbar_overridden(true); ++ // Update state that depends on the above flag. ++ browser_->command_controller()->FullscreenStateChanged(); ++ } ++ top_container_->AddChildView(base::WrapUnique(toolbar_)); + + contents_separator_ = + top_container_->AddChildView(std::make_unique()); +@@ -1368,6 +1385,8 @@ bool BrowserView::ShouldHideUIForFullscreen() const { if (immersive_mode_controller_->IsEnabled()) return false; @@ -132,7 +182,7 @@ index 7d93faeadd2c..9b10c7f86c5c 100644 return frame_->GetFrameView()->ShouldHideTopUIForFullscreen(); } -@@ -2393,7 +2405,8 @@ BrowserView::GetNativeViewHostsForTopControlsSlide() const { +@@ -2393,7 +2412,8 @@ BrowserView::GetNativeViewHostsForTopControlsSlide() const { } void BrowserView::ReparentTopContainerForEndOfImmersive() { @@ -142,19 +192,40 @@ index 7d93faeadd2c..9b10c7f86c5c 100644 top_container()->DestroyLayer(); AddChildViewAt(top_container(), 0); EnsureFocusOrder(); -@@ -2841,7 +2854,8 @@ void BrowserView::Layout() { +@@ -2840,8 +2860,10 @@ void BrowserView::Layout() { + // TODO(jamescook): Why was this in the middle of layout code? toolbar_->location_bar()->omnibox_view()->SetFocusBehavior( - IsToolbarVisible() ? FocusBehavior::ALWAYS : FocusBehavior::NEVER); +- IsToolbarVisible() ? FocusBehavior::ALWAYS : FocusBehavior::NEVER); - frame()->GetFrameView()->UpdateMinimumSize(); ++ (IsToolbarVisible() || browser_->toolbar_overridden()) ? ++ FocusBehavior::ALWAYS : FocusBehavior::NEVER); + if (frame()->GetFrameView()) + frame()->GetFrameView()->UpdateMinimumSize(); // Some of the situations when the BrowserView is laid out are: // - Enter/exit immersive fullscreen mode. -@@ -2944,7 +2958,8 @@ void BrowserView::AddedToWidget() { - SetToolbarButtonProvider(toolbar_); +@@ -2898,6 +2920,11 @@ void BrowserView::AddedToWidget() { + SetThemeProfileForWindow(GetNativeWindow(), browser_->profile()); + #endif ++ // This browser view may already have a custom button provider set (e.g the ++ // hosted app frame). ++ if (!toolbar_button_provider_) ++ SetToolbarButtonProvider(toolbar_); ++ + toolbar_->Init(); + + #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +@@ -2938,13 +2965,9 @@ void BrowserView::AddedToWidget() { + + EnsureFocusOrder(); + +- // This browser view may already have a custom button provider set (e.g the +- // hosted app frame). +- if (!toolbar_button_provider_) +- SetToolbarButtonProvider(toolbar_); +- frame_->OnBrowserViewInitViewsComplete(); - frame_->GetFrameView()->UpdateMinimumSize(); + if (frame_->GetFrameView()) @@ -163,7 +234,7 @@ index 7d93faeadd2c..9b10c7f86c5c 100644 MaybeInitializeWebUITabStrip(); diff --git chrome/browser/ui/views/frame/browser_view.h chrome/browser/ui/views/frame/browser_view.h -index e4955ccbb929..e678754ee361 100644 +index e4955ccbb929..51a4133ba8d1 100644 --- chrome/browser/ui/views/frame/browser_view.h +++ chrome/browser/ui/views/frame/browser_view.h @@ -114,7 +114,9 @@ class BrowserView : public BrowserWindow, @@ -176,6 +247,36 @@ index e4955ccbb929..e678754ee361 100644 BrowserView(const BrowserView&) = delete; BrowserView& operator=(const BrowserView&) = delete; ~BrowserView() override; +@@ -617,6 +619,12 @@ class BrowserView : public BrowserWindow, + return accessibility_focus_highlight_.get(); + } + ++ protected: ++ virtual ToolbarView* OverrideCreateToolbar(Browser* browser, ++ BrowserView* browser_view) { ++ return nullptr; ++ } ++ + private: + // Do not friend BrowserViewLayout. Use the BrowserViewLayoutDelegate + // interface to keep these two classes decoupled and testable. +diff --git chrome/browser/ui/views/frame/browser_view_layout.cc chrome/browser/ui/views/frame/browser_view_layout.cc +index 1f790b4d87da..782d132ccac2 100644 +--- chrome/browser/ui/views/frame/browser_view_layout.cc ++++ chrome/browser/ui/views/frame/browser_view_layout.cc +@@ -402,6 +402,12 @@ int BrowserViewLayout::LayoutWebUITabStrip(int top) { + + int BrowserViewLayout::LayoutToolbar(int top) { + TRACE_EVENT0("ui", "BrowserViewLayout::LayoutToolbar"); ++ if (toolbar_->parent() && toolbar_->parent()->GetLayoutManager() != this && ++ toolbar_->parent()->GetLayoutManager() != nullptr) { ++ // CEF may take ownership of the toolbar. Early exit to avoid the DCHECK ++ // in LayoutManager::SetViewVisibility(). ++ return top; ++ } + int browser_view_width = vertical_layout_rect_.width(); + bool toolbar_visible = delegate_->IsToolbarVisible(); + int height = toolbar_visible ? toolbar_->GetPreferredSize().height() : 0; diff --git chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc index 975817e079eb..f77c24d294bc 100644 --- chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc @@ -234,3 +335,46 @@ index 975817e079eb..f77c24d294bc 100644 return GetFrameView()->GetCustomBackgroundId(active_state); } +diff --git chrome/browser/ui/views/toolbar/toolbar_view.cc chrome/browser/ui/views/toolbar/toolbar_view.cc +index 54ba2047729f..b288d841f7eb 100644 +--- chrome/browser/ui/views/toolbar/toolbar_view.cc ++++ chrome/browser/ui/views/toolbar/toolbar_view.cc +@@ -150,12 +150,13 @@ auto& GetViewCommandMap() { + //////////////////////////////////////////////////////////////////////////////// + // ToolbarView, public: + +-ToolbarView::ToolbarView(Browser* browser, BrowserView* browser_view) ++ToolbarView::ToolbarView(Browser* browser, BrowserView* browser_view, ++ base::Optional display_mode) + : AnimationDelegateViews(this), + browser_(browser), + browser_view_(browser_view), + app_menu_icon_controller_(browser->profile(), this), +- display_mode_(GetDisplayMode(browser)) { ++ display_mode_(display_mode ? *display_mode : GetDisplayMode(browser)) { + SetID(VIEW_ID_TOOLBAR); + + UpgradeDetector::GetInstance()->AddObserver(this); +@@ -181,7 +182,7 @@ ToolbarView::~ToolbarView() { + void ToolbarView::Init() { + auto location_bar = std::make_unique( + browser_, browser_->profile(), browser_->command_controller(), this, +- display_mode_ != DisplayMode::NORMAL); ++ display_mode_ != DisplayMode::NORMAL && !browser_->toolbar_overridden()); + // Make sure the toolbar shows by default. + size_animation_.Reset(1); + +diff --git chrome/browser/ui/views/toolbar/toolbar_view.h chrome/browser/ui/views/toolbar/toolbar_view.h +index 0b3492e04542..81e819582cb6 100644 +--- chrome/browser/ui/views/toolbar/toolbar_view.h ++++ chrome/browser/ui/views/toolbar/toolbar_view.h +@@ -88,7 +88,8 @@ class ToolbarView : public views::AccessiblePaneView, + // needs to be displayed. + }; + +- ToolbarView(Browser* browser, BrowserView* browser_view); ++ ToolbarView(Browser* browser, BrowserView* browser_view, ++ base::Optional display_mode); + ToolbarView(const ToolbarView&) = delete; + ToolbarView& operator=(const ToolbarView&) = delete; + ~ToolbarView() override; diff --git a/tests/cefclient/browser/views_window.cc b/tests/cefclient/browser/views_window.cc index 1aac4d1b8..dce5a653c 100644 --- a/tests/cefclient/browser/views_window.cc +++ b/tests/cefclient/browser/views_window.cc @@ -11,6 +11,7 @@ #include "include/cef_app.h" #include "include/views/cef_box_layout.h" #include "include/wrapper/cef_helpers.h" +#include "tests/cefclient/browser/main_context.h" #include "tests/cefclient/browser/resource.h" #include "tests/cefclient/browser/views_style.h" #include "tests/shared/browser/extension_util.h" @@ -235,7 +236,7 @@ void ViewsWindow::SetLoadingState(bool isLoading, bool canGoBack, bool canGoForward) { CEF_REQUIRE_UI_THREAD(); - if (!window_ || !with_controls_) + if (!window_ || !with_controls_ || chrome_toolbar_type_ == CEF_CTT_NORMAL) return; EnableView(ID_BACK_BUTTON, canGoBack); @@ -274,8 +275,12 @@ void ViewsWindow::TakeFocus(bool next) { if (!window_ || !with_controls_) return; - // Give focus to the URL textfield. - window_->GetViewForID(ID_URL_TEXTFIELD)->RequestFocus(); + if (chrome_toolbar_type_ == CEF_CTT_NORMAL) { + top_toolbar_->RequestFocus(); + } else { + // Give focus to the URL textfield. + location_->RequestFocus(); + } } void ViewsWindow::OnBeforeContextMenu(CefRefPtr model) { @@ -362,6 +367,10 @@ bool ViewsWindow::OnPopupBrowserViewCreated( return true; } +CefBrowserViewDelegate::ChromeToolbarType ViewsWindow::GetChromeToolbarType() { + return chrome_toolbar_type_; +} + void ViewsWindow::OnButtonPressed(CefRefPtr button) { CEF_REQUIRE_UI_THREAD(); DCHECK(with_controls_); @@ -665,6 +674,120 @@ void ViewsWindow::OnBlur(CefRefPtr view) { } } +void ViewsWindow::OnWindowChanged(CefRefPtr view, bool added) { + if (!with_controls_ || !added) + return; + + const int view_id = view->GetID(); + if (view_id != ID_BROWSER_VIEW) + return; + + // Build the remainder of the UI now that the BrowserView has been added to + // the CefWindow. This is a requirement to use Chrome toolbars. + + CefRefPtr top_menu_panel; + if (top_menu_bar_) + top_menu_panel = top_menu_bar_->GetMenuPanel(); + + LabelButtons browse_buttons; + CefRefPtr menu_button; + + if (chrome_toolbar_type_ == CEF_CTT_NORMAL) { + // Chrome will provide a normal toolbar with location, menu, etc. + top_toolbar_ = browser_view_->GetChromeToolbar(); + DCHECK(top_toolbar_); + } + + if (!top_toolbar_) { + // Create the browse buttons. + browse_buttons.push_back(CreateBrowseButton("Back", ID_BACK_BUTTON)); + browse_buttons.push_back(CreateBrowseButton("Forward", ID_FORWARD_BUTTON)); + browse_buttons.push_back(CreateBrowseButton("Reload", ID_RELOAD_BUTTON)); + browse_buttons.push_back(CreateBrowseButton("Stop", ID_STOP_BUTTON)); + + if (chrome_toolbar_type_ == CEF_CTT_LOCATION) { + // Chrome will provide a minimal location bar. + location_ = browser_view_->GetChromeToolbar(); + DCHECK(location_); + } + if (!location_) { + // Create the URL textfield. + CefRefPtr url_textfield = + CefTextfield::CreateTextfield(this); + url_textfield->SetID(ID_URL_TEXTFIELD); + url_textfield->SetEnabled(false); // Disabled by default. + views_style::ApplyTo(url_textfield); + location_ = url_textfield; + } + + // Create the menu button. + menu_button = CefMenuButton::CreateMenuButton(this, CefString()); + menu_button->SetID(ID_MENU_BUTTON); + menu_button->SetImage( + CEF_BUTTON_STATE_NORMAL, + delegate_->GetImageCache()->GetCachedImage("menu_icon")); + views_style::ApplyTo(menu_button.get()); + menu_button->SetInkDropEnabled(true); + // Override the default minimum size. + menu_button->SetMinimumSize(CefSize(0, 0)); + + // Create the top panel. + CefRefPtr top_panel = CefPanel::CreatePanel(nullptr); + + // Use a horizontal box layout for |top_panel|. + CefBoxLayoutSettings top_panel_layout_settings; + top_panel_layout_settings.horizontal = true; + CefRefPtr top_panel_layout = + top_panel->SetToBoxLayout(top_panel_layout_settings); + + // Add the buttons and URL textfield to |top_panel|. + for (size_t i = 0U; i < browse_buttons.size(); ++i) + top_panel->AddChildView(browse_buttons[i]); + top_panel->AddChildView(location_); + + UpdateExtensionControls(); + DCHECK(extensions_panel_); + top_panel->AddChildView(extensions_panel_); + + top_panel->AddChildView(menu_button); + views_style::ApplyTo(top_panel); + + // Allow |location| to grow and fill any remaining space. + top_panel_layout->SetFlexForView(location_, 1); + + top_toolbar_ = top_panel; + } + + // Add the top panel and browser view to |window|. + int top_index = 0; + if (top_menu_panel) + window_->AddChildViewAt(top_menu_panel, top_index++); + window_->AddChildViewAt(top_toolbar_, top_index); + + // Lay out |window| so we can get the default button sizes. + window_->Layout(); + + int min_width = 200; + if (!browse_buttons.empty()) { + // Make all browse buttons the same size. + MakeButtonsSameSize(browse_buttons); + + // Lay out |window| again with the new button sizes. + window_->Layout(); + + // Minimum window width is the size of all buttons plus some extra. + min_width = browse_buttons[0]->GetBounds().width * 4 + + menu_button->GetBounds().width + 100; + } + + // Minimum window height is the hight of the top toolbar plus some extra. + int min_height = top_toolbar_->GetBounds().height + 100; + if (top_menu_panel) + min_height += top_menu_panel->GetBounds().height; + + minimum_window_size_ = CefSize(min_width, min_height); +} + void ViewsWindow::MenuBarExecuteCommand(CefRefPtr menu_model, int command_id, cef_event_flags_t event_flags) { @@ -686,6 +809,20 @@ ViewsWindow::ViewsWindow(Delegate* delegate, frameless_ = command_line->HasSwitch(switches::kHideFrame) || delegate_->WithExtension(); + if (MainContext::Get()->UseChromeRuntime()) { + const std::string& toolbar_type = + command_line->GetSwitchValue(switches::kShowChromeToolbar); + if (toolbar_type == "none") { + chrome_toolbar_type_ = CEF_CTT_NONE; + } else if (toolbar_type == "location") { + chrome_toolbar_type_ = CEF_CTT_LOCATION; + } else { + chrome_toolbar_type_ = CEF_CTT_NORMAL; + } + } else { + chrome_toolbar_type_ = CEF_CTT_NONE; + } + #if !defined(OS_MAC) // On Mac we don't show a top menu on the window. The options are available in // the app menu instead. @@ -736,59 +873,6 @@ void ViewsWindow::AddControls() { // Create the MenuModel that will be displayed via the menu button. CreateMenuModel(); - CefRefPtr top_menu_panel; - if (top_menu_bar_) - top_menu_panel = top_menu_bar_->GetMenuPanel(); - - // Create the browse buttons. - LabelButtons browse_buttons; - browse_buttons.push_back(CreateBrowseButton("Back", ID_BACK_BUTTON)); - browse_buttons.push_back(CreateBrowseButton("Forward", ID_FORWARD_BUTTON)); - browse_buttons.push_back(CreateBrowseButton("Reload", ID_RELOAD_BUTTON)); - browse_buttons.push_back(CreateBrowseButton("Stop", ID_STOP_BUTTON)); - - // Create the URL textfield. - CefRefPtr url_textfield = CefTextfield::CreateTextfield(this); - url_textfield->SetID(ID_URL_TEXTFIELD); - url_textfield->SetEnabled(false); // Disabled by default. - views_style::ApplyTo(url_textfield); - - // Create the menu button. - CefRefPtr menu_button = - CefMenuButton::CreateMenuButton(this, CefString()); - menu_button->SetID(ID_MENU_BUTTON); - menu_button->SetImage( - CEF_BUTTON_STATE_NORMAL, - delegate_->GetImageCache()->GetCachedImage("menu_icon")); - views_style::ApplyTo(menu_button.get()); - menu_button->SetInkDropEnabled(true); - // Override the default minimum size. - menu_button->SetMinimumSize(CefSize(0, 0)); - - // Create the top panel. - CefRefPtr top_panel = CefPanel::CreatePanel(nullptr); - - // Use a horizontal box layout for |top_panel|. - CefBoxLayoutSettings top_panel_layout_settings; - top_panel_layout_settings.horizontal = true; - CefRefPtr top_panel_layout = - top_panel->SetToBoxLayout(top_panel_layout_settings); - - // Add the buttons and URL textfield to |top_panel|. - for (size_t i = 0U; i < browse_buttons.size(); ++i) - top_panel->AddChildView(browse_buttons[i]); - top_panel->AddChildView(url_textfield); - - UpdateExtensionControls(); - DCHECK(extensions_panel_); - top_panel->AddChildView(extensions_panel_); - - top_panel->AddChildView(menu_button); - views_style::ApplyTo(top_panel); - - // Allow |url_textfield| to grow and fill any remaining space. - top_panel_layout->SetFlexForView(url_textfield, 1); - // Use a vertical box layout for |window|. CefBoxLayoutSettings window_layout_settings; window_layout_settings.horizontal = false; @@ -796,33 +880,14 @@ void ViewsWindow::AddControls() { CefRefPtr window_layout = window_->SetToBoxLayout(window_layout_settings); - // Add the top panel and browser view to |window|. - if (top_menu_panel) - window_->AddChildView(top_menu_panel); - window_->AddChildView(top_panel); window_->AddChildView(browser_view_); // Allow |browser_view_| to grow and fill any remaining space. window_layout->SetFlexForView(browser_view_, 1); - // Lay out |window| so we can get the default button sizes. - window_->Layout(); - - // Make all browse buttons the same size. - MakeButtonsSameSize(browse_buttons); - - // Lay out |window| again with the new button sizes. - window_->Layout(); - - // Minimum window width is the size of all buttons plus some extra. - const int min_width = browse_buttons[0]->GetBounds().width * 4 + - menu_button->GetBounds().width + 100; - // Minimum window height is the hight of the top toolbar plus some extra. - int min_height = top_panel->GetBounds().height + 100; - if (top_menu_panel) - min_height += top_menu_panel->GetBounds().height; - - minimum_window_size_ = CefSize(min_width, min_height); + // Remaining setup will be performed in OnWindowChanged after the BrowserView + // is added to the CefWindow. This is necessary because Chrome toolbars are + // only available after the BrowserView is added. } void ViewsWindow::AddAccelerators() { @@ -864,12 +929,10 @@ void ViewsWindow::ShowTopControls(bool show) { if (!window_ || !with_controls_) return; - // Change the visibility of the panel that contains the buttons. - CefRefPtr parent_view = - window_->GetViewForID(ID_BACK_BUTTON)->GetParentView(); - if (parent_view->IsVisible() != show) { - parent_view->SetVisible(show); - parent_view->InvalidateLayout(); + // Change the visibility of the top toolbar. + if (top_toolbar_->IsVisible() != show) { + top_toolbar_->SetVisible(show); + top_toolbar_->InvalidateLayout(); } } diff --git a/tests/cefclient/browser/views_window.h b/tests/cefclient/browser/views_window.h index 62739acb5..da94f0c8a 100644 --- a/tests/cefclient/browser/views_window.h +++ b/tests/cefclient/browser/views_window.h @@ -128,6 +128,7 @@ class ViewsWindow : public CefBrowserViewDelegate, bool OnPopupBrowserViewCreated(CefRefPtr browser_view, CefRefPtr popup_browser_view, bool is_devtools) OVERRIDE; + ChromeToolbarType GetChromeToolbarType() override; // CefButtonDelegate methods: void OnButtonPressed(CefRefPtr button) OVERRIDE; @@ -164,6 +165,7 @@ class ViewsWindow : public CefBrowserViewDelegate, CefSize GetMinimumSize(CefRefPtr view) OVERRIDE; void OnFocus(CefRefPtr view) OVERRIDE; void OnBlur(CefRefPtr view) OVERRIDE; + void OnWindowChanged(CefRefPtr view, bool added) OVERRIDE; // ViewsMenuBar::Delegate methods: void MenuBarExecuteCommand(CefRefPtr menu_model, @@ -208,10 +210,13 @@ class ViewsWindow : public CefBrowserViewDelegate, CefRefPtr browser_view_; bool frameless_; bool with_controls_; + ChromeToolbarType chrome_toolbar_type_; CefRefPtr window_; CefRefPtr button_menu_model_; CefRefPtr top_menu_bar_; + CefRefPtr top_toolbar_; + CefRefPtr location_; bool menu_has_focus_; int last_focused_view_; diff --git a/tests/shared/common/client_switches.cc b/tests/shared/common/client_switches.cc index 81d6b70fd..f87a6d9a1 100644 --- a/tests/shared/common/client_switches.cc +++ b/tests/shared/common/client_switches.cc @@ -45,6 +45,7 @@ const char kCRLSetsPath[] = "crl-sets-path"; const char kLoadExtension[] = "load-extension"; const char kNoActivate[] = "no-activate"; const char kEnableChromeRuntime[] = "enable-chrome-runtime"; +const char kShowChromeToolbar[] = "show-chrome-toolbar"; } // namespace switches } // namespace client diff --git a/tests/shared/common/client_switches.h b/tests/shared/common/client_switches.h index c1332e307..6e4fbc68d 100644 --- a/tests/shared/common/client_switches.h +++ b/tests/shared/common/client_switches.h @@ -39,6 +39,7 @@ extern const char kCRLSetsPath[]; extern const char kLoadExtension[]; extern const char kNoActivate[]; extern const char kEnableChromeRuntime[]; +extern const char kShowChromeToolbar[]; } // namespace switches } // namespace client