diff --git chrome/browser/extensions/api/chrome_extensions_api_client.cc chrome/browser/extensions/api/chrome_extensions_api_client.cc index 7101a6c177bca..852f80543db32 100644 --- chrome/browser/extensions/api/chrome_extensions_api_client.cc +++ chrome/browser/extensions/api/chrome_extensions_api_client.cc @@ -16,6 +16,7 @@ #include "base/task/single_thread_task_runner.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "cef/libcef/features/features.h" #include "chrome/browser/extensions/api/automation_internal/chrome_automation_internal_api_delegate.h" #include "chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h" #include "chrome/browser/extensions/api/declarative_content/default_content_predicate_evaluators.h" @@ -82,6 +83,10 @@ #include "chromeos/ash/components/settings/cros_settings.h" #endif +#if BUILDFLAG(ENABLE_CEF) +#include "cef/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.h" +#endif + #if BUILDFLAG(ENABLE_PRINTING) #include "chrome/browser/printing/printing_init.h" #endif @@ -298,7 +303,11 @@ ChromeExtensionsAPIClient::CreateGuestViewManagerDelegate() const { std::unique_ptr ChromeExtensionsAPIClient::CreateMimeHandlerViewGuestDelegate( MimeHandlerViewGuest* guest) const { +#if BUILDFLAG(ENABLE_CEF) + return std::make_unique(guest); +#else return std::make_unique(); +#endif } std::unique_ptr diff --git chrome/browser/extensions/api/tabs/tabs_api.cc chrome/browser/extensions/api/tabs/tabs_api.cc index ad1f4b4c3e979..55657d976c405 100644 --- chrome/browser/extensions/api/tabs/tabs_api.cc +++ chrome/browser/extensions/api/tabs/tabs_api.cc @@ -1714,7 +1714,7 @@ ExtensionFunction::ResponseAction TabsUpdateFunction::Run() { return RespondNow(Error(ExtensionTabUtil::kTabStripNotEditableError)); } - if (tab_strip->active_index() != tab_index) { + if (tab_strip && tab_strip->active_index() != tab_index) { tab_strip->ActivateTabAt(tab_index); DCHECK_EQ(contents, tab_strip->GetActiveWebContents()); } @@ -1741,7 +1741,7 @@ ExtensionFunction::ResponseAction TabsUpdateFunction::Run() { kCannotUpdateMuteCaptured, base::NumberToString(tab_id)))); } - if (params->update_properties.opener_tab_id) { + if (tab_strip && params->update_properties.opener_tab_id) { int opener_id = *params->update_properties.opener_tab_id; WebContents* opener_contents = nullptr; if (opener_id == tab_id) { @@ -1776,7 +1776,7 @@ ExtensionFunction::ResponseAction TabsUpdateFunction::Run() { ->SetAutoDiscardable(state); } - if (params->update_properties.pinned) { + if (tab_strip && params->update_properties.pinned) { // Bug fix for crbug.com/1197888. Don't let the extension update the tab if // the user is dragging tabs. if (!ExtensionTabUtil::IsTabStripEditable()) { @@ -1797,7 +1797,8 @@ ExtensionFunction::ResponseAction TabsUpdateFunction::Run() { // Navigate the tab to a new location if the url is different. if (params->update_properties.url) { std::string updated_url = *params->update_properties.url; - if (browser->profile()->IsIncognitoProfile() && + auto* profile = Profile::FromBrowserContext(browser_context()); + if (profile->IsIncognitoProfile() && !IsURLAllowedInIncognito(GURL(updated_url))) { return RespondNow(Error(ErrorUtils::FormatErrorMessage( tabs_constants::kURLsNotAllowedInIncognitoError, updated_url))); @@ -1812,7 +1813,7 @@ ExtensionFunction::ResponseAction TabsUpdateFunction::Run() { return RespondNow(Error(std::move(error))); } - NotifyExtensionTelemetry(Profile::FromBrowserContext(browser_context()), + NotifyExtensionTelemetry(profile, extension(), safe_browsing::TabsApiInfo::UPDATE, current_url, updated_url, js_callstack()); } diff --git chrome/browser/extensions/extension_tab_util.cc chrome/browser/extensions/extension_tab_util.cc index 959e848a6e9b4..5f73667a599e7 100644 --- chrome/browser/extensions/extension_tab_util.cc +++ chrome/browser/extensions/extension_tab_util.cc @@ -39,6 +39,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/types/expected_macros.h" +#include "cef/libcef/features/features.h" #include "chrome/browser/browser_process.h" // nogncheck #include "chrome/browser/extensions/browser_extension_window_controller.h" #include "chrome/browser/extensions/chrome_extension_function_details.h" @@ -88,6 +89,10 @@ #include "url/url_constants.h" #endif +#if BUILDFLAG(ENABLE_CEF) +#include "cef/libcef/browser/chrome/extensions/chrome_extension_util.h" +#endif + using content::NavigationEntry; using content::WebContents; using extensions::mojom::APIPermissionID; @@ -774,6 +779,14 @@ bool ExtensionTabUtil::GetTabById(int tab_id, } #endif // BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(ENABLE_CEF) + if (cef::GetAlloyTabById(tab_id, profile, include_incognito, out_contents)) { + // |out_window| and |out_tab_index| are tied to a specific Browser window, + // which doesn't exist for an Alloy style browser. + return true; + } +#endif // BUILDFLAG(ENABLE_CEF) + if (base::FeatureList::IsEnabled(blink::features::kPrerender2InNewTab)) { // Prerendering tab is not visible and it cannot be in `TabStripModel`, if // the tab id exists as a prerendering tab, and the API will returns diff --git chrome/browser/ui/tab_helpers.h chrome/browser/ui/tab_helpers.h index ec26ac19c0780..928536d17dbb1 100644 --- chrome/browser/ui/tab_helpers.h +++ chrome/browser/ui/tab_helpers.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_TAB_HELPERS_H_ #include "build/build_config.h" +#include "cef/libcef/features/features.h" #if BUILDFLAG(IS_ANDROID) @@ -41,6 +42,10 @@ namespace tabs { class TabModel; } // namespace tabs +#if BUILDFLAG(ENABLE_CEF) +class CefBrowserPlatformDelegateAlloy; +#endif + // A "tab contents" is a WebContents that is used as a tab in a browser window // (or the equivalent on Android). The TabHelpers class allows specific classes // to attach the set of tab helpers that is used for tab contents. @@ -80,6 +85,10 @@ class TabHelpers { // Link Preview shows a preview of a page, then promote it as a new tab. friend class PreviewTab; +#if BUILDFLAG(ENABLE_CEF) + friend class CefBrowserPlatformDelegateAlloy; +#endif + // FYI: Do NOT add any more friends here. The functions above are the ONLY // ones that need to call AttachTabHelpers; if you think you do, re-read the // design document linked above, especially the section "Reusing tab helpers".