chrome: Implement CefFocusHandler::OnTakeFocus callback (fixes #3897)

This commit is contained in:
Marshall Greenblatt
2025-03-21 13:03:53 -04:00
parent e88e98f061
commit 8cf30843f9
6 changed files with 55 additions and 35 deletions

View File

@@ -1057,14 +1057,7 @@ void AlloyBrowserHostImpl::BeforeUnloadFired(content::WebContents* source,
bool AlloyBrowserHostImpl::TakeFocus(content::WebContents* source, bool AlloyBrowserHostImpl::TakeFocus(content::WebContents* source,
bool reverse) { bool reverse) {
if (client_.get()) { return contents_delegate_.TakeFocus(source, reverse);
CefRefPtr<CefFocusHandler> handler = client_->GetFocusHandler();
if (handler.get()) {
handler->OnTakeFocus(this, !reverse);
}
}
return false;
} }
void AlloyBrowserHostImpl::CanDownload( void AlloyBrowserHostImpl::CanDownload(

View File

@@ -629,6 +629,17 @@ void CefBrowserContentsDelegate::OnFocusChangedInPage(
details->is_editable_node; details->is_editable_node;
} }
bool CefBrowserContentsDelegate::TakeFocus(content::WebContents* source,
bool reverse) {
if (auto c = client()) {
if (auto handler = c->GetFocusHandler()) {
handler->OnTakeFocus(browser(), !reverse);
}
}
return false;
}
void CefBrowserContentsDelegate::WebContentsDestroyed() { void CefBrowserContentsDelegate::WebContentsDestroyed() {
auto wc = web_contents(); auto wc = web_contents();
ObserveWebContents(nullptr); ObserveWebContents(nullptr);

View File

@@ -144,6 +144,7 @@ class CefBrowserContentsDelegate : public content::WebContentsDelegate,
void OnWebContentsFocused( void OnWebContentsFocused(
content::RenderWidgetHost* render_widget_host) override; content::RenderWidgetHost* render_widget_host) override;
void OnFocusChangedInPage(content::FocusedNodeDetails* details) override; void OnFocusChangedInPage(content::FocusedNodeDetails* details) override;
bool TakeFocus(content::WebContents* source, bool reverse) override;
void WebContentsDestroyed() override; void WebContentsDestroyed() override;
// Accessors for state information. Changes will be signaled to // Accessors for state information. Changes will be signaled to

View File

@@ -476,6 +476,14 @@ void ChromeBrowserDelegate::DraggableRegionsChanged(
} }
} }
bool ChromeBrowserDelegate::TakeFocus(content::WebContents* source,
bool reverse) {
if (auto delegate = GetDelegateForWebContents(source)) {
return delegate->TakeFocus(source, reverse);
}
return false;
}
void ChromeBrowserDelegate::WindowFullscreenStateChanged() { void ChromeBrowserDelegate::WindowFullscreenStateChanged() {
// Use a synchronous callback for notification on Windows/Linux. MacOS gets // Use a synchronous callback for notification on Windows/Linux. MacOS gets
// notified asynchronously via CefNativeWidgetMac callbacks. // notified asynchronously via CefNativeWidgetMac callbacks.

View File

@@ -127,6 +127,7 @@ class ChromeBrowserDelegate : public cef::BrowserDelegate {
void DraggableRegionsChanged( void DraggableRegionsChanged(
const std::vector<blink::mojom::DraggableRegionPtr>& regions, const std::vector<blink::mojom::DraggableRegionPtr>& regions,
content::WebContents* contents) override; content::WebContents* contents) override;
bool TakeFocus(content::WebContents* source, bool reverse) override;
Browser* browser() const { return browser_; } Browser* browser() const { return browser_; }

View File

@@ -141,7 +141,7 @@ index 0ed6e9e434350..5c8bcd5c45ede 100644
] ]
} }
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 fafd84d08e336..a17aad8f37537 100644 index fafd84d08e336..0985c4cd9ebf0 100644
--- chrome/browser/ui/browser.cc --- chrome/browser/ui/browser.cc
+++ chrome/browser/ui/browser.cc +++ chrome/browser/ui/browser.cc
@@ -268,6 +268,25 @@ @@ -268,6 +268,25 @@
@@ -149,16 +149,16 @@ index fafd84d08e336..a17aad8f37537 100644
#endif #endif
+#if BUILDFLAG(ENABLE_CEF) +#if BUILDFLAG(ENABLE_CEF)
+#define CALL_CEF_DELEGATE(name, ...) \ +#define CALL_CEF_DELEGATE(name, ...) \
+ if (cef_browser_delegate_) { \ + if (cef_browser_delegate_) { \
+ cef_browser_delegate_->name(__VA_ARGS__); \ + cef_browser_delegate_->name(__VA_ARGS__); \
+ } + }
+#define CALL_CEF_DELEGATE_RETURN(name, ...) \ +#define CALL_CEF_DELEGATE_RETURN(name, ...) \
+ 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, ...) \ +#define CALL_CEF_DELEGATE_RESULT(name, result, ...) \
+ if (cef_browser_delegate_) { \ + if (cef_browser_delegate_) { \
+ result = cef_browser_delegate_->name(__VA_ARGS__); \ + result = cef_browser_delegate_->name(__VA_ARGS__); \
+ } + }
+#else // !BUILDFLAG(ENABLE_CEF) +#else // !BUILDFLAG(ENABLE_CEF)
@@ -203,22 +203,23 @@ index fafd84d08e336..a17aad8f37537 100644
} }
void Browser::FullscreenTopUIStateChanged() { void Browser::FullscreenTopUIStateChanged() {
@@ -1752,6 +1783,14 @@ content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent( @@ -1752,6 +1783,15 @@ content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent(
return content::KeyboardEventProcessingResult::HANDLED; return content::KeyboardEventProcessingResult::HANDLED;
} }
+#if BUILDFLAG(ENABLE_CEF) +#if BUILDFLAG(ENABLE_CEF)
+ if (cef_browser_delegate_) { + if (cef_browser_delegate_) {
+ auto result = cef_browser_delegate_->PreHandleKeyboardEvent(source, event); + auto result = cef_browser_delegate_->PreHandleKeyboardEvent(source, event);
+ if (result != content::KeyboardEventProcessingResult::NOT_HANDLED) + if (result != content::KeyboardEventProcessingResult::NOT_HANDLED) {
+ return result; + return result;
+ }
+ } + }
+#endif +#endif
+ +
return window()->PreHandleKeyboardEvent(event); return window()->PreHandleKeyboardEvent(event);
} }
@@ -1759,8 +1798,18 @@ bool Browser::HandleKeyboardEvent(content::WebContents* source, @@ -1759,8 +1799,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);
@@ -239,7 +240,7 @@ index fafd84d08e336..a17aad8f37537 100644
} }
bool Browser::TabsNeedBeforeUnloadFired() const { bool Browser::TabsNeedBeforeUnloadFired() const {
@@ -1855,9 +1904,14 @@ bool Browser::IsBackForwardCacheSupported(content::WebContents& web_contents) { @@ -1855,9 +1905,14 @@ bool Browser::IsBackForwardCacheSupported(content::WebContents& web_contents) {
content::PreloadingEligibility Browser::IsPrerender2Supported( content::PreloadingEligibility Browser::IsPrerender2Supported(
content::WebContents& web_contents, content::WebContents& web_contents,
content::PreloadingTriggerType trigger_type) { content::PreloadingTriggerType trigger_type) {
@@ -254,7 +255,7 @@ index fafd84d08e336..a17aad8f37537 100644
} }
bool Browser::ShouldShowStaleContentOnEviction(content::WebContents* source) { bool Browser::ShouldShowStaleContentOnEviction(content::WebContents* source) {
@@ -1920,6 +1974,14 @@ WebContents* Browser::OpenURLFromTab( @@ -1920,6 +1975,14 @@ WebContents* Browser::OpenURLFromTab(
std::move(navigation_handle_callback)); std::move(navigation_handle_callback));
} }
@@ -269,7 +270,7 @@ index fafd84d08e336..a17aad8f37537 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;
@@ -2093,6 +2155,8 @@ void Browser::LoadingStateChanged(WebContents* source, @@ -2093,6 +2156,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);
@@ -278,7 +279,7 @@ index fafd84d08e336..a17aad8f37537 100644
} }
void Browser::CloseContents(WebContents* source) { void Browser::CloseContents(WebContents* source) {
@@ -2122,6 +2186,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) { @@ -2122,6 +2187,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) {
@@ -287,7 +288,7 @@ index fafd84d08e336..a17aad8f37537 100644
if (!GetStatusBubble()) { if (!GetStatusBubble()) {
return; return;
} }
@@ -2131,6 +2197,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) { @@ -2131,6 +2198,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
} }
} }
@@ -305,7 +306,11 @@ index fafd84d08e336..a17aad8f37537 100644
void Browser::ContentsMouseEvent(WebContents* source, const ui::Event& event) { void Browser::ContentsMouseEvent(WebContents* source, const ui::Event& event) {
const ui::EventType type = event.type(); const ui::EventType type = event.type();
const bool exited = type == ui::EventType::kMouseExited; const bool exited = type == ui::EventType::kMouseExited;
@@ -2159,6 +2236,19 @@ bool Browser::TakeFocus(content::WebContents* source, bool reverse) { @@ -2156,9 +2234,23 @@ void Browser::ContentsZoomChange(bool zoom_in) {
}
bool Browser::TakeFocus(content::WebContents* source, bool reverse) {
+ CALL_CEF_DELEGATE_RETURN(TakeFocus, source, reverse);
return false; return false;
} }
@@ -325,7 +330,7 @@ index fafd84d08e336..a17aad8f37537 100644
void Browser::BeforeUnloadFired(WebContents* web_contents, void Browser::BeforeUnloadFired(WebContents* web_contents,
bool proceed, bool proceed,
bool* proceed_to_fire_unload) { bool* proceed_to_fire_unload) {
@@ -2271,12 +2361,24 @@ void Browser::WebContentsCreated(WebContents* source_contents, @@ -2271,12 +2363,24 @@ void Browser::WebContentsCreated(WebContents* source_contents,
// to track `new_contents` after it is added to its TabModel this override can // to track `new_contents` after it is added to its TabModel this override can
// be removed. // be removed.
CreateSessionServiceTabHelper(new_contents); CreateSessionServiceTabHelper(new_contents);
@@ -350,7 +355,7 @@ index fafd84d08e336..a17aad8f37537 100644
// Don't show the page hung dialog when a HTML popup hangs because // Don't show the page hung dialog when a HTML popup hangs because
// the dialog will take the focus and immediately close the popup. // the dialog will take the focus and immediately close the popup.
RenderWidgetHostView* view = render_widget_host->GetView(); RenderWidgetHostView* view = render_widget_host->GetView();
@@ -2289,6 +2391,13 @@ void Browser::RendererUnresponsive( @@ -2289,6 +2393,13 @@ void Browser::RendererUnresponsive(
void Browser::RendererResponsive( void Browser::RendererResponsive(
WebContents* source, WebContents* source,
content::RenderWidgetHost* render_widget_host) { content::RenderWidgetHost* render_widget_host) {
@@ -364,7 +369,7 @@ index fafd84d08e336..a17aad8f37537 100644
RenderWidgetHostView* view = render_widget_host->GetView(); RenderWidgetHostView* view = render_widget_host->GetView();
if (view && !render_widget_host->GetView()->IsHTMLFormPopup()) { if (view && !render_widget_host->GetView()->IsHTMLFormPopup()) {
TabDialogs::FromWebContents(source)->HideHungRendererDialog( TabDialogs::FromWebContents(source)->HideHungRendererDialog(
@@ -2298,6 +2407,15 @@ void Browser::RendererResponsive( @@ -2298,6 +2409,15 @@ void Browser::RendererResponsive(
content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager( content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager(
WebContents* source) { WebContents* source) {
@@ -380,7 +385,7 @@ index fafd84d08e336..a17aad8f37537 100644
return javascript_dialogs::TabModalDialogManager::FromWebContents(source); return javascript_dialogs::TabModalDialogManager::FromWebContents(source);
} }
@@ -2333,6 +2451,11 @@ void Browser::DraggableRegionsChanged( @@ -2333,6 +2453,11 @@ void Browser::DraggableRegionsChanged(
if (app_controller_) { if (app_controller_) {
app_controller_->DraggableRegionsChanged(regions, contents); app_controller_->DraggableRegionsChanged(regions, contents);
} }
@@ -392,7 +397,7 @@ index fafd84d08e336..a17aad8f37537 100644
} }
void Browser::DidFinishNavigation( void Browser::DidFinishNavigation(
@@ -2415,11 +2538,15 @@ void Browser::EnterFullscreenModeForTab( @@ -2415,11 +2540,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);
@@ -408,7 +413,7 @@ index fafd84d08e336..a17aad8f37537 100644
} }
bool Browser::IsFullscreenForTabOrPending(const WebContents* web_contents) { bool Browser::IsFullscreenForTabOrPending(const WebContents* web_contents) {
@@ -2629,6 +2756,15 @@ void Browser::RequestMediaAccessPermission( @@ -2629,6 +2758,16 @@ void Browser::RequestMediaAccessPermission(
content::WebContents* web_contents, content::WebContents* web_contents,
const content::MediaStreamRequest& request, const content::MediaStreamRequest& request,
content::MediaResponseCallback callback) { content::MediaResponseCallback callback) {
@@ -416,15 +421,16 @@ index fafd84d08e336..a17aad8f37537 100644
+ if (cef_browser_delegate_) { + if (cef_browser_delegate_) {
+ callback = cef_browser_delegate_->RequestMediaAccessPermissionEx( + callback = cef_browser_delegate_->RequestMediaAccessPermissionEx(
+ web_contents, request, std::move(callback)); + web_contents, request, std::move(callback));
+ if (callback.is_null()) + if (callback.is_null()) {
+ return; + return;
+ }
+ } + }
+#endif +#endif
+ +
const extensions::Extension* extension = const extensions::Extension* extension =
GetExtensionForOrigin(profile_, request.security_origin); GetExtensionForOrigin(profile_, request.security_origin);
MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest( MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest(
@@ -3211,9 +3347,10 @@ void Browser::RemoveScheduledUpdatesFor(WebContents* contents) { @@ -3211,9 +3350,10 @@ void Browser::RemoveScheduledUpdatesFor(WebContents* contents) {
// Browser, Getters for UI (private): // Browser, Getters for UI (private):
StatusBubble* Browser::GetStatusBubble() { StatusBubble* Browser::GetStatusBubble() {
@@ -436,7 +442,7 @@ index fafd84d08e336..a17aad8f37537 100644
} }
// We hide the status bar for web apps windows as this matches native // We hide the status bar for web apps windows as this matches native
@@ -3221,6 +3358,12 @@ StatusBubble* Browser::GetStatusBubble() { @@ -3221,6 +3361,12 @@ StatusBubble* Browser::GetStatusBubble() {
// mode, as the minimal browser UI includes the status bar. // mode, as the minimal browser UI includes the status bar.
if (web_app::AppBrowserController::IsWebApp(this) && if (web_app::AppBrowserController::IsWebApp(this) &&
!app_controller()->HasMinimalUiButtons()) { !app_controller()->HasMinimalUiButtons()) {
@@ -449,7 +455,7 @@ index fafd84d08e336..a17aad8f37537 100644
return nullptr; return nullptr;
} }
@@ -3370,6 +3513,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { @@ -3370,6 +3516,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this); BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this);
web_contents_collection_.StopObserving(web_contents); web_contents_collection_.StopObserving(web_contents);
} }
@@ -458,7 +464,7 @@ index fafd84d08e336..a17aad8f37537 100644
} }
void Browser::TabDetachedAtImpl(content::WebContents* contents, void Browser::TabDetachedAtImpl(content::WebContents* contents,
@@ -3530,6 +3675,14 @@ bool Browser::PictureInPictureBrowserSupportsWindowFeature( @@ -3530,6 +3678,14 @@ bool Browser::PictureInPictureBrowserSupportsWindowFeature(
bool Browser::SupportsWindowFeatureImpl(WindowFeature feature, bool Browser::SupportsWindowFeatureImpl(WindowFeature feature,
bool check_can_support) const { bool check_can_support) const {