• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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