chrome: Add setting for controlling the status bubble (fixes isse #3279)

This change adds `CefBrowserSettings.chrome_status_bubble` for controlling
whether the Chrome status bubble will be used.

Testable in cefclient by passing the `--hide-chrome-status-bubble`
command-line flag.
This commit is contained in:
Marshall Greenblatt 2022-03-21 17:22:07 -04:00
parent 1eab4322f8
commit 4615fffafb
13 changed files with 106 additions and 32 deletions

View File

@ -42,13 +42,13 @@
// way that may cause binary incompatibility with other builds. The universal // way that may cause binary incompatibility with other builds. The universal
// hash value will change if any platform is affected whereas the platform hash // hash value will change if any platform is affected whereas the platform hash
// values will change only if that particular platform is affected. // 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) #if defined(OS_WIN)
#define CEF_API_HASH_PLATFORM "acdae91db336230e00c4e8863236fd479576249f" #define CEF_API_HASH_PLATFORM "6402341997737ba956460d92af756a3b9e59d0f0"
#elif defined(OS_MAC) #elif defined(OS_MAC)
#define CEF_API_HASH_PLATFORM "6cdb410709486a7e78bf5876e9ca4a79e4553a30" #define CEF_API_HASH_PLATFORM "cd4c53d8024e52d2041de8a49db69c69edd8e62b"
#elif defined(OS_LINUX) #elif defined(OS_LINUX)
#define CEF_API_HASH_PLATFORM "3b89d9dab5020373d90525066de3166d0b949f25" #define CEF_API_HASH_PLATFORM "bd498b3ef328a60a11eae6871a13b7c517e583f1"
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -520,7 +520,7 @@ typedef struct _cef_browser_settings_t {
/// ///
int windowless_frame_rate; int windowless_frame_rate;
// The below values map to WebPreferences settings. // BEGIN values that map to WebPreferences settings.
/// ///
// Font settings. // Font settings.
@ -622,6 +622,8 @@ typedef struct _cef_browser_settings_t {
/// ///
cef_state_t webgl; cef_state_t webgl;
// END values that map to WebPreferences settings.
/// ///
// Background color used for the browser before a document is loaded and when // 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 // 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. // empty then "en-US,en" will be used.
/// ///
cef_string_t accept_language_list; 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; } cef_browser_settings_t;
/// ///

View File

@ -718,6 +718,8 @@ struct CefBrowserSettingsTraits {
cef_string_set(src->accept_language_list.str, cef_string_set(src->accept_language_list.str,
src->accept_language_list.length, src->accept_language_list.length,
&target->accept_language_list, copy); &target->accept_language_list, copy);
target->chrome_status_bubble = src->chrome_status_bubble;
} }
}; };

View File

@ -41,6 +41,12 @@ class BrowserDelegate : public content::WebContentsDelegate {
// Add or remove ownership of the WebContents. // Add or remove ownership of the WebContents.
virtual void SetAsDelegate(content::WebContents* web_contents, virtual void SetAsDelegate(content::WebContents* web_contents,
bool set_delegate) = 0; 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 } // namespace cef

View File

@ -72,6 +72,22 @@ void ChromeBrowserDelegate::SetAsDelegate(content::WebContents* web_contents,
request_context_impl); 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( void ChromeBrowserDelegate::WebContentsCreated(
content::WebContents* source_contents, content::WebContents* source_contents,
int opener_render_process_id, int opener_render_process_id,

View File

@ -51,6 +51,7 @@ class ChromeBrowserDelegate : public cef::BrowserDelegate {
void OnWebContentsCreated(content::WebContents* new_contents) override; void OnWebContentsCreated(content::WebContents* new_contents) override;
void SetAsDelegate(content::WebContents* web_contents, void SetAsDelegate(content::WebContents* web_contents,
bool set_delegate) override; bool set_delegate) override;
bool ShowStatusBubble(bool show_by_default) override;
// WebContentsDelegate methods: // WebContentsDelegate methods:
void WebContentsCreated(content::WebContents* source_contents, void WebContentsCreated(content::WebContents* source_contents,
@ -109,6 +110,8 @@ class ChromeBrowserDelegate : public cef::BrowserDelegate {
// Used when creating a new browser host. // Used when creating a new browser host.
const CefBrowserCreateParams create_params_; const CefBrowserCreateParams create_params_;
absl::optional<bool> show_status_bubble_;
}; };
#endif // CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_DELEGATE_H_ #endif // CEF_LIBCEF_BROWSER_CHROME_CHROME_BROWSER_DELEGATE_H_

View File

@ -91,6 +91,14 @@ CefRefPtr<ChromeBrowserHostImpl> ChromeBrowserHostImpl::GetBrowserForGlobalId(
return static_cast<ChromeBrowserHostImpl*>(browser.get()); return static_cast<ChromeBrowserHostImpl*>(browser.get());
} }
// static
CefRefPtr<ChromeBrowserHostImpl> ChromeBrowserHostImpl::GetBrowserForBrowser(
const Browser* browser) {
REQUIRE_CHROME_RUNTIME();
return GetBrowserForContents(
browser->tab_strip_model()->GetActiveWebContents());
}
ChromeBrowserHostImpl::~ChromeBrowserHostImpl() = default; ChromeBrowserHostImpl::~ChromeBrowserHostImpl() = default;
void ChromeBrowserHostImpl::AddNewContents( void ChromeBrowserHostImpl::AddNewContents(

View File

@ -47,6 +47,9 @@ class ChromeBrowserHostImpl : public CefBrowserHostBase {
// Returns the browser associated with the specified global ID. // Returns the browser associated with the specified global ID.
static CefRefPtr<ChromeBrowserHostImpl> GetBrowserForGlobalId( static CefRefPtr<ChromeBrowserHostImpl> GetBrowserForGlobalId(
const content::GlobalRenderFrameHostId& global_id); const content::GlobalRenderFrameHostId& global_id);
// Returns the browser associated with the specified Browser.
static CefRefPtr<ChromeBrowserHostImpl> GetBrowserForBrowser(
const Browser* browser);
~ChromeBrowserHostImpl() override; ~ChromeBrowserHostImpl() override;

View File

@ -13,10 +13,10 @@ index 9e534ff1683f1..de406f5879be0 100644
return false; return false;
} }
diff --git chrome/browser/ui/browser.cc chrome/browser/ui/browser.cc 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
+++ 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" #include "components/captive_portal/content/captive_portal_tab_helper.h"
#endif #endif
@ -29,15 +29,20 @@ index 04e327d970b87..0b808a691eb49 100644
+ if (cef_browser_delegate_) { \ + if (cef_browser_delegate_) { \
+ return cef_browser_delegate_->name(__VA_ARGS__); \ + 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) +#else // !BUILDFLAG(ENABLE_CEF)
+#define CALL_CEF_DELEGATE(name, ...) +#define CALL_CEF_DELEGATE(name, ...)
+#define CALL_CEF_DELEGATE_RETURN(name, ...) +#define CALL_CEF_DELEGATE_RETURN(name, ...)
+#define CALL_CEF_DELEGATE_RESULT(name, result, ...)
+#endif +#endif
+ +
#if BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_EXTENSIONS)
#include "chrome/browser/extensions/extension_browser_window_helper.h" #include "chrome/browser/extensions/extension_browser_window_helper.h"
#endif #endif
@@ -504,6 +518,13 @@ Browser::Browser(const CreateParams& params) @@ -504,6 +523,13 @@ Browser::Browser(const CreateParams& params)
tab_strip_model_->AddObserver(this); tab_strip_model_->AddObserver(this);
@ -51,7 +56,7 @@ index 04e327d970b87..0b808a691eb49 100644
location_bar_model_ = std::make_unique<LocationBarModelImpl>( location_bar_model_ = std::make_unique<LocationBarModelImpl>(
location_bar_model_delegate_.get(), content::kMaxURLDisplayChars); 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)) if (exclusive_access_manager_->HandleUserKeyEvent(event))
return content::KeyboardEventProcessingResult::HANDLED; return content::KeyboardEventProcessingResult::HANDLED;
@ -66,7 +71,7 @@ index 04e327d970b87..0b808a691eb49 100644
return window()->PreHandleKeyboardEvent(event); 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) { const NativeWebKeyboardEvent& event) {
DevToolsWindow* devtools_window = DevToolsWindow* devtools_window =
DevToolsWindow::GetInstanceForInspectedWebContents(source); DevToolsWindow::GetInstanceForInspectedWebContents(source);
@ -87,7 +92,7 @@ index 04e327d970b87..0b808a691eb49 100644
} }
bool Browser::TabsNeedBeforeUnloadFired() { 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); return window->OpenURLFromTab(source, params);
} }
@ -102,7 +107,7 @@ index 04e327d970b87..0b808a691eb49 100644
NavigateParams nav_params(this, params.url, params.transition); NavigateParams nav_params(this, params.url, params.transition);
nav_params.FillNavigateParamsFromOpenURLParams(params); nav_params.FillNavigateParamsFromOpenURLParams(params);
nav_params.source_contents = source; 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); source, disposition);
} }
@ -118,7 +123,7 @@ index 04e327d970b87..0b808a691eb49 100644
chrome::AddWebContents(this, source, std::move(new_contents), target_url, chrome::AddWebContents(this, source, std::move(new_contents), target_url,
disposition, initial_rect); 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) { bool should_show_loading_ui) {
ScheduleUIUpdate(source, content::INVALIDATE_TYPE_LOAD); ScheduleUIUpdate(source, content::INVALIDATE_TYPE_LOAD);
UpdateWindowForLoadingStateChanged(source, should_show_loading_ui); UpdateWindowForLoadingStateChanged(source, should_show_loading_ui);
@ -127,7 +132,7 @@ index 04e327d970b87..0b808a691eb49 100644
} }
void Browser::CloseContents(WebContents* source) { 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) { void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
@ -136,7 +141,7 @@ index 04e327d970b87..0b808a691eb49 100644
if (!GetStatusBubble()) if (!GetStatusBubble())
return; 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); GetStatusBubble()->SetURL(url);
} }
@ -154,7 +159,7 @@ index 04e327d970b87..0b808a691eb49 100644
void Browser::ContentsMouseEvent(WebContents* source, void Browser::ContentsMouseEvent(WebContents* source,
bool motion, bool motion,
bool exited) { 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. // Make the tab show up in the task manager.
task_manager::WebContentsTags::CreateForTabContents(new_contents); task_manager::WebContentsTags::CreateForTabContents(new_contents);
@ -165,7 +170,7 @@ index 04e327d970b87..0b808a691eb49 100644
} }
void Browser::PortalWebContentsCreated(WebContents* portal_web_contents) { 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) { void Browser::DidNavigatePrimaryMainFramePostCommit(WebContents* web_contents) {
if (web_contents == tab_strip_model_->GetActiveWebContents()) if (web_contents == tab_strip_model_->GetActiveWebContents())
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE);
@ -174,7 +179,7 @@ index 04e327d970b87..0b808a691eb49 100644
} }
content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager( content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager(
@@ -1906,11 +1983,15 @@ void Browser::EnterFullscreenModeForTab( @@ -1906,11 +1988,15 @@ void Browser::EnterFullscreenModeForTab(
const blink::mojom::FullscreenOptions& options) { const blink::mojom::FullscreenOptions& options) {
exclusive_access_manager_->fullscreen_controller()->EnterFullscreenModeForTab( exclusive_access_manager_->fullscreen_controller()->EnterFullscreenModeForTab(
requesting_frame, options.display_id); requesting_frame, options.display_id);
@ -190,7 +195,29 @@ index 04e327d970b87..0b808a691eb49 100644
} }
bool Browser::IsFullscreenForTabOrPending(const WebContents* web_contents) { 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); content_translate_driver->RemoveTranslationObserver(this);
BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this); BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this);
} }

View File

@ -43,13 +43,7 @@ cef_color_t ParseColor(const std::string& color) {
MainContextImpl::MainContextImpl(CefRefPtr<CefCommandLine> command_line, MainContextImpl::MainContextImpl(CefRefPtr<CefCommandLine> command_line,
bool terminate_when_all_windows_closed) bool terminate_when_all_windows_closed)
: command_line_(command_line), : command_line_(command_line),
terminate_when_all_windows_closed_(terminate_when_all_windows_closed), 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) {
DCHECK(command_line_.get()); DCHECK(command_line_.get());
// Set the main URL. // Set the main URL.
@ -206,6 +200,11 @@ void MainContextImpl::PopulateBrowserSettings(CefBrowserSettings* settings) {
if (browser_background_color_ != 0) if (browser_background_color_ != 0)
settings->background_color = browser_background_color_; 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) { void MainContextImpl::PopulateOsrSettings(OsrRendererSettings* settings) {

View File

@ -64,17 +64,16 @@ class MainContextImpl : public MainContext {
// Track context state. Accessing these variables from multiple threads is // 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 // safe because only a single thread will exist at the time that they're set
// (during context initialization and shutdown). // (during context initialization and shutdown).
bool initialized_; bool initialized_ = false;
bool shutdown_; bool shutdown_ = false;
std::string main_url_; std::string main_url_;
cef_color_t background_color_; cef_color_t background_color_ = 0;
cef_color_t browser_background_color_; cef_color_t browser_background_color_ = 0;
bool use_windowless_rendering_; bool use_windowless_rendering_;
int windowless_frame_rate_; int windowless_frame_rate_ = 0;
bool use_chrome_runtime_; bool use_chrome_runtime_;
bool use_views_; bool use_views_;
bool touch_events_enabled_;
std::unique_ptr<RootWindowManager> root_window_manager_; std::unique_ptr<RootWindowManager> root_window_manager_;

View File

@ -47,6 +47,7 @@ const char kNoActivate[] = "no-activate";
const char kEnableChromeRuntime[] = "enable-chrome-runtime"; const char kEnableChromeRuntime[] = "enable-chrome-runtime";
const char kShowChromeToolbar[] = "show-chrome-toolbar"; const char kShowChromeToolbar[] = "show-chrome-toolbar";
const char kInitialShowState[] = "initial-show-state"; const char kInitialShowState[] = "initial-show-state";
const char kHideChromeStatusBubble[] = "hide-chrome-status-bubble";
} // namespace switches } // namespace switches
} // namespace client } // namespace client

View File

@ -41,6 +41,7 @@ extern const char kNoActivate[];
extern const char kEnableChromeRuntime[]; extern const char kEnableChromeRuntime[];
extern const char kShowChromeToolbar[]; extern const char kShowChromeToolbar[];
extern const char kInitialShowState[]; extern const char kInitialShowState[];
extern const char kHideChromeStatusBubble[];
} // namespace switches } // namespace switches
} // namespace client } // namespace client