diff --git a/include/cef_api_hash.h b/include/cef_api_hash.h index b418ac8a0..7adb5095e 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 "2aa3d374f5c27a433acba25d772b3a67fb1c528a" +#define CEF_API_HASH_UNIVERSAL "5065a3791a6b09aac128efd3131b77ac38a4257a" #if defined(OS_WIN) -#define CEF_API_HASH_PLATFORM "acdae91db336230e00c4e8863236fd479576249f" +#define CEF_API_HASH_PLATFORM "6402341997737ba956460d92af756a3b9e59d0f0" #elif defined(OS_MAC) -#define CEF_API_HASH_PLATFORM "6cdb410709486a7e78bf5876e9ca4a79e4553a30" +#define CEF_API_HASH_PLATFORM "cd4c53d8024e52d2041de8a49db69c69edd8e62b" #elif defined(OS_LINUX) -#define CEF_API_HASH_PLATFORM "3b89d9dab5020373d90525066de3166d0b949f25" +#define CEF_API_HASH_PLATFORM "bd498b3ef328a60a11eae6871a13b7c517e583f1" #endif #ifdef __cplusplus diff --git a/include/internal/cef_types.h b/include/internal/cef_types.h index bae35154d..7a3b68692 100644 --- a/include/internal/cef_types.h +++ b/include/internal/cef_types.h @@ -520,7 +520,7 @@ typedef struct _cef_browser_settings_t { /// int windowless_frame_rate; - // The below values map to WebPreferences settings. + // BEGIN values that map to WebPreferences settings. /// // Font settings. @@ -622,6 +622,8 @@ typedef struct _cef_browser_settings_t { /// cef_state_t webgl; + // END values that map to WebPreferences settings. + /// // Background color used for the browser before a document is loaded and when // no document color is specified. The alpha component must be either fully @@ -641,6 +643,13 @@ typedef struct _cef_browser_settings_t { // empty then "en-US,en" will be used. /// cef_string_t accept_language_list; + + /// + // Controls whether the Chrome status bubble will be used. Only supported with + // the Chrome runtime. For details about the status bubble see + // https://www.chromium.org/user-experience/status-bubble/ + /// + cef_state_t chrome_status_bubble; } cef_browser_settings_t; /// diff --git a/include/internal/cef_types_wrappers.h b/include/internal/cef_types_wrappers.h index 09df6f556..89c90a023 100644 --- a/include/internal/cef_types_wrappers.h +++ b/include/internal/cef_types_wrappers.h @@ -718,6 +718,8 @@ struct CefBrowserSettingsTraits { cef_string_set(src->accept_language_list.str, src->accept_language_list.length, &target->accept_language_list, copy); + + target->chrome_status_bubble = src->chrome_status_bubble; } }; diff --git a/libcef/browser/chrome/browser_delegate.h b/libcef/browser/chrome/browser_delegate.h index c0b565ef7..5f738b390 100644 --- a/libcef/browser/chrome/browser_delegate.h +++ b/libcef/browser/chrome/browser_delegate.h @@ -41,6 +41,12 @@ class BrowserDelegate : public content::WebContentsDelegate { // Add or remove ownership of the WebContents. virtual void SetAsDelegate(content::WebContents* web_contents, bool set_delegate) = 0; + + // Return true to show the status bubble. This should consistently return the + // same value for the lifespan of a Browser. + virtual bool ShowStatusBubble(bool show_by_default) { + return show_by_default; + } }; } // namespace cef diff --git a/libcef/browser/chrome/chrome_browser_delegate.cc b/libcef/browser/chrome/chrome_browser_delegate.cc index 35c407806..bd3406446 100644 --- a/libcef/browser/chrome/chrome_browser_delegate.cc +++ b/libcef/browser/chrome/chrome_browser_delegate.cc @@ -72,6 +72,22 @@ void ChromeBrowserDelegate::SetAsDelegate(content::WebContents* web_contents, request_context_impl); } +bool ChromeBrowserDelegate::ShowStatusBubble(bool show_by_default) { + if (!show_status_bubble_.has_value()) { + show_status_bubble_ = show_by_default; + if (auto browser = ChromeBrowserHostImpl::GetBrowserForBrowser(browser_)) { + const auto& state = browser->settings().chrome_status_bubble; + if (show_by_default && state == STATE_DISABLED) { + show_status_bubble_ = false; + } else if (!show_by_default && state == STATE_ENABLED) { + show_status_bubble_ = true; + } + } + } + + return *show_status_bubble_; +} + void ChromeBrowserDelegate::WebContentsCreated( content::WebContents* source_contents, int opener_render_process_id, diff --git a/libcef/browser/chrome/chrome_browser_delegate.h b/libcef/browser/chrome/chrome_browser_delegate.h index 38925d3ce..25a450174 100644 --- a/libcef/browser/chrome/chrome_browser_delegate.h +++ b/libcef/browser/chrome/chrome_browser_delegate.h @@ -51,6 +51,7 @@ class ChromeBrowserDelegate : public cef::BrowserDelegate { void OnWebContentsCreated(content::WebContents* new_contents) override; void SetAsDelegate(content::WebContents* web_contents, bool set_delegate) override; + bool ShowStatusBubble(bool show_by_default) override; // WebContentsDelegate methods: void WebContentsCreated(content::WebContents* source_contents, @@ -109,6 +110,8 @@ class ChromeBrowserDelegate : public cef::BrowserDelegate { // Used when creating a new browser host. const CefBrowserCreateParams create_params_; + + absl::optional show_status_bubble_; }; #endif // CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_DELEGATE_H_ diff --git a/libcef/browser/chrome/chrome_browser_host_impl.cc b/libcef/browser/chrome/chrome_browser_host_impl.cc index e0383d190..de89cdab3 100644 --- a/libcef/browser/chrome/chrome_browser_host_impl.cc +++ b/libcef/browser/chrome/chrome_browser_host_impl.cc @@ -91,6 +91,14 @@ CefRefPtr ChromeBrowserHostImpl::GetBrowserForGlobalId( return static_cast(browser.get()); } +// static +CefRefPtr ChromeBrowserHostImpl::GetBrowserForBrowser( + const Browser* browser) { + REQUIRE_CHROME_RUNTIME(); + return GetBrowserForContents( + browser->tab_strip_model()->GetActiveWebContents()); +} + ChromeBrowserHostImpl::~ChromeBrowserHostImpl() = default; void ChromeBrowserHostImpl::AddNewContents( diff --git a/libcef/browser/chrome/chrome_browser_host_impl.h b/libcef/browser/chrome/chrome_browser_host_impl.h index a39795e57..a8c39834d 100644 --- a/libcef/browser/chrome/chrome_browser_host_impl.h +++ b/libcef/browser/chrome/chrome_browser_host_impl.h @@ -47,6 +47,9 @@ class ChromeBrowserHostImpl : public CefBrowserHostBase { // Returns the browser associated with the specified global ID. static CefRefPtr GetBrowserForGlobalId( const content::GlobalRenderFrameHostId& global_id); + // Returns the browser associated with the specified Browser. + static CefRefPtr GetBrowserForBrowser( + const Browser* browser); ~ChromeBrowserHostImpl() override; diff --git a/patch/patches/chrome_browser_browser.patch b/patch/patches/chrome_browser_browser.patch index f0aa8c3be..03624a143 100644 --- a/patch/patches/chrome_browser_browser.patch +++ b/patch/patches/chrome_browser_browser.patch @@ -13,10 +13,10 @@ index 9e534ff1683f1..de406f5879be0 100644 return false; } diff --git chrome/browser/ui/browser.cc chrome/browser/ui/browser.cc -index 04e327d970b87..0b808a691eb49 100644 +index 04e327d970b87..6bd83131116d9 100644 --- chrome/browser/ui/browser.cc +++ chrome/browser/ui/browser.cc -@@ -262,6 +262,20 @@ +@@ -262,6 +262,25 @@ #include "components/captive_portal/content/captive_portal_tab_helper.h" #endif @@ -29,15 +29,20 @@ index 04e327d970b87..0b808a691eb49 100644 + if (cef_browser_delegate_) { \ + return cef_browser_delegate_->name(__VA_ARGS__); \ + } ++#define CALL_CEF_DELEGATE_RESULT(name, result, ...) \ ++ if (cef_browser_delegate_) { \ ++ result = cef_browser_delegate_->name(__VA_ARGS__); \ ++ } +#else // !BUILDFLAG(ENABLE_CEF) +#define CALL_CEF_DELEGATE(name, ...) +#define CALL_CEF_DELEGATE_RETURN(name, ...) ++#define CALL_CEF_DELEGATE_RESULT(name, result, ...) +#endif + #if BUILDFLAG(ENABLE_EXTENSIONS) #include "chrome/browser/extensions/extension_browser_window_helper.h" #endif -@@ -504,6 +518,13 @@ Browser::Browser(const CreateParams& params) +@@ -504,6 +523,13 @@ Browser::Browser(const CreateParams& params) tab_strip_model_->AddObserver(this); @@ -51,7 +56,7 @@ index 04e327d970b87..0b808a691eb49 100644 location_bar_model_ = std::make_unique( location_bar_model_delegate_.get(), content::kMaxURLDisplayChars); -@@ -1327,6 +1348,14 @@ content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent( +@@ -1327,6 +1353,14 @@ content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent( if (exclusive_access_manager_->HandleUserKeyEvent(event)) return content::KeyboardEventProcessingResult::HANDLED; @@ -66,7 +71,7 @@ index 04e327d970b87..0b808a691eb49 100644 return window()->PreHandleKeyboardEvent(event); } -@@ -1334,8 +1363,18 @@ bool Browser::HandleKeyboardEvent(content::WebContents* source, +@@ -1334,8 +1368,18 @@ bool Browser::HandleKeyboardEvent(content::WebContents* source, const NativeWebKeyboardEvent& event) { DevToolsWindow* devtools_window = DevToolsWindow::GetInstanceForInspectedWebContents(source); @@ -87,7 +92,7 @@ index 04e327d970b87..0b808a691eb49 100644 } bool Browser::TabsNeedBeforeUnloadFired() { -@@ -1540,6 +1579,14 @@ WebContents* Browser::OpenURLFromTab(WebContents* source, +@@ -1540,6 +1584,14 @@ WebContents* Browser::OpenURLFromTab(WebContents* source, return window->OpenURLFromTab(source, params); } @@ -102,7 +107,7 @@ index 04e327d970b87..0b808a691eb49 100644 NavigateParams nav_params(this, params.url, params.transition); nav_params.FillNavigateParamsFromOpenURLParams(params); nav_params.source_contents = source; -@@ -1639,6 +1686,15 @@ void Browser::AddNewContents(WebContents* source, +@@ -1639,6 +1691,15 @@ void Browser::AddNewContents(WebContents* source, source, disposition); } @@ -118,7 +123,7 @@ index 04e327d970b87..0b808a691eb49 100644 chrome::AddWebContents(this, source, std::move(new_contents), target_url, disposition, initial_rect); } -@@ -1657,6 +1713,8 @@ void Browser::LoadingStateChanged(WebContents* source, +@@ -1657,6 +1718,8 @@ void Browser::LoadingStateChanged(WebContents* source, bool should_show_loading_ui) { ScheduleUIUpdate(source, content::INVALIDATE_TYPE_LOAD); UpdateWindowForLoadingStateChanged(source, should_show_loading_ui); @@ -127,7 +132,7 @@ index 04e327d970b87..0b808a691eb49 100644 } void Browser::CloseContents(WebContents* source) { -@@ -1684,6 +1742,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) { +@@ -1684,6 +1747,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) { } void Browser::UpdateTargetURL(WebContents* source, const GURL& url) { @@ -136,7 +141,7 @@ index 04e327d970b87..0b808a691eb49 100644 if (!GetStatusBubble()) return; -@@ -1691,6 +1751,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) { +@@ -1691,6 +1756,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) { GetStatusBubble()->SetURL(url); } @@ -154,7 +159,7 @@ index 04e327d970b87..0b808a691eb49 100644 void Browser::ContentsMouseEvent(WebContents* source, bool motion, bool exited) { -@@ -1807,6 +1878,10 @@ void Browser::WebContentsCreated(WebContents* source_contents, +@@ -1807,6 +1883,10 @@ void Browser::WebContentsCreated(WebContents* source_contents, // Make the tab show up in the task manager. task_manager::WebContentsTags::CreateForTabContents(new_contents); @@ -165,7 +170,7 @@ index 04e327d970b87..0b808a691eb49 100644 } void Browser::PortalWebContentsCreated(WebContents* portal_web_contents) { -@@ -1851,6 +1926,8 @@ void Browser::RendererResponsive( +@@ -1851,6 +1931,8 @@ void Browser::RendererResponsive( void Browser::DidNavigatePrimaryMainFramePostCommit(WebContents* web_contents) { if (web_contents == tab_strip_model_->GetActiveWebContents()) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); @@ -174,7 +179,7 @@ index 04e327d970b87..0b808a691eb49 100644 } content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager( -@@ -1906,11 +1983,15 @@ void Browser::EnterFullscreenModeForTab( +@@ -1906,11 +1988,15 @@ void Browser::EnterFullscreenModeForTab( const blink::mojom::FullscreenOptions& options) { exclusive_access_manager_->fullscreen_controller()->EnterFullscreenModeForTab( requesting_frame, options.display_id); @@ -190,7 +195,29 @@ index 04e327d970b87..0b808a691eb49 100644 } bool Browser::IsFullscreenForTabOrPending(const WebContents* web_contents) { -@@ -2753,6 +2834,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { +@@ -2620,13 +2706,20 @@ void Browser::RemoveScheduledUpdatesFor(WebContents* contents) { + // Browser, Getters for UI (private): + + StatusBubble* Browser::GetStatusBubble() { ++ bool show_by_default = true; ++ + // In kiosk and exclusive app mode we want to always hide the status bubble. + if (chrome::IsRunningInAppMode() || + (base::FeatureList::IsEnabled(features::kRemoveStatusBarInWebApps) && + web_app::AppBrowserController::IsWebApp(this))) { +- return nullptr; ++ show_by_default = false; + } + ++ bool show = show_by_default; ++ CALL_CEF_DELEGATE_RESULT(ShowStatusBubble, show, show_by_default); ++ if (!show) ++ return nullptr; ++ + return window_ ? window_->GetStatusBubble() : nullptr; + } + +@@ -2753,6 +2846,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { content_translate_driver->RemoveTranslationObserver(this); BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this); } diff --git a/tests/cefclient/browser/main_context_impl.cc b/tests/cefclient/browser/main_context_impl.cc index 97bcc3eeb..095f99f87 100644 --- a/tests/cefclient/browser/main_context_impl.cc +++ b/tests/cefclient/browser/main_context_impl.cc @@ -43,13 +43,7 @@ cef_color_t ParseColor(const std::string& color) { MainContextImpl::MainContextImpl(CefRefPtr command_line, bool terminate_when_all_windows_closed) : command_line_(command_line), - terminate_when_all_windows_closed_(terminate_when_all_windows_closed), - initialized_(false), - shutdown_(false), - background_color_(0), - browser_background_color_(0), - windowless_frame_rate_(0), - use_views_(false) { + terminate_when_all_windows_closed_(terminate_when_all_windows_closed) { DCHECK(command_line_.get()); // Set the main URL. @@ -206,6 +200,11 @@ void MainContextImpl::PopulateBrowserSettings(CefBrowserSettings* settings) { if (browser_background_color_ != 0) settings->background_color = browser_background_color_; + + if (use_chrome_runtime_ && + command_line_->HasSwitch(switches::kHideChromeStatusBubble)) { + settings->chrome_status_bubble = STATE_DISABLED; + } } void MainContextImpl::PopulateOsrSettings(OsrRendererSettings* settings) { diff --git a/tests/cefclient/browser/main_context_impl.h b/tests/cefclient/browser/main_context_impl.h index 7b7cef689..15dddd338 100644 --- a/tests/cefclient/browser/main_context_impl.h +++ b/tests/cefclient/browser/main_context_impl.h @@ -64,17 +64,16 @@ class MainContextImpl : public MainContext { // Track context state. Accessing these variables from multiple threads is // safe because only a single thread will exist at the time that they're set // (during context initialization and shutdown). - bool initialized_; - bool shutdown_; + bool initialized_ = false; + bool shutdown_ = false; std::string main_url_; - cef_color_t background_color_; - cef_color_t browser_background_color_; + cef_color_t background_color_ = 0; + cef_color_t browser_background_color_ = 0; bool use_windowless_rendering_; - int windowless_frame_rate_; + int windowless_frame_rate_ = 0; bool use_chrome_runtime_; bool use_views_; - bool touch_events_enabled_; std::unique_ptr root_window_manager_; diff --git a/tests/shared/common/client_switches.cc b/tests/shared/common/client_switches.cc index 18b19d47f..34e647580 100644 --- a/tests/shared/common/client_switches.cc +++ b/tests/shared/common/client_switches.cc @@ -47,6 +47,7 @@ const char kNoActivate[] = "no-activate"; const char kEnableChromeRuntime[] = "enable-chrome-runtime"; const char kShowChromeToolbar[] = "show-chrome-toolbar"; const char kInitialShowState[] = "initial-show-state"; +const char kHideChromeStatusBubble[] = "hide-chrome-status-bubble"; } // namespace switches } // namespace client diff --git a/tests/shared/common/client_switches.h b/tests/shared/common/client_switches.h index 43cc0af3a..e3fc13e88 100644 --- a/tests/shared/common/client_switches.h +++ b/tests/shared/common/client_switches.h @@ -41,6 +41,7 @@ extern const char kNoActivate[]; extern const char kEnableChromeRuntime[]; extern const char kShowChromeToolbar[]; extern const char kInitialShowState[]; +extern const char kHideChromeStatusBubble[]; } // namespace switches } // namespace client