| diff --git chrome/browser/browser_about_handler.cc chrome/browser/browser_about_handler.cc |
| index 2480282a19d12..dbd1fbf8a15b5 100644 |
| --- chrome/browser/browser_about_handler.cc |
| +++ chrome/browser/browser_about_handler.cc |
| @@ -72,6 +72,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/devtools/devtools_window.cc chrome/browser/devtools/devtools_window.cc |
| index 4d99a769d6069..0ebd577182dc6 100644 |
| --- chrome/browser/devtools/devtools_window.cc |
| +++ chrome/browser/devtools/devtools_window.cc |
| @@ -31,6 +31,7 @@ |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/task_manager/web_contents_tags.h" |
| #include "chrome/browser/ui/browser.h" |
| +#include "chrome/browser/ui/browser_finder.h" |
| #include "chrome/browser/ui/browser_list.h" |
| #include "chrome/browser/ui/browser_tabstrip.h" |
| #include "chrome/browser/ui/browser_window.h" |
| @@ -1162,6 +1163,13 @@ DevToolsWindow* DevToolsWindow::Create( |
| !browser->is_type_normal()) { |
| can_dock = false; |
| } |
| + |
| +#if BUILDFLAG(ENABLE_CEF) |
| + if (can_dock && browser && browser->cef_delegate()) { |
| + // Don't dock DevTools for CEF-managed browsers. |
| + can_dock = false; |
| + } |
| +#endif |
| } |
| |
| // Create WebContents with devtools. |
| @@ -1738,12 +1746,29 @@ void DevToolsWindow::CreateDevToolsBrowser() { |
| Browser::CreationStatus::kOk) { |
| return; |
| } |
| - browser_ = |
| - Browser::Create(Browser::CreateParams::CreateForDevTools(profile_)); |
| - browser_->tab_strip_model()->AddWebContents( |
| - OwnedMainWebContents::TakeWebContents( |
| - std::move(owned_main_web_contents_)), |
| - -1, ui::PAGE_TRANSITION_AUTO_TOPLEVEL, AddTabTypes::ADD_ACTIVE); |
| + |
| + auto opener = chrome::FindBrowserWithWebContents(GetInspectedWebContents()); |
| + auto devtools_contents = OwnedMainWebContents::TakeWebContents( |
| + std::move(owned_main_web_contents_)); |
| + |
| +#if BUILDFLAG(ENABLE_CEF) |
| + if (opener && opener->cef_delegate()) { |
| + // If a Browser is created, it will take ownership of |devtools_contents|. |
| + browser_ = opener->cef_delegate()->CreateDevToolsBrowser( |
| + profile_, opener, devtools_contents); |
| + } |
| +#endif |
| + |
| + if (!browser_) { |
| + auto create_params = Browser::CreateParams::CreateForDevTools(profile_); |
| + create_params.opener = opener; |
| + |
| + browser_ = Browser::Create(std::move(create_params)); |
| + browser_->tab_strip_model()->AddWebContents( |
| + std::move(devtools_contents), |
| + -1, ui::PAGE_TRANSITION_AUTO_TOPLEVEL, AddTabTypes::ADD_ACTIVE); |
| + } |
| + |
| OverrideAndSyncDevToolsRendererPrefs(); |
| } |
| |
| diff --git chrome/browser/ui/BUILD.gn chrome/browser/ui/BUILD.gn |
| index d5bc836ec888d..4da459c08e7af 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") |
| @@ -374,6 +375,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 |
| @@ -399,6 +404,7 @@ static_library("ui") { |
| "//build:chromeos_buildflags", |
| "//build/config/chromebox_for_meetings:buildflags", |
| "//cc/paint", |
| + "//cef/libcef/features", |
| "//chrome:resources", |
| "//chrome:strings", |
| "//chrome/app:chrome_dll_resources", |
| @@ -2759,6 +2765,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", |
| @@ -4694,8 +4702,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", |
| @@ -6393,6 +6399,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 9ba2025634365..b6ceaa7f0b531 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 |
| @@ -460,6 +479,10 @@ Browser::Browser(const CreateParams& params) |
| type_(params.type), |
| profile_(params.profile), |
| window_(nullptr), |
| +#if BUILDFLAG(ENABLE_CEF) |
| + cef_browser_delegate_( |
| + cef::BrowserDelegate::Create(this, params.cef_params, params.opener)), |
| +#endif |
| tab_strip_model_delegate_( |
| std::make_unique<chrome::BrowserTabStripModelDelegate>(this)), |
| tab_strip_model_(std::make_unique<TabStripModel>( |
| @@ -655,6 +678,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(); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| @@ -1059,6 +1088,8 @@ void Browser::WindowFullscreenStateChanged() { |
| ->WindowFullscreenStateChanged(); |
| command_controller_->FullscreenStateChanged(); |
| UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN); |
| + |
| + CALL_CEF_DELEGATE(WindowFullscreenStateChanged); |
| } |
| |
| void Browser::FullscreenTopUIStateChanged() { |
| @@ -1398,6 +1429,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); |
| } |
| |
| @@ -1405,8 +1444,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() { |
| @@ -1617,6 +1666,14 @@ WebContents* Browser::OpenURLFromTab(WebContents* source, |
| } |
| #endif // BUILDFLAG(IS_CHROMEOS_ASH) |
| |
| +#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; |
| @@ -1774,6 +1831,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) { |
| @@ -1802,6 +1861,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; |
| |
| @@ -1809,6 +1870,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) { |
| @@ -1833,6 +1905,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) { |
| @@ -1925,6 +2010,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) { |
| @@ -2046,11 +2135,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) { |
| @@ -2240,6 +2333,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( |
| @@ -2791,9 +2893,11 @@ void Browser::RemoveScheduledUpdatesFor(WebContents* contents) { |
| // Browser, Getters for UI (private): |
| |
| StatusBubble* Browser::GetStatusBubble() { |
| + bool show_by_default = true; |
| + |
| // For kiosk and exclusive app mode we want to always hide the status bubble. |
| if (chrome::IsRunningInAppMode()) { |
| - return nullptr; |
| + show_by_default = false; |
| } |
| |
| // We hide the status bar for web apps windows as this matches native |
| @@ -2801,6 +2905,12 @@ StatusBubble* Browser::GetStatusBubble() { |
| // mode, as the minimal browser UI includes the status bar. |
| if (web_app::AppBrowserController::IsWebApp(this) && |
| !app_controller()->HasMinimalUiButtons()) { |
| + show_by_default = false; |
| + } |
| + |
| + bool show = show_by_default; |
| + CALL_CEF_DELEGATE_RESULT(ShowStatusBubble, show, show_by_default); |
| + if (!show) { |
| return nullptr; |
| } |
| |
| @@ -2937,6 +3047,8 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { |
| BookmarkTabHelper::FromWebContents(web_contents)->RemoveObserver(this); |
| web_contents_collection_.StopObserving(web_contents); |
| } |
| + |
| + CALL_CEF_DELEGATE(SetAsDelegate, web_contents, set_delegate); |
| } |
| |
| void Browser::TabDetachedAtImpl(content::WebContents* contents, |
| @@ -3091,6 +3203,14 @@ bool Browser::PictureInPictureBrowserSupportsWindowFeature( |
| |
| bool Browser::SupportsWindowFeatureImpl(WindowFeature feature, |
| bool check_can_support) const { |
| +#if BUILDFLAG(ENABLE_CEF) |
| + if (cef_delegate()) { |
| + if (auto value = cef_delegate()->SupportsWindowFeature(feature)) { |
| + return *value; |
| + } |
| + } |
| +#endif |
| + |
| switch (type_) { |
| case TYPE_NORMAL: |
| return NormalBrowserSupportsWindowFeature(feature, check_can_support); |
| diff --git chrome/browser/ui/browser.h chrome/browser/ui/browser.h |
| index db37e861d2546..ea85b9966267d 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/tab_contents/web_contents_collection.h" |
| #include "chrome/browser/themes/theme_service_observer.h" |
| #include "chrome/browser/ui/bookmarks/bookmark_bar.h" |
| @@ -48,6 +49,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 |
| @@ -331,6 +336,15 @@ class Browser : public TabStripModelObserver, |
| // Document Picture in Picture options, specific to TYPE_PICTURE_IN_PICTURE. |
| absl::optional<blink::mojom::PictureInPictureWindowOptions> pip_options; |
| |
| +#if BUILDFLAG(ENABLE_CEF) |
| + // Opaque CEF-specific configuration. Will be propagated to new Browsers. |
| + scoped_refptr<cef::BrowserDelegate::CreateParams> cef_params; |
| + |
| + // Specify the Browser that is opening this popup. |
| + // Currently only used with TYPE_PICTURE_IN_PICTURE and TYPE_DEVTOOLS. |
| + raw_ptr<Browser, DanglingUntriaged> opener = nullptr; |
| +#endif |
| + |
| private: |
| friend class Browser; |
| friend class WindowSizerChromeOSTest; |
| @@ -412,6 +426,13 @@ class Browser : public TabStripModelObserver, |
| update_ui_immediately_for_testing_ = true; |
| } |
| |
| + // 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_; } |
| @@ -485,6 +506,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(); |
| @@ -876,11 +903,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; |
| @@ -1219,6 +1254,10 @@ class Browser : public TabStripModelObserver, |
| // This Browser's window. |
| raw_ptr<BrowserWindow, DanglingUntriaged> window_; |
| |
| +#if BUILDFLAG(ENABLE_CEF) |
| + std::unique_ptr<cef::BrowserDelegate> cef_browser_delegate_; |
| +#endif |
| + |
| std::unique_ptr<TabStripModelDelegate> const tab_strip_model_delegate_; |
| std::unique_ptr<TabStripModel> const tab_strip_model_; |
| |
| @@ -1288,6 +1327,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_; |
| diff --git chrome/browser/ui/browser_navigator.cc chrome/browser/ui/browser_navigator.cc |
| index e76824b5ba371..27c8e3d131238 100644 |
| --- chrome/browser/ui/browser_navigator.cc |
| +++ chrome/browser/ui/browser_navigator.cc |
| @@ -288,6 +288,10 @@ std::pair<Browser*, int> GetBrowserAndTabForDisposition( |
| : 1.0; |
| browser_params.pip_options = pip_options; |
| |
| +#if BUILDFLAG(ENABLE_CEF) |
| + browser_params.opener = params.browser; |
| +#endif |
| + |
| const BrowserWindow* const browser_window = params.browser->window(); |
| const gfx::NativeWindow native_window = |
| browser_window ? browser_window->GetNativeWindow() |
| @@ -553,6 +557,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 535d038f7023b..f861a0f37bf85 100644 |
| --- chrome/browser/ui/browser_tabstrip.cc |
| +++ chrome/browser/ui/browser_tabstrip.cc |
| @@ -32,9 +32,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; |
| @@ -70,6 +74,16 @@ void AddWebContents(Browser* browser, |
| // Can't create a new contents for the current tab - invalid case. |
| DCHECK(disposition != WindowOpenDisposition::CURRENT_TAB); |
| |
| +#if BUILDFLAG(ENABLE_CEF) |
| + if (browser && browser->cef_delegate() && new_contents) { |
| + new_contents = browser->cef_delegate()->AddWebContents( |
| + std::move(new_contents)); |
| + if (!new_contents) { |
| + return; |
| + } |
| + } |
| +#endif |
| + |
| NavigateParams params(browser, std::move(new_contents)); |
| params.source_contents = source_contents; |
| params.url = target_url; |