mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Add chrome runtime support for more callbacks and ceftests (see issue #2969)
This change adds support for: - Protocol and request handling. - Loading and navigation events. - Display and focus events. - Mouse/keyboard events. - Popup browsers. - Callbacks in the renderer process. - Misc. functionality required for ceftests. This change also adds a new CefBrowserProcessHandler::GetCookieableSchemes callback for configuring global state that will be applied to all CefCookieManagers by default. This global callback is currently required by the chrome runtime because the primary ProfileImpl is created via ChromeBrowserMainParts::PreMainMessageLoopRun (CreatePrimaryProfile) before OnContextCreated can be called. ProfileImpl will use the "C:\Users\[user]\AppData\Local\CEF\User Data\Default" directory by default (on Windows). Cookies may persist in this directory when running ceftests and may need to be manually deleted if those tests fail. Remaining work includes: - Support for client-created request contexts. - Embedding the browser in a Views hierarchy (cefclient support). - TryCloseBrowser and DoClose support. - Most of the CefSettings configuration. - DevTools protocol and window control (ShowDevTools, ExecuteDevToolsMethod). - CEF-specific WebUI pages (about, license, webui-hosts). - Context menu customization (CefContextMenuHandler). - Auto resize (SetAutoResizeEnabled). - Zoom settings (SetZoomLevel). - File dialog runner (RunFileDialog). - File and JS dialog handlers (CefDialogHandler, CefJSDialogHandler). - Extension loading (LoadExtension, etc). - Plugin loading (OnBeforePluginLoad). - Widevine loading (CefRegisterWidevineCdm). - PDF and print preview does not display. - Crash reporting is untested. - Mac: Web content loads but does not display. The following ceftests are now passing when run with the "--enable-chrome-runtime" command-line flag: CorsTest.* DisplayTest.*:-DisplayTest.AutoResize DOMTest.* DraggableRegionsTest.* ImageTest.* MessageRouterTest.* NavigationTest.* ParserTest.* RequestContextTest.*Global* RequestTest.* ResourceManagerTest.* ResourceRequestHandlerTest.* ResponseTest.* SchemeHandlerTest.* ServerTest.* StreamResourceHandlerTest.* StreamTest.* StringTest.* TaskTest.* TestServerTest.* ThreadTest.* URLRequestTest.*Global* V8Test.*:-V8Test.OnUncaughtExceptionDevTools ValuesTest.* WaitableEventTest.* XmlReaderTest.* ZipReaderTest.*
This commit is contained in:
@@ -1,5 +1,19 @@
|
||||
diff --git chrome/browser/browser_about_handler.cc chrome/browser/browser_about_handler.cc
|
||||
index af2282034336..c49d920f73b5 100644
|
||||
--- chrome/browser/browser_about_handler.cc
|
||||
+++ chrome/browser/browser_about_handler.cc
|
||||
@@ -95,6 +95,9 @@ bool HandleNonNavigationAboutURL(const GURL& url) {
|
||||
FROM_HERE, base::BindOnce(&chrome::AttemptExit));
|
||||
return true;
|
||||
}
|
||||
+ if (base::LowerCaseEqualsASCII(spec, "chrome://ignore/")) {
|
||||
+ return true;
|
||||
+ }
|
||||
|
||||
return false;
|
||||
}
|
||||
diff --git chrome/browser/ui/browser.cc chrome/browser/ui/browser.cc
|
||||
index 71ec3bbbf1b6..8b99a3ac7de2 100644
|
||||
index 71ec3bbbf1b6..10d47a4f021e 100644
|
||||
--- chrome/browser/ui/browser.cc
|
||||
+++ chrome/browser/ui/browser.cc
|
||||
@@ -257,6 +257,20 @@
|
||||
@@ -37,7 +51,58 @@ index 71ec3bbbf1b6..8b99a3ac7de2 100644
|
||||
tab_strip_model_->AddObserver(this);
|
||||
|
||||
location_bar_model_ = std::make_unique<LocationBarModelImpl>(
|
||||
@@ -1713,6 +1734,8 @@ void Browser::LoadingStateChanged(WebContents* source,
|
||||
@@ -1318,6 +1339,14 @@ content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent(
|
||||
if (exclusive_access_manager_->HandleUserKeyEvent(event))
|
||||
return content::KeyboardEventProcessingResult::HANDLED;
|
||||
|
||||
+#if BUILDFLAG(ENABLE_CEF)
|
||||
+ if (cef_browser_delegate_) {
|
||||
+ auto result = cef_browser_delegate_->PreHandleKeyboardEvent(source, event);
|
||||
+ if (result != content::KeyboardEventProcessingResult::NOT_HANDLED)
|
||||
+ return result;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
return window()->PreHandleKeyboardEvent(event);
|
||||
}
|
||||
|
||||
@@ -1325,8 +1354,18 @@ bool Browser::HandleKeyboardEvent(content::WebContents* source,
|
||||
const NativeWebKeyboardEvent& event) {
|
||||
DevToolsWindow* devtools_window =
|
||||
DevToolsWindow::GetInstanceForInspectedWebContents(source);
|
||||
- return (devtools_window && devtools_window->ForwardKeyboardEvent(event)) ||
|
||||
- window()->HandleKeyboardEvent(event);
|
||||
+ if (devtools_window && devtools_window->ForwardKeyboardEvent(event)) {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+#if BUILDFLAG(ENABLE_CEF)
|
||||
+ if (cef_browser_delegate_ &&
|
||||
+ cef_browser_delegate_->HandleKeyboardEvent(source, event)) {
|
||||
+ return true;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+ return window()->HandleKeyboardEvent(event);
|
||||
}
|
||||
|
||||
bool Browser::TabsNeedBeforeUnloadFired() {
|
||||
@@ -1601,6 +1640,14 @@ WebContents* Browser::OpenURLFromTab(WebContents* source,
|
||||
return window->OpenURLFromTab(source, params);
|
||||
}
|
||||
|
||||
+#if BUILDFLAG(ENABLE_CEF)
|
||||
+ if (cef_browser_delegate_) {
|
||||
+ auto web_contents = cef_browser_delegate_->OpenURLFromTab(source, params);
|
||||
+ if (!web_contents)
|
||||
+ return nullptr;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
NavigateParams nav_params(this, params.url, params.transition);
|
||||
nav_params.FillNavigateParamsFromOpenURLParams(params);
|
||||
nav_params.source_contents = source;
|
||||
@@ -1713,6 +1760,8 @@ void Browser::LoadingStateChanged(WebContents* source,
|
||||
bool to_different_document) {
|
||||
ScheduleUIUpdate(source, content::INVALIDATE_TYPE_LOAD);
|
||||
UpdateWindowForLoadingStateChanged(source, to_different_document);
|
||||
@@ -46,7 +111,7 @@ index 71ec3bbbf1b6..8b99a3ac7de2 100644
|
||||
}
|
||||
|
||||
void Browser::CloseContents(WebContents* source) {
|
||||
@@ -1740,6 +1763,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) {
|
||||
@@ -1740,6 +1789,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) {
|
||||
}
|
||||
|
||||
void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
|
||||
@@ -55,7 +120,7 @@ index 71ec3bbbf1b6..8b99a3ac7de2 100644
|
||||
if (!GetStatusBubble())
|
||||
return;
|
||||
|
||||
@@ -1747,6 +1772,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
|
||||
@@ -1747,6 +1798,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
|
||||
GetStatusBubble()->SetURL(url);
|
||||
}
|
||||
|
||||
@@ -73,7 +138,18 @@ index 71ec3bbbf1b6..8b99a3ac7de2 100644
|
||||
void Browser::ContentsMouseEvent(WebContents* source,
|
||||
bool motion,
|
||||
bool exited) {
|
||||
@@ -1899,6 +1935,8 @@ void Browser::RendererResponsive(
|
||||
@@ -1863,6 +1925,10 @@ void Browser::WebContentsCreated(WebContents* source_contents,
|
||||
|
||||
// Make the tab show up in the task manager.
|
||||
task_manager::WebContentsTags::CreateForTabContents(new_contents);
|
||||
+
|
||||
+ CALL_CEF_DELEGATE(WebContentsCreated, source_contents,
|
||||
+ opener_render_process_id, opener_render_frame_id,
|
||||
+ frame_name, target_url, new_contents);
|
||||
}
|
||||
|
||||
void Browser::PortalWebContentsCreated(WebContents* portal_web_contents) {
|
||||
@@ -1899,6 +1965,8 @@ void Browser::RendererResponsive(
|
||||
void Browser::DidNavigateMainFramePostCommit(WebContents* web_contents) {
|
||||
if (web_contents == tab_strip_model_->GetActiveWebContents())
|
||||
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE);
|
||||
@@ -82,7 +158,7 @@ index 71ec3bbbf1b6..8b99a3ac7de2 100644
|
||||
}
|
||||
|
||||
content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager(
|
||||
@@ -1949,11 +1987,15 @@ void Browser::EnterFullscreenModeForTab(
|
||||
@@ -1949,11 +2017,15 @@ void Browser::EnterFullscreenModeForTab(
|
||||
const blink::mojom::FullscreenOptions& options) {
|
||||
exclusive_access_manager_->fullscreen_controller()->EnterFullscreenModeForTab(
|
||||
requesting_frame, options.display_id);
|
||||
@@ -98,7 +174,7 @@ index 71ec3bbbf1b6..8b99a3ac7de2 100644
|
||||
}
|
||||
|
||||
bool Browser::IsFullscreenForTabOrPending(const WebContents* web_contents) {
|
||||
@@ -2814,6 +2856,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
|
||||
@@ -2814,6 +2886,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
|
||||
content_translate_driver->RemoveObserver(this);
|
||||
BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this);
|
||||
}
|
||||
@@ -178,3 +254,40 @@ index ab2a03e6e878..aef94abf4fd8 100644
|
||||
const base::ElapsedTimer creation_timer_;
|
||||
|
||||
// Stores the list of browser windows showing via a menu.
|
||||
diff --git chrome/browser/ui/browser_navigator.cc chrome/browser/ui/browser_navigator.cc
|
||||
index 6d6a3b90dcad..fbfe4a0c959c 100644
|
||||
--- chrome/browser/ui/browser_navigator.cc
|
||||
+++ chrome/browser/ui/browser_navigator.cc
|
||||
@@ -435,6 +435,13 @@ std::unique_ptr<content::WebContents> CreateTargetContents(
|
||||
std::unique_ptr<WebContents> target_contents =
|
||||
WebContents::Create(create_params);
|
||||
|
||||
+#if BUILDFLAG(ENABLE_CEF)
|
||||
+ auto cef_delegate = params.browser->cef_delegate();
|
||||
+ if (cef_delegate) {
|
||||
+ cef_delegate->OnWebContentsCreated(target_contents.get());
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
// New tabs can have WebUI URLs that will make calls back to arbitrary
|
||||
// tab helpers, so the entire set of tab helpers needs to be set up
|
||||
// immediately.
|
||||
diff --git chrome/browser/ui/browser_tabstrip.cc chrome/browser/ui/browser_tabstrip.cc
|
||||
index c8df2ade2443..0e350adda289 100644
|
||||
--- chrome/browser/ui/browser_tabstrip.cc
|
||||
+++ chrome/browser/ui/browser_tabstrip.cc
|
||||
@@ -28,9 +28,13 @@ void AddTabAt(Browser* browser,
|
||||
// Time new tab page creation time. We keep track of the timing data in
|
||||
// WebContents, but we want to include the time it takes to create the
|
||||
// WebContents object too.
|
||||
+ // For CEF use a PageTransition that matches
|
||||
+ // CefFrameHostImpl::kPageTransitionExplicit.
|
||||
base::TimeTicks new_tab_start_time = base::TimeTicks::Now();
|
||||
NavigateParams params(browser, url.is_empty() ? browser->GetNewTabURL() : url,
|
||||
- ui::PAGE_TRANSITION_TYPED);
|
||||
+ static_cast<ui::PageTransition>(
|
||||
+ ui::PAGE_TRANSITION_TYPED |
|
||||
+ ui::PAGE_TRANSITION_FROM_ADDRESS_BAR));
|
||||
params.disposition = foreground ? WindowOpenDisposition::NEW_FOREGROUND_TAB
|
||||
: WindowOpenDisposition::NEW_BACKGROUND_TAB;
|
||||
params.tabstrip_index = idx;
|
||||
|
Reference in New Issue
Block a user