474 lines
18 KiB
Diff
474 lines
18 KiB
Diff
diff --git chrome/browser/browser_about_handler.cc chrome/browser/browser_about_handler.cc
|
|
index 2ffda8141468b..1800b34155201 100644
|
|
--- chrome/browser/browser_about_handler.cc
|
|
+++ chrome/browser/browser_about_handler.cc
|
|
@@ -69,6 +69,9 @@ bool HandleNonNavigationAboutURL(const GURL& url) {
|
|
FROM_HERE, base::BindOnce(&chrome::AttemptExit));
|
|
return true;
|
|
}
|
|
+ if (base::EqualsCaseInsensitiveASCII(spec, "chrome://ignore/")) {
|
|
+ return true;
|
|
+ }
|
|
|
|
return false;
|
|
}
|
|
diff --git chrome/browser/ui/BUILD.gn chrome/browser/ui/BUILD.gn
|
|
index 932388c328889..f5b0894158537 100644
|
|
--- chrome/browser/ui/BUILD.gn
|
|
+++ chrome/browser/ui/BUILD.gn
|
|
@@ -9,6 +9,7 @@ import("//build/config/compiler/compiler.gni")
|
|
import("//build/config/features.gni")
|
|
import("//build/config/ozone.gni")
|
|
import("//build/config/ui.gni")
|
|
+import("//cef/libcef/features/features.gni")
|
|
import("//chrome/browser/buildflags.gni")
|
|
import("//chrome/common/features.gni")
|
|
import("//chromeos/ash/components/assistant/assistant.gni")
|
|
@@ -363,6 +364,10 @@ static_library("ui") {
|
|
"//build/config/compiler:wexit_time_destructors",
|
|
]
|
|
|
|
+ if (enable_cef) {
|
|
+ configs += [ "//cef/libcef/features:config" ]
|
|
+ }
|
|
+
|
|
# Since browser and browser_ui actually depend on each other,
|
|
# we must omit the dependency from browser_ui to browser.
|
|
# However, this means browser_ui and browser should more or less
|
|
@@ -386,6 +391,7 @@ static_library("ui") {
|
|
"//build:chromeos_buildflags",
|
|
"//build/config/chromebox_for_meetings:buildflags",
|
|
"//cc/paint",
|
|
+ "//cef/libcef/features",
|
|
"//chrome:extra_resources",
|
|
"//chrome:resources",
|
|
"//chrome:strings",
|
|
@@ -2506,6 +2512,8 @@ static_library("ui") {
|
|
"views/apps/app_dialog/app_block_dialog_view.h",
|
|
"views/apps/app_dialog/app_pause_dialog_view.cc",
|
|
"views/apps/app_dialog/app_pause_dialog_view.h",
|
|
+ "views/apps/app_dialog/app_uninstall_dialog_view.cc",
|
|
+ "views/apps/app_dialog/app_uninstall_dialog_view.h",
|
|
"views/apps/app_info_dialog/arc_app_info_links_panel.cc",
|
|
"views/apps/app_info_dialog/arc_app_info_links_panel.h",
|
|
"views/apps/chrome_app_window_client_views_chromeos.cc",
|
|
@@ -4242,8 +4250,6 @@ static_library("ui") {
|
|
"views/accessibility/theme_tracking_non_accessible_image_view.h",
|
|
"views/apps/app_dialog/app_dialog_view.cc",
|
|
"views/apps/app_dialog/app_dialog_view.h",
|
|
- "views/apps/app_dialog/app_uninstall_dialog_view.cc",
|
|
- "views/apps/app_dialog/app_uninstall_dialog_view.h",
|
|
"views/apps/app_info_dialog/app_info_dialog_container.cc",
|
|
"views/apps/app_info_dialog/app_info_dialog_container.h",
|
|
"views/apps/app_info_dialog/app_info_dialog_views.cc",
|
|
@@ -5727,6 +5733,7 @@ static_library("ui") {
|
|
if (enable_printing) {
|
|
deps += [
|
|
"//components/printing/browser",
|
|
+ "//components/printing/common:mojo_interfaces",
|
|
"//printing",
|
|
]
|
|
}
|
|
diff --git chrome/browser/ui/browser.cc chrome/browser/ui/browser.cc
|
|
index a839ea0969600..b92b5a30ec2e1 100644
|
|
--- chrome/browser/ui/browser.cc
|
|
+++ chrome/browser/ui/browser.cc
|
|
@@ -265,6 +265,25 @@
|
|
#include "components/captive_portal/content/captive_portal_tab_helper.h"
|
|
#endif
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+#define CALL_CEF_DELEGATE(name, ...) \
|
|
+ if (cef_browser_delegate_) { \
|
|
+ cef_browser_delegate_->name(__VA_ARGS__); \
|
|
+ }
|
|
+#define CALL_CEF_DELEGATE_RETURN(name, ...) \
|
|
+ if (cef_browser_delegate_) { \
|
|
+ return cef_browser_delegate_->name(__VA_ARGS__); \
|
|
+ }
|
|
+#define CALL_CEF_DELEGATE_RESULT(name, result, ...) \
|
|
+ if (cef_browser_delegate_) { \
|
|
+ result = cef_browser_delegate_->name(__VA_ARGS__); \
|
|
+ }
|
|
+#else // !BUILDFLAG(ENABLE_CEF)
|
|
+#define CALL_CEF_DELEGATE(name, ...)
|
|
+#define CALL_CEF_DELEGATE_RETURN(name, ...)
|
|
+#define CALL_CEF_DELEGATE_RESULT(name, result, ...)
|
|
+#endif
|
|
+
|
|
#if BUILDFLAG(ENABLE_EXTENSIONS)
|
|
#include "chrome/browser/extensions/extension_browser_window_helper.h"
|
|
#endif
|
|
@@ -508,6 +527,13 @@ Browser::Browser(const CreateParams& params)
|
|
|
|
tab_strip_model_->AddObserver(this);
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+ if (cef::IsChromeRuntimeEnabled()) {
|
|
+ cef_browser_delegate_ =
|
|
+ cef::BrowserDelegate::Create(this, params.cef_params);
|
|
+ }
|
|
+#endif
|
|
+
|
|
location_bar_model_ = std::make_unique<LocationBarModelImpl>(
|
|
location_bar_model_delegate_.get(), content::kMaxURLDisplayChars);
|
|
|
|
@@ -645,6 +671,12 @@ Browser::~Browser() {
|
|
// away so they don't try and call back to us.
|
|
if (select_file_dialog_.get())
|
|
select_file_dialog_->ListenerDestroyed();
|
|
+
|
|
+ // Clean up any objects attached via UserData before implicit destruction
|
|
+ // of CreateParams. Destruction of those objects may call into something
|
|
+ // (ProfileImpl, PrefService, etc) that will be destroyed when the last
|
|
+ // CefRequestContextImpl reference (held by CreateParams) is released.
|
|
+ ClearAllUserData();
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
@@ -1337,6 +1369,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);
|
|
}
|
|
|
|
@@ -1344,8 +1384,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() {
|
|
@@ -1554,6 +1604,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;
|
|
@@ -1684,6 +1742,15 @@ void Browser::AddNewContents(
|
|
return;
|
|
}
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+ if (cef_browser_delegate_) {
|
|
+ cef_browser_delegate_->AddNewContents(
|
|
+ source, std::move(new_contents), target_url, disposition,
|
|
+ window_features, user_gesture, was_blocked);
|
|
+ return;
|
|
+ }
|
|
+#endif
|
|
+
|
|
chrome::AddWebContents(this, source, std::move(new_contents), target_url,
|
|
disposition, window_features, window_action);
|
|
}
|
|
@@ -1702,6 +1769,8 @@ void Browser::LoadingStateChanged(WebContents* source,
|
|
bool should_show_loading_ui) {
|
|
ScheduleUIUpdate(source, content::INVALIDATE_TYPE_LOAD);
|
|
UpdateWindowForLoadingStateChanged(source, should_show_loading_ui);
|
|
+
|
|
+ CALL_CEF_DELEGATE(LoadingStateChanged, source, should_show_loading_ui);
|
|
}
|
|
|
|
void Browser::CloseContents(WebContents* source) {
|
|
@@ -1729,6 +1798,8 @@ void Browser::SetContentsBounds(WebContents* source, const gfx::Rect& bounds) {
|
|
}
|
|
|
|
void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
|
|
+ CALL_CEF_DELEGATE(UpdateTargetURL, source, url);
|
|
+
|
|
if (!GetStatusBubble())
|
|
return;
|
|
|
|
@@ -1736,6 +1807,17 @@ void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
|
|
GetStatusBubble()->SetURL(url);
|
|
}
|
|
|
|
+bool Browser::DidAddMessageToConsole(
|
|
+ content::WebContents* source,
|
|
+ blink::mojom::ConsoleMessageLevel log_level,
|
|
+ const std::u16string& message,
|
|
+ int32_t line_no,
|
|
+ const std::u16string& source_id) {
|
|
+ CALL_CEF_DELEGATE_RETURN(DidAddMessageToConsole, source, log_level, message,
|
|
+ line_no, source_id);
|
|
+ return false;
|
|
+}
|
|
+
|
|
void Browser::ContentsMouseEvent(WebContents* source,
|
|
bool motion,
|
|
bool exited) {
|
|
@@ -1760,6 +1842,19 @@ bool Browser::TakeFocus(content::WebContents* source, bool reverse) {
|
|
return false;
|
|
}
|
|
|
|
+void Browser::CanDownload(const GURL& url,
|
|
+ const std::string& request_method,
|
|
+ base::OnceCallback<void(bool)> callback) {
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+ if (cef_browser_delegate_) {
|
|
+ cef_browser_delegate_->CanDownload(url, request_method,
|
|
+ std::move(callback));
|
|
+ return;
|
|
+ }
|
|
+#endif
|
|
+ std::move(callback).Run(true);
|
|
+}
|
|
+
|
|
void Browser::BeforeUnloadFired(WebContents* web_contents,
|
|
bool proceed,
|
|
bool* proceed_to_fire_unload) {
|
|
@@ -1852,6 +1947,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) {
|
|
@@ -1896,6 +1995,8 @@ void Browser::RendererResponsive(
|
|
void Browser::DidNavigatePrimaryMainFramePostCommit(WebContents* web_contents) {
|
|
if (web_contents == tab_strip_model_->GetActiveWebContents())
|
|
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE);
|
|
+
|
|
+ CALL_CEF_DELEGATE(DidNavigatePrimaryMainFramePostCommit, web_contents);
|
|
}
|
|
|
|
content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager(
|
|
@@ -1956,11 +2057,15 @@ void Browser::EnterFullscreenModeForTab(
|
|
const blink::mojom::FullscreenOptions& options) {
|
|
exclusive_access_manager_->fullscreen_controller()->EnterFullscreenModeForTab(
|
|
requesting_frame, options.display_id);
|
|
+
|
|
+ CALL_CEF_DELEGATE(EnterFullscreenModeForTab, requesting_frame, options);
|
|
}
|
|
|
|
void Browser::ExitFullscreenModeForTab(WebContents* web_contents) {
|
|
exclusive_access_manager_->fullscreen_controller()->ExitFullscreenModeForTab(
|
|
web_contents);
|
|
+
|
|
+ CALL_CEF_DELEGATE(ExitFullscreenModeForTab, web_contents);
|
|
}
|
|
|
|
bool Browser::IsFullscreenForTabOrPending(const WebContents* web_contents) {
|
|
@@ -2159,6 +2264,15 @@ void Browser::RequestMediaAccessPermission(
|
|
content::WebContents* web_contents,
|
|
const content::MediaStreamRequest& request,
|
|
content::MediaResponseCallback callback) {
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+ if (cef_browser_delegate_) {
|
|
+ callback = cef_browser_delegate_->RequestMediaAccessPermissionEx(
|
|
+ web_contents, request, std::move(callback));
|
|
+ if (callback.is_null())
|
|
+ return;
|
|
+ }
|
|
+#endif
|
|
+
|
|
const extensions::Extension* extension =
|
|
GetExtensionForOrigin(profile_, request.security_origin);
|
|
MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest(
|
|
@@ -2695,13 +2809,20 @@ void Browser::RemoveScheduledUpdatesFor(WebContents* contents) {
|
|
// Browser, Getters for UI (private):
|
|
|
|
StatusBubble* Browser::GetStatusBubble() {
|
|
+ bool show_by_default = true;
|
|
+
|
|
// In web apps, and in kiosk and exclusive app mode we want to always hide the
|
|
// status bubble.
|
|
if (chrome::IsRunningInAppMode() ||
|
|
web_app::AppBrowserController::IsWebApp(this)) {
|
|
- return nullptr;
|
|
+ show_by_default = false;
|
|
}
|
|
|
|
+ bool show = show_by_default;
|
|
+ CALL_CEF_DELEGATE_RESULT(ShowStatusBubble, show, show_by_default);
|
|
+ if (!show)
|
|
+ return nullptr;
|
|
+
|
|
return window_ ? window_->GetStatusBubble() : nullptr;
|
|
}
|
|
|
|
@@ -2831,6 +2952,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
|
|
content_translate_driver->RemoveTranslationObserver(this);
|
|
BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this);
|
|
}
|
|
+
|
|
+ CALL_CEF_DELEGATE(SetAsDelegate, web_contents, set_delegate);
|
|
}
|
|
|
|
void Browser::TabDetachedAtImpl(content::WebContents* contents,
|
|
diff --git chrome/browser/ui/browser.h chrome/browser/ui/browser.h
|
|
index b50337f317a66..b12c2e76f32f8 100644
|
|
--- chrome/browser/ui/browser.h
|
|
+++ chrome/browser/ui/browser.h
|
|
@@ -22,6 +22,7 @@
|
|
#include "base/timer/elapsed_timer.h"
|
|
#include "build/build_config.h"
|
|
#include "build/chromeos_buildflags.h"
|
|
+#include "cef/libcef/features/runtime.h"
|
|
#include "chrome/browser/themes/theme_service_observer.h"
|
|
#include "chrome/browser/ui/bookmarks/bookmark_bar.h"
|
|
#include "chrome/browser/ui/bookmarks/bookmark_tab_helper_observer.h"
|
|
@@ -47,6 +48,10 @@
|
|
#include "ui/gfx/geometry/rect.h"
|
|
#include "ui/shell_dialogs/select_file_dialog.h"
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+#include "cef/libcef/browser/chrome/browser_delegate.h"
|
|
+#endif
|
|
+
|
|
#if BUILDFLAG(IS_ANDROID)
|
|
#error This file should only be included on desktop.
|
|
#endif
|
|
@@ -311,6 +316,11 @@ class Browser : public TabStripModelObserver,
|
|
float initial_aspect_ratio = 1.0f;
|
|
bool lock_aspect_ratio = false;
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+ // Opaque CEF-specific configuration. Will be propagated to new Browsers.
|
|
+ scoped_refptr<cef::BrowserDelegate::CreateParams> cef_params;
|
|
+#endif
|
|
+
|
|
private:
|
|
friend class Browser;
|
|
friend class WindowSizerChromeOSTest;
|
|
@@ -386,6 +396,13 @@ class Browser : public TabStripModelObserver,
|
|
force_skip_warning_user_on_close_ = force_skip_warning_user_on_close;
|
|
}
|
|
|
|
+ // Return true if CEF will expose the toolbar to the client. This value is
|
|
+ // used to selectively enable toolbar behaviors such as command processing
|
|
+ // and omnibox focus without also including the toolbar in BrowserView layout
|
|
+ // calculations.
|
|
+ void set_toolbar_overridden(bool val) { toolbar_overridden_ = val; }
|
|
+ bool toolbar_overridden() const { return toolbar_overridden_; }
|
|
+
|
|
// Accessors ////////////////////////////////////////////////////////////////
|
|
|
|
const CreateParams& create_params() const { return create_params_; }
|
|
@@ -459,6 +476,12 @@ class Browser : public TabStripModelObserver,
|
|
|
|
base::WeakPtr<Browser> AsWeakPtr();
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+ cef::BrowserDelegate* cef_delegate() const {
|
|
+ return cef_browser_delegate_.get();
|
|
+ }
|
|
+#endif
|
|
+
|
|
// Get the FindBarController for this browser, creating it if it does not
|
|
// yet exist.
|
|
FindBarController* GetFindBarController();
|
|
@@ -829,11 +852,19 @@ class Browser : public TabStripModelObserver,
|
|
void SetContentsBounds(content::WebContents* source,
|
|
const gfx::Rect& bounds) override;
|
|
void UpdateTargetURL(content::WebContents* source, const GURL& url) override;
|
|
+ bool DidAddMessageToConsole(content::WebContents* source,
|
|
+ blink::mojom::ConsoleMessageLevel log_level,
|
|
+ const std::u16string& message,
|
|
+ int32_t line_no,
|
|
+ const std::u16string& source_id) override;
|
|
void ContentsMouseEvent(content::WebContents* source,
|
|
bool motion,
|
|
bool exited) override;
|
|
void ContentsZoomChange(bool zoom_in) override;
|
|
bool TakeFocus(content::WebContents* source, bool reverse) override;
|
|
+ void CanDownload(const GURL& url,
|
|
+ const std::string& request_method,
|
|
+ base::OnceCallback<void(bool)> callback) override;
|
|
void BeforeUnloadFired(content::WebContents* source,
|
|
bool proceed,
|
|
bool* proceed_to_fire_unload) override;
|
|
@@ -1235,6 +1266,8 @@ class Browser : public TabStripModelObserver,
|
|
const std::string initial_workspace_;
|
|
bool initial_visible_on_all_workspaces_state_;
|
|
|
|
+ bool toolbar_overridden_ = false;
|
|
+
|
|
CreationSource creation_source_ = CreationSource::kUnknown;
|
|
|
|
UnloadController unload_controller_;
|
|
@@ -1299,6 +1332,10 @@ class Browser : public TabStripModelObserver,
|
|
extension_browser_window_helper_;
|
|
#endif
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
+ std::unique_ptr<cef::BrowserDelegate> cef_browser_delegate_;
|
|
+#endif
|
|
+
|
|
const base::ElapsedTimer creation_timer_;
|
|
|
|
// The following factory is used for chrome update coalescing.
|
|
diff --git chrome/browser/ui/browser_navigator.cc chrome/browser/ui/browser_navigator.cc
|
|
index abe8e2d792d53..33723c6e9f9a5 100644
|
|
--- chrome/browser/ui/browser_navigator.cc
|
|
+++ chrome/browser/ui/browser_navigator.cc
|
|
@@ -561,6 +561,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 a3dbf97b6f943..6d8e521e9f189 100644
|
|
--- chrome/browser/ui/browser_tabstrip.cc
|
|
+++ chrome/browser/ui/browser_tabstrip.cc
|
|
@@ -33,9 +33,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;
|