Skip to content

Commit 8cf3084

Browse files
committed
chrome: Implement CefFocusHandler::OnTakeFocus callback (fixes #3897)
1 parent e88e98f commit 8cf3084

6 files changed

+55
-35
lines changed

libcef/browser/alloy/alloy_browser_host_impl.cc

+1-8
Original file line numberDiff line numberDiff line change
@@ -1057,14 +1057,7 @@ void AlloyBrowserHostImpl::BeforeUnloadFired(content::WebContents* source,
10571057

10581058
bool AlloyBrowserHostImpl::TakeFocus(content::WebContents* source,
10591059
bool reverse) {
1060-
if (client_.get()) {
1061-
CefRefPtr<CefFocusHandler> handler = client_->GetFocusHandler();
1062-
if (handler.get()) {
1063-
handler->OnTakeFocus(this, !reverse);
1064-
}
1065-
}
1066-
1067-
return false;
1060+
return contents_delegate_.TakeFocus(source, reverse);
10681061
}
10691062

10701063
void AlloyBrowserHostImpl::CanDownload(

libcef/browser/browser_contents_delegate.cc

+11
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,17 @@ void CefBrowserContentsDelegate::OnFocusChangedInPage(
629629
details->is_editable_node;
630630
}
631631

632+
bool CefBrowserContentsDelegate::TakeFocus(content::WebContents* source,
633+
bool reverse) {
634+
if (auto c = client()) {
635+
if (auto handler = c->GetFocusHandler()) {
636+
handler->OnTakeFocus(browser(), !reverse);
637+
}
638+
}
639+
640+
return false;
641+
}
642+
632643
void CefBrowserContentsDelegate::WebContentsDestroyed() {
633644
auto wc = web_contents();
634645
ObserveWebContents(nullptr);

libcef/browser/browser_contents_delegate.h

+1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ class CefBrowserContentsDelegate : public content::WebContentsDelegate,
144144
void OnWebContentsFocused(
145145
content::RenderWidgetHost* render_widget_host) override;
146146
void OnFocusChangedInPage(content::FocusedNodeDetails* details) override;
147+
bool TakeFocus(content::WebContents* source, bool reverse) override;
147148
void WebContentsDestroyed() override;
148149

149150
// Accessors for state information. Changes will be signaled to

libcef/browser/chrome/chrome_browser_delegate.cc

+8
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,14 @@ void ChromeBrowserDelegate::DraggableRegionsChanged(
476476
}
477477
}
478478

479+
bool ChromeBrowserDelegate::TakeFocus(content::WebContents* source,
480+
bool reverse) {
481+
if (auto delegate = GetDelegateForWebContents(source)) {
482+
return delegate->TakeFocus(source, reverse);
483+
}
484+
return false;
485+
}
486+
479487
void ChromeBrowserDelegate::WindowFullscreenStateChanged() {
480488
// Use a synchronous callback for notification on Windows/Linux. MacOS gets
481489
// notified asynchronously via CefNativeWidgetMac callbacks.

libcef/browser/chrome/chrome_browser_delegate.h

+1
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ class ChromeBrowserDelegate : public cef::BrowserDelegate {
127127
void DraggableRegionsChanged(
128128
const std::vector<blink::mojom::DraggableRegionPtr>& regions,
129129
content::WebContents* contents) override;
130+
bool TakeFocus(content::WebContents* source, bool reverse) override;
130131

131132
Browser* browser() const { return browser_; }
132133

patch/patches/chrome_browser_browser.patch

+33-27
Original file line numberDiff line numberDiff line change
@@ -141,24 +141,24 @@ index 0ed6e9e434350..5c8bcd5c45ede 100644
141141
]
142142
}
143143
diff --git chrome/browser/ui/browser.cc chrome/browser/ui/browser.cc
144-
index fafd84d08e336..a17aad8f37537 100644
144+
index fafd84d08e336..0985c4cd9ebf0 100644
145145
--- chrome/browser/ui/browser.cc
146146
+++ chrome/browser/ui/browser.cc
147147
@@ -268,6 +268,25 @@
148148
#include "components/captive_portal/content/captive_portal_tab_helper.h"
149149
#endif
150150

151151
+#if BUILDFLAG(ENABLE_CEF)
152-
+#define CALL_CEF_DELEGATE(name, ...) \
153-
+ if (cef_browser_delegate_) { \
152+
+#define CALL_CEF_DELEGATE(name, ...) \
153+
+ if (cef_browser_delegate_) { \
154154
+ cef_browser_delegate_->name(__VA_ARGS__); \
155155
+ }
156-
+#define CALL_CEF_DELEGATE_RETURN(name, ...) \
157-
+ if (cef_browser_delegate_) { \
156+
+#define CALL_CEF_DELEGATE_RETURN(name, ...) \
157+
+ if (cef_browser_delegate_) { \
158158
+ return cef_browser_delegate_->name(__VA_ARGS__); \
159159
+ }
160-
+#define CALL_CEF_DELEGATE_RESULT(name, result, ...) \
161-
+ if (cef_browser_delegate_) { \
160+
+#define CALL_CEF_DELEGATE_RESULT(name, result, ...) \
161+
+ if (cef_browser_delegate_) { \
162162
+ result = cef_browser_delegate_->name(__VA_ARGS__); \
163163
+ }
164164
+#else // !BUILDFLAG(ENABLE_CEF)
@@ -203,22 +203,23 @@ index fafd84d08e336..a17aad8f37537 100644
203203
}
204204

205205
void Browser::FullscreenTopUIStateChanged() {
206-
@@ -1752,6 +1783,14 @@ content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent(
206+
@@ -1752,6 +1783,15 @@ content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent(
207207
return content::KeyboardEventProcessingResult::HANDLED;
208208
}
209209

210210
+#if BUILDFLAG(ENABLE_CEF)
211211
+ if (cef_browser_delegate_) {
212212
+ auto result = cef_browser_delegate_->PreHandleKeyboardEvent(source, event);
213-
+ if (result != content::KeyboardEventProcessingResult::NOT_HANDLED)
213+
+ if (result != content::KeyboardEventProcessingResult::NOT_HANDLED) {
214214
+ return result;
215+
+ }
215216
+ }
216217
+#endif
217218
+
218219
return window()->PreHandleKeyboardEvent(event);
219220
}
220221

221-
@@ -1759,8 +1798,18 @@ bool Browser::HandleKeyboardEvent(content::WebContents* source,
222+
@@ -1759,8 +1799,18 @@ bool Browser::HandleKeyboardEvent(content::WebContents* source,
222223
const NativeWebKeyboardEvent& event) {
223224
DevToolsWindow* devtools_window =
224225
DevToolsWindow::GetInstanceForInspectedWebContents(source);
@@ -239,7 +240,7 @@ index fafd84d08e336..a17aad8f37537 100644
239240
}
240241

241242
bool Browser::TabsNeedBeforeUnloadFired() const {
242-
@@ -1855,9 +1904,14 @@ bool Browser::IsBackForwardCacheSupported(content::WebContents& web_contents) {
243+
@@ -1855,9 +1905,14 @@ bool Browser::IsBackForwardCacheSupported(content::WebContents& web_contents) {
243244
content::PreloadingEligibility Browser::IsPrerender2Supported(
244245
content::WebContents& web_contents,
245246
content::PreloadingTriggerType trigger_type) {
@@ -254,7 +255,7 @@ index fafd84d08e336..a17aad8f37537 100644
254255
}
255256

256257
bool Browser::ShouldShowStaleContentOnEviction(content::WebContents* source) {
257-
@@ -1920,6 +1974,14 @@ WebContents* Browser::OpenURLFromTab(
258+
@@ -1920,6 +1975,14 @@ WebContents* Browser::OpenURLFromTab(
258259
std::move(navigation_handle_callback));
259260
}
260261

@@ -269,7 +270,7 @@ index fafd84d08e336..a17aad8f37537 100644
269270
NavigateParams nav_params(this, params.url, params.transition);
270271
nav_params.FillNavigateParamsFromOpenURLParams(params);
271272
nav_params.source_contents = source;
272-
@@ -2093,6 +2155,8 @@ void Browser::LoadingStateChanged(WebContents* source,
273+
@@ -2093,6 +2156,8 @@ void Browser::LoadingStateChanged(WebContents* source,
273274
bool should_show_loading_ui) {
274275
ScheduleUIUpdate(source, content::INVALIDATE_TYPE_LOAD);
275276
UpdateWindowForLoadingStateChanged(source, should_show_loading_ui);
@@ -278,7 +279,7 @@ index fafd84d08e336..a17aad8f37537 100644
278279
}
279280

280281
void Browser::CloseContents(WebContents* source) {
281-
@@ -2122,6 +2186,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) {
282+
@@ -2122,6 +2187,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) {
282283
}
283284

284285
void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
@@ -287,7 +288,7 @@ index fafd84d08e336..a17aad8f37537 100644
287288
if (!GetStatusBubble()) {
288289
return;
289290
}
290-
@@ -2131,6 +2197,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
291+
@@ -2131,6 +2198,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
291292
}
292293
}
293294

@@ -305,7 +306,11 @@ index fafd84d08e336..a17aad8f37537 100644
305306
void Browser::ContentsMouseEvent(WebContents* source, const ui::Event& event) {
306307
const ui::EventType type = event.type();
307308
const bool exited = type == ui::EventType::kMouseExited;
308-
@@ -2159,6 +2236,19 @@ bool Browser::TakeFocus(content::WebContents* source, bool reverse) {
309+
@@ -2156,9 +2234,23 @@ void Browser::ContentsZoomChange(bool zoom_in) {
310+
}
311+
312+
bool Browser::TakeFocus(content::WebContents* source, bool reverse) {
313+
+ CALL_CEF_DELEGATE_RETURN(TakeFocus, source, reverse);
309314
return false;
310315
}
311316

@@ -325,7 +330,7 @@ index fafd84d08e336..a17aad8f37537 100644
325330
void Browser::BeforeUnloadFired(WebContents* web_contents,
326331
bool proceed,
327332
bool* proceed_to_fire_unload) {
328-
@@ -2271,12 +2361,24 @@ void Browser::WebContentsCreated(WebContents* source_contents,
333+
@@ -2271,12 +2363,24 @@ void Browser::WebContentsCreated(WebContents* source_contents,
329334
// to track `new_contents` after it is added to its TabModel this override can
330335
// be removed.
331336
CreateSessionServiceTabHelper(new_contents);
@@ -350,7 +355,7 @@ index fafd84d08e336..a17aad8f37537 100644
350355
// Don't show the page hung dialog when a HTML popup hangs because
351356
// the dialog will take the focus and immediately close the popup.
352357
RenderWidgetHostView* view = render_widget_host->GetView();
353-
@@ -2289,6 +2391,13 @@ void Browser::RendererUnresponsive(
358+
@@ -2289,6 +2393,13 @@ void Browser::RendererUnresponsive(
354359
void Browser::RendererResponsive(
355360
WebContents* source,
356361
content::RenderWidgetHost* render_widget_host) {
@@ -364,7 +369,7 @@ index fafd84d08e336..a17aad8f37537 100644
364369
RenderWidgetHostView* view = render_widget_host->GetView();
365370
if (view && !render_widget_host->GetView()->IsHTMLFormPopup()) {
366371
TabDialogs::FromWebContents(source)->HideHungRendererDialog(
367-
@@ -2298,6 +2407,15 @@ void Browser::RendererResponsive(
372+
@@ -2298,6 +2409,15 @@ void Browser::RendererResponsive(
368373

369374
content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager(
370375
WebContents* source) {
@@ -380,7 +385,7 @@ index fafd84d08e336..a17aad8f37537 100644
380385
return javascript_dialogs::TabModalDialogManager::FromWebContents(source);
381386
}
382387

383-
@@ -2333,6 +2451,11 @@ void Browser::DraggableRegionsChanged(
388+
@@ -2333,6 +2453,11 @@ void Browser::DraggableRegionsChanged(
384389
if (app_controller_) {
385390
app_controller_->DraggableRegionsChanged(regions, contents);
386391
}
@@ -392,7 +397,7 @@ index fafd84d08e336..a17aad8f37537 100644
392397
}
393398

394399
void Browser::DidFinishNavigation(
395-
@@ -2415,11 +2538,15 @@ void Browser::EnterFullscreenModeForTab(
400+
@@ -2415,11 +2540,15 @@ void Browser::EnterFullscreenModeForTab(
396401
const blink::mojom::FullscreenOptions& options) {
397402
exclusive_access_manager_->fullscreen_controller()->EnterFullscreenModeForTab(
398403
requesting_frame, options.display_id);
@@ -408,23 +413,24 @@ index fafd84d08e336..a17aad8f37537 100644
408413
}
409414

410415
bool Browser::IsFullscreenForTabOrPending(const WebContents* web_contents) {
411-
@@ -2629,6 +2756,15 @@ void Browser::RequestMediaAccessPermission(
416+
@@ -2629,6 +2758,16 @@ void Browser::RequestMediaAccessPermission(
412417
content::WebContents* web_contents,
413418
const content::MediaStreamRequest& request,
414419
content::MediaResponseCallback callback) {
415420
+#if BUILDFLAG(ENABLE_CEF)
416421
+ if (cef_browser_delegate_) {
417422
+ callback = cef_browser_delegate_->RequestMediaAccessPermissionEx(
418423
+ web_contents, request, std::move(callback));
419-
+ if (callback.is_null())
424+
+ if (callback.is_null()) {
420425
+ return;
426+
+ }
421427
+ }
422428
+#endif
423429
+
424430
const extensions::Extension* extension =
425431
GetExtensionForOrigin(profile_, request.security_origin);
426432
MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest(
427-
@@ -3211,9 +3347,10 @@ void Browser::RemoveScheduledUpdatesFor(WebContents* contents) {
433+
@@ -3211,9 +3350,10 @@ void Browser::RemoveScheduledUpdatesFor(WebContents* contents) {
428434
// Browser, Getters for UI (private):
429435

430436
StatusBubble* Browser::GetStatusBubble() {
@@ -436,7 +442,7 @@ index fafd84d08e336..a17aad8f37537 100644
436442
}
437443

438444
// We hide the status bar for web apps windows as this matches native
439-
@@ -3221,6 +3358,12 @@ StatusBubble* Browser::GetStatusBubble() {
445+
@@ -3221,6 +3361,12 @@ StatusBubble* Browser::GetStatusBubble() {
440446
// mode, as the minimal browser UI includes the status bar.
441447
if (web_app::AppBrowserController::IsWebApp(this) &&
442448
!app_controller()->HasMinimalUiButtons()) {
@@ -449,7 +455,7 @@ index fafd84d08e336..a17aad8f37537 100644
449455
return nullptr;
450456
}
451457

452-
@@ -3370,6 +3513,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
458+
@@ -3370,6 +3516,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
453459
BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this);
454460
web_contents_collection_.StopObserving(web_contents);
455461
}
@@ -458,7 +464,7 @@ index fafd84d08e336..a17aad8f37537 100644
458464
}
459465

460466
void Browser::TabDetachedAtImpl(content::WebContents* contents,
461-
@@ -3530,6 +3675,14 @@ bool Browser::PictureInPictureBrowserSupportsWindowFeature(
467+
@@ -3530,6 +3678,14 @@ bool Browser::PictureInPictureBrowserSupportsWindowFeature(
462468

463469
bool Browser::SupportsWindowFeatureImpl(WindowFeature feature,
464470
bool check_can_support) const {

0 commit comments

Comments
 (0)