| // Copyright 2025 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/extensions/api/chrome_extensions_api_client.h" |
| |
| #include <memory> |
| |
| #include "base/notimplemented.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/android/tab_model/tab_model.h" |
| #include "chrome/browser/ui/android/tab_model/tab_model_list.h" |
| #include "content/public/browser/page_navigator.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/common/referrer.h" |
| #include "extensions/browser/supervised_user_extensions_delegate.h" |
| #include "extensions/buildflags/buildflags.h" |
| #include "ui/base/window_open_disposition.h" |
| |
| // TODO(crbug.com/417770773): This file contains stubs for the parts of |
| // ChromeExtensionsAPIClient that are not yet supported on desktop Android. Once |
| // these functions are supported on desktop Android this file can be deleted. |
| // The stubs are implemented here instead of falling back to ExtensionsAPIClient |
| // to allow NOTIMPLEMENTED() logging and a place to put TODOs with bug IDs. |
| |
| static_assert(BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS)); |
| |
| namespace extensions { |
| |
| void ChromeExtensionsAPIClient::OpenFileUrl( |
| const GURL& file_url, |
| content::BrowserContext* browser_context) { |
| Profile* profile = Profile::FromBrowserContext(browser_context); |
| // Find the active web contents for this profile. |
| // TODO(crbug.com/429037015): Use BrowserWindowInterface when |
| // AndroidBrowserWindow::GetProfile() returns a valid value. |
| content::WebContents* web_contents = nullptr; |
| for (TabModel* model : TabModelList::models()) { |
| if (model->GetProfile() == profile && model->IsActiveModel()) { |
| web_contents = model->GetActiveWebContents(); |
| break; |
| } |
| } |
| if (!web_contents) { |
| LOG(ERROR) << "Unable to find active web contents for profile."; |
| return; |
| } |
| |
| // Open the file URL in the current tab. |
| content::OpenURLParams params( |
| file_url, content::Referrer(), WindowOpenDisposition::CURRENT_TAB, |
| ui::PAGE_TRANSITION_FROM_API, /*is_renderer_initiated=*/false); |
| web_contents->OpenURL(params, /*navigation_handle_callback=*/{}); |
| } |
| |
| std::unique_ptr<DevicePermissionsPrompt> |
| ChromeExtensionsAPIClient::CreateDevicePermissionsPrompt( |
| content::WebContents* web_contents) const { |
| // TODO(crbug.com/417785993): Support device permissions prompts on desktop |
| // Android. |
| return nullptr; |
| } |
| |
| std::unique_ptr<SupervisedUserExtensionsDelegate> |
| ChromeExtensionsAPIClient::CreateSupervisedUserExtensionsDelegate( |
| content::BrowserContext* browser_context) const { |
| // TODO(crbug.com/402488726): Support supervised users on desktop Android. |
| // This is a stub implementation that always blocks installs. |
| return std::make_unique<SupervisedUserExtensionsDelegate>(); |
| } |
| |
| std::unique_ptr<DisplayInfoProvider> |
| ChromeExtensionsAPIClient::CreateDisplayInfoProvider() const { |
| // TODO(crbug.com/417786011): Support display APIs on desktop Android. |
| NOTIMPLEMENTED(); |
| return nullptr; |
| } |
| |
| std::vector<KeyedServiceBaseFactory*> |
| ChromeExtensionsAPIClient::GetFactoryDependencies() { |
| // TODO(crbug.com/402488726): Delete this stub and use the version from |
| // _non_android.cc when we have supervised user support on desktop Android. |
| // Don't use NOTIMPLEMENTED() here because this is the correct implementation |
| // for this stub class. |
| return {}; |
| } |
| |
| } // namespace extensions |