1diff --git chrome/browser/browser_about_handler.cc chrome/browser/browser_about_handler.cc 2index 9e534ff1683f1..de406f5879be0 100644 3--- chrome/browser/browser_about_handler.cc 4+++ chrome/browser/browser_about_handler.cc 5@@ -70,6 +70,9 @@ bool HandleNonNavigationAboutURL(const GURL& url) { 6 FROM_HERE, base::BindOnce(&chrome::AttemptExit)); 7 return true; 8 } 9+ if (base::LowerCaseEqualsASCII(spec, "chrome://ignore/")) { 10+ return true; 11+ } 12 13 return false; 14 } 15diff --git chrome/browser/ui/browser.cc chrome/browser/ui/browser.cc 16index a7a64effed043..f2d36a884b278 100644 17--- chrome/browser/ui/browser.cc 18+++ chrome/browser/ui/browser.cc 19@@ -262,6 +262,20 @@ 20 #include "components/captive_portal/content/captive_portal_tab_helper.h" 21 #endif 22 23+#if BUILDFLAG(ENABLE_CEF) 24+#define CALL_CEF_DELEGATE(name, ...) \ 25+ if (cef_browser_delegate_) { \ 26+ cef_browser_delegate_->name(__VA_ARGS__); \ 27+ } 28+#define CALL_CEF_DELEGATE_RETURN(name, ...) \ 29+ if (cef_browser_delegate_) { \ 30+ return cef_browser_delegate_->name(__VA_ARGS__); \ 31+ } 32+#else // !BUILDFLAG(ENABLE_CEF) 33+#define CALL_CEF_DELEGATE(name, ...) 34+#define CALL_CEF_DELEGATE_RETURN(name, ...) 35+#endif 36+ 37 #if BUILDFLAG(ENABLE_EXTENSIONS) 38 #include "chrome/browser/extensions/extension_browser_window_helper.h" 39 #endif 40@@ -498,6 +512,13 @@ Browser::Browser(const CreateParams& params) 41 42 tab_strip_model_->AddObserver(this); 43 44+#if BUILDFLAG(ENABLE_CEF) 45+ if (cef::IsChromeRuntimeEnabled()) { 46+ cef_browser_delegate_ = 47+ cef::BrowserDelegate::Create(this, params.cef_params); 48+ } 49+#endif 50+ 51 location_bar_model_ = std::make_unique<LocationBarModelImpl>( 52 location_bar_model_delegate_.get(), content::kMaxURLDisplayChars); 53 54@@ -1320,6 +1341,14 @@ content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent( 55 if (exclusive_access_manager_->HandleUserKeyEvent(event)) 56 return content::KeyboardEventProcessingResult::HANDLED; 57 58+#if BUILDFLAG(ENABLE_CEF) 59+ if (cef_browser_delegate_) { 60+ auto result = cef_browser_delegate_->PreHandleKeyboardEvent(source, event); 61+ if (result != content::KeyboardEventProcessingResult::NOT_HANDLED) 62+ return result; 63+ } 64+#endif 65+ 66 return window()->PreHandleKeyboardEvent(event); 67 } 68 69@@ -1327,8 +1356,18 @@ bool Browser::HandleKeyboardEvent(content::WebContents* source, 70 const NativeWebKeyboardEvent& event) { 71 DevToolsWindow* devtools_window = 72 DevToolsWindow::GetInstanceForInspectedWebContents(source); 73- return (devtools_window && devtools_window->ForwardKeyboardEvent(event)) || 74- window()->HandleKeyboardEvent(event); 75+ if (devtools_window && devtools_window->ForwardKeyboardEvent(event)) { 76+ return true; 77+ } 78+ 79+#if BUILDFLAG(ENABLE_CEF) 80+ if (cef_browser_delegate_ && 81+ cef_browser_delegate_->HandleKeyboardEvent(source, event)) { 82+ return true; 83+ } 84+#endif 85+ 86+ return window()->HandleKeyboardEvent(event); 87 } 88 89 bool Browser::TabsNeedBeforeUnloadFired() { 90@@ -1533,6 +1572,14 @@ WebContents* Browser::OpenURLFromTab(WebContents* source, 91 return window->OpenURLFromTab(source, params); 92 } 93 94+#if BUILDFLAG(ENABLE_CEF) 95+ if (cef_browser_delegate_) { 96+ auto web_contents = cef_browser_delegate_->OpenURLFromTab(source, params); 97+ if (!web_contents) 98+ return nullptr; 99+ } 100+#endif 101+ 102 NavigateParams nav_params(this, params.url, params.transition); 103 nav_params.FillNavigateParamsFromOpenURLParams(params); 104 nav_params.source_contents = source; 105@@ -1632,6 +1679,15 @@ void Browser::AddNewContents(WebContents* source, 106 source, disposition); 107 } 108 109+#if BUILDFLAG(ENABLE_CEF) 110+ if (cef_browser_delegate_) { 111+ cef_browser_delegate_->AddNewContents( 112+ source, std::move(new_contents), target_url, disposition, initial_rect, 113+ user_gesture, was_blocked); 114+ return; 115+ } 116+#endif 117+ 118 chrome::AddWebContents(this, source, std::move(new_contents), target_url, 119 disposition, initial_rect); 120 } 121@@ -1650,6 +1706,8 @@ void Browser::LoadingStateChanged(WebContents* source, 122 bool should_show_loading_ui) { 123 ScheduleUIUpdate(source, content::INVALIDATE_TYPE_LOAD); 124 UpdateWindowForLoadingStateChanged(source, should_show_loading_ui); 125+ 126+ CALL_CEF_DELEGATE(LoadingStateChanged, source, should_show_loading_ui); 127 } 128 129 void Browser::CloseContents(WebContents* source) { 130@@ -1677,6 +1735,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) { 131 } 132 133 void Browser::UpdateTargetURL(WebContents* source, const GURL& url) { 134+ CALL_CEF_DELEGATE(UpdateTargetURL, source, url); 135+ 136 if (!GetStatusBubble()) 137 return; 138 139@@ -1684,6 +1744,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) { 140 GetStatusBubble()->SetURL(url); 141 } 142 143+bool Browser::DidAddMessageToConsole( 144+ content::WebContents* source, 145+ blink::mojom::ConsoleMessageLevel log_level, 146+ const std::u16string& message, 147+ int32_t line_no, 148+ const std::u16string& source_id) { 149+ CALL_CEF_DELEGATE_RETURN(DidAddMessageToConsole, source, log_level, message, 150+ line_no, source_id); 151+ return false; 152+} 153+ 154 void Browser::ContentsMouseEvent(WebContents* source, 155 bool motion, 156 bool exited) { 157@@ -1800,6 +1871,10 @@ void Browser::WebContentsCreated(WebContents* source_contents, 158 159 // Make the tab show up in the task manager. 160 task_manager::WebContentsTags::CreateForTabContents(new_contents); 161+ 162+ CALL_CEF_DELEGATE(WebContentsCreated, source_contents, 163+ opener_render_process_id, opener_render_frame_id, 164+ frame_name, target_url, new_contents); 165 } 166 167 void Browser::PortalWebContentsCreated(WebContents* portal_web_contents) { 168@@ -1844,6 +1919,8 @@ void Browser::RendererResponsive( 169 void Browser::DidNavigatePrimaryMainFramePostCommit(WebContents* web_contents) { 170 if (web_contents == tab_strip_model_->GetActiveWebContents()) 171 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 172+ 173+ CALL_CEF_DELEGATE(DidNavigatePrimaryMainFramePostCommit, web_contents); 174 } 175 176 content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager( 177@@ -1890,11 +1967,15 @@ void Browser::EnterFullscreenModeForTab( 178 const blink::mojom::FullscreenOptions& options) { 179 exclusive_access_manager_->fullscreen_controller()->EnterFullscreenModeForTab( 180 requesting_frame, options.display_id); 181+ 182+ CALL_CEF_DELEGATE(EnterFullscreenModeForTab, requesting_frame, options); 183 } 184 185 void Browser::ExitFullscreenModeForTab(WebContents* web_contents) { 186 exclusive_access_manager_->fullscreen_controller()->ExitFullscreenModeForTab( 187 web_contents); 188+ 189+ CALL_CEF_DELEGATE(ExitFullscreenModeForTab, web_contents); 190 } 191 192 bool Browser::IsFullscreenForTabOrPending(const WebContents* web_contents) { 193@@ -2737,6 +2818,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { 194 content_translate_driver->RemoveTranslationObserver(this); 195 BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this); 196 } 197+ 198+ CALL_CEF_DELEGATE(SetAsDelegate, web_contents, set_delegate); 199 } 200 201 void Browser::TabDetachedAtImpl(content::WebContents* contents, 202diff --git chrome/browser/ui/browser.h chrome/browser/ui/browser.h 203index 1cda451616290..2272fb467e055 100644 204--- chrome/browser/ui/browser.h 205+++ chrome/browser/ui/browser.h 206@@ -21,6 +21,7 @@ 207 #include "base/timer/elapsed_timer.h" 208 #include "build/build_config.h" 209 #include "build/chromeos_buildflags.h" 210+#include "cef/libcef/features/runtime.h" 211 #include "chrome/browser/themes/theme_service_observer.h" 212 #include "chrome/browser/ui/bookmarks/bookmark_bar.h" 213 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper_observer.h" 214@@ -45,6 +46,10 @@ 215 #include "ui/gfx/geometry/rect.h" 216 #include "ui/shell_dialogs/select_file_dialog.h" 217 218+#if BUILDFLAG(ENABLE_CEF) 219+#include "cef/libcef/browser/chrome/browser_delegate.h" 220+#endif 221+ 222 #if BUILDFLAG(IS_ANDROID) 223 #error This file should only be included on desktop. 224 #endif 225@@ -292,6 +297,11 @@ class Browser : public TabStripModelObserver, 226 // maximizable. 227 bool can_maximize = true; 228 229+#if BUILDFLAG(ENABLE_CEF) 230+ // Opaque CEF-specific configuration. Will be propagated to new Browsers. 231+ scoped_refptr<cef::BrowserDelegate::CreateParams> cef_params; 232+#endif 233+ 234 private: 235 friend class Browser; 236 friend class WindowSizerChromeOSTest; 237@@ -359,6 +369,13 @@ class Browser : public TabStripModelObserver, 238 return creation_source_ == CreationSource::kSessionRestore; 239 } 240 241+ // Return true if CEF will expose the toolbar to the client. This value is 242+ // used to selectively enable toolbar behaviors such as command processing 243+ // and omnibox focus without also including the toolbar in BrowserView layout 244+ // calculations. 245+ void set_toolbar_overridden(bool val) { toolbar_overridden_ = val; } 246+ bool toolbar_overridden() const { return toolbar_overridden_; } 247+ 248 // Accessors //////////////////////////////////////////////////////////////// 249 250 const CreateParams& create_params() const { return create_params_; } 251@@ -432,6 +449,12 @@ class Browser : public TabStripModelObserver, 252 253 base::WeakPtr<Browser> AsWeakPtr(); 254 255+#if BUILDFLAG(ENABLE_CEF) 256+ cef::BrowserDelegate* cef_delegate() const { 257+ return cef_browser_delegate_.get(); 258+ } 259+#endif 260+ 261 // Get the FindBarController for this browser, creating it if it does not 262 // yet exist. 263 FindBarController* GetFindBarController(); 264@@ -796,6 +819,11 @@ class Browser : public TabStripModelObserver, 265 void SetContentsBounds(content::WebContents* source, 266 const gfx::Rect& bounds) override; 267 void UpdateTargetURL(content::WebContents* source, const GURL& url) override; 268+ bool DidAddMessageToConsole(content::WebContents* source, 269+ blink::mojom::ConsoleMessageLevel log_level, 270+ const std::u16string& message, 271+ int32_t line_no, 272+ const std::u16string& source_id) override; 273 void ContentsMouseEvent(content::WebContents* source, 274 bool motion, 275 bool exited) override; 276@@ -1191,6 +1219,8 @@ class Browser : public TabStripModelObserver, 277 const std::string initial_workspace_; 278 bool initial_visible_on_all_workspaces_state_; 279 280+ bool toolbar_overridden_ = false; 281+ 282 CreationSource creation_source_ = CreationSource::kUnknown; 283 284 UnloadController unload_controller_; 285@@ -1252,6 +1282,10 @@ class Browser : public TabStripModelObserver, 286 extension_browser_window_helper_; 287 #endif 288 289+#if BUILDFLAG(ENABLE_CEF) 290+ std::unique_ptr<cef::BrowserDelegate> cef_browser_delegate_; 291+#endif 292+ 293 const base::ElapsedTimer creation_timer_; 294 295 // The following factory is used for chrome update coalescing. 296diff --git chrome/browser/ui/browser_navigator.cc chrome/browser/ui/browser_navigator.cc 297index 8b0052125942c..a121e1086eaeb 100644 298--- chrome/browser/ui/browser_navigator.cc 299+++ chrome/browser/ui/browser_navigator.cc 300@@ -477,6 +477,13 @@ std::unique_ptr<content::WebContents> CreateTargetContents( 301 std::unique_ptr<WebContents> target_contents = 302 WebContents::Create(create_params); 303 304+#if BUILDFLAG(ENABLE_CEF) 305+ auto cef_delegate = params.browser->cef_delegate(); 306+ if (cef_delegate) { 307+ cef_delegate->OnWebContentsCreated(target_contents.get()); 308+ } 309+#endif 310+ 311 // New tabs can have WebUI URLs that will make calls back to arbitrary 312 // tab helpers, so the entire set of tab helpers needs to be set up 313 // immediately. 314diff --git chrome/browser/ui/browser_tabstrip.cc chrome/browser/ui/browser_tabstrip.cc 315index 40907675219d3..19e1093947ed0 100644 316--- chrome/browser/ui/browser_tabstrip.cc 317+++ chrome/browser/ui/browser_tabstrip.cc 318@@ -30,9 +30,13 @@ void AddTabAt(Browser* browser, 319 // Time new tab page creation time. We keep track of the timing data in 320 // WebContents, but we want to include the time it takes to create the 321 // WebContents object too. 322+ // For CEF use a PageTransition that matches 323+ // CefFrameHostImpl::kPageTransitionExplicit. 324 base::TimeTicks new_tab_start_time = base::TimeTicks::Now(); 325 NavigateParams params(browser, url.is_empty() ? browser->GetNewTabURL() : url, 326- ui::PAGE_TRANSITION_TYPED); 327+ static_cast<ui::PageTransition>( 328+ ui::PAGE_TRANSITION_TYPED | 329+ ui::PAGE_TRANSITION_FROM_ADDRESS_BAR)); 330 params.disposition = foreground ? WindowOpenDisposition::NEW_FOREGROUND_TAB 331 : WindowOpenDisposition::NEW_BACKGROUND_TAB; 332 params.tabstrip_index = idx; 333