mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			262 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2015 The Chromium Embedded Framework Authors.
 | |
| // Portions copyright 2014 The Chromium Authors. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style license that can be
 | |
| // found in the LICENSE file.
 | |
| 
 | |
| #include "libcef/browser/extensions/extensions_browser_client.h"
 | |
| 
 | |
| #include <utility>
 | |
| 
 | |
| #include "libcef/browser/browser_context_impl.h"
 | |
| #include "libcef/browser/extensions/chrome_api_registration.h"
 | |
| #include "libcef/browser/extensions/component_extension_resource_manager.h"
 | |
| #include "libcef/browser/extensions/extension_system_factory.h"
 | |
| #include "libcef/browser/extensions/extension_web_contents_observer.h"
 | |
| #include "libcef/browser/extensions/extensions_api_client.h"
 | |
| 
 | |
| //#include "cef/libcef/browser/extensions/api/generated_api_registration.h"
 | |
| #include "chrome/browser/browser_process.h"
 | |
| #include "chrome/browser/extensions/chrome_url_request_util.h"
 | |
| #include "chrome/browser/extensions/event_router_forwarder.h"
 | |
| #include "chrome/browser/profiles/incognito_helpers.h"
 | |
| #include "content/public/browser/browser_context.h"
 | |
| #include "content/public/browser/browser_thread.h"
 | |
| #include "content/public/browser/render_frame_host.h"
 | |
| #include "extensions/browser/api/extensions_api_client.h"
 | |
| #include "extensions/browser/api/generated_api_registration.h"
 | |
| #include "extensions/browser/api/runtime/runtime_api_delegate.h"
 | |
| #include "extensions/browser/app_sorting.h"
 | |
| #include "extensions/browser/event_router.h"
 | |
| #include "extensions/browser/extension_function_registry.h"
 | |
| #include "extensions/browser/extension_host_delegate.h"
 | |
| #include "extensions/browser/mojo/service_registration.h"
 | |
| #include "extensions/browser/url_request_util.h"
 | |
| #include "extensions/common/constants.h"
 | |
| 
 | |
| using content::BrowserContext;
 | |
| using content::BrowserThread;
 | |
| 
 | |
| namespace extensions {
 | |
| 
 | |
| CefExtensionsBrowserClient::CefExtensionsBrowserClient()
 | |
|     : api_client_(new CefExtensionsAPIClient),
 | |
|       resource_manager_(new CefComponentExtensionResourceManager) {
 | |
| }
 | |
| 
 | |
| CefExtensionsBrowserClient::~CefExtensionsBrowserClient() {
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsShuttingDown() {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::AreExtensionsDisabled(
 | |
|     const base::CommandLine& command_line,
 | |
|     BrowserContext* context) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsValidContext(BrowserContext* context) {
 | |
|   return CefBrowserContextImpl::GetForContext(context) != NULL;
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsSameContext(BrowserContext* first,
 | |
|                                                BrowserContext* second) {
 | |
|   // Returns true if |first| and |second| share the same underlying
 | |
|   // CefBrowserContextImpl.
 | |
|   return CefBrowserContextImpl::GetForContext(first) ==
 | |
|          CefBrowserContextImpl::GetForContext(second);
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::HasOffTheRecordContext(
 | |
|     BrowserContext* context) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| BrowserContext* CefExtensionsBrowserClient::GetOffTheRecordContext(
 | |
|     BrowserContext* context) {
 | |
|   // TODO(extensions): Do we need to support this?
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| BrowserContext* CefExtensionsBrowserClient::GetOriginalContext(
 | |
|     BrowserContext* context) {
 | |
|   return chrome::GetBrowserContextRedirectedInIncognito(context);
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsGuestSession(
 | |
|     BrowserContext* context) const {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsExtensionIncognitoEnabled(
 | |
|     const std::string& extension_id,
 | |
|     content::BrowserContext* context) const {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::CanExtensionCrossIncognito(
 | |
|     const Extension* extension,
 | |
|     content::BrowserContext* context) const {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| net::URLRequestJob*
 | |
| CefExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob(
 | |
|     net::URLRequest* request,
 | |
|     net::NetworkDelegate* network_delegate,
 | |
|     const base::FilePath& directory_path,
 | |
|     const std::string& content_security_policy,
 | |
|     bool send_cors_header) {
 | |
|   return chrome_url_request_util::MaybeCreateURLRequestResourceBundleJob(
 | |
|       request,
 | |
|       network_delegate,
 | |
|       directory_path,
 | |
|       content_security_policy,
 | |
|       send_cors_header);
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::AllowCrossRendererResourceLoad(
 | |
|     net::URLRequest* request,
 | |
|     bool is_incognito,
 | |
|     const Extension* extension,
 | |
|     InfoMap* extension_info_map) {
 | |
|   // TODO(cef): This bypasses additional checks added to
 | |
|   // AllowCrossRendererResourceLoad() in https://crrev.com/5cf9d45c. Figure out
 | |
|   // why permission is not being granted based on "web_accessible_resources"
 | |
|   // specified in the PDF extension manifest.json file.
 | |
|   if (extension && extension->id() == extension_misc::kPdfExtensionId)
 | |
|     return true;
 | |
| 
 | |
|   bool allowed = false;
 | |
|   if (url_request_util::AllowCrossRendererResourceLoad(
 | |
|           request, is_incognito, extension, extension_info_map, &allowed)) {
 | |
|     return allowed;
 | |
|   }
 | |
| 
 | |
|   // Couldn't determine if resource is allowed. Block the load.
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| PrefService* CefExtensionsBrowserClient::GetPrefServiceForContext(
 | |
|     BrowserContext* context) {
 | |
|   return static_cast<CefBrowserContext*>(context)->GetPrefs();
 | |
| }
 | |
| 
 | |
| void CefExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
 | |
|     content::BrowserContext* context,
 | |
|     std::vector<ExtensionPrefsObserver*>* observers) const {
 | |
| }
 | |
| 
 | |
| ProcessManagerDelegate*
 | |
| CefExtensionsBrowserClient::GetProcessManagerDelegate() const {
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| std::unique_ptr<ExtensionHostDelegate>
 | |
| CefExtensionsBrowserClient::CreateExtensionHostDelegate() {
 | |
|   // TODO(extensions): Implement to support Apps.
 | |
|   NOTREACHED();
 | |
|   return std::unique_ptr<ExtensionHostDelegate>();
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::DidVersionUpdate(BrowserContext* context) {
 | |
|   // TODO(jamescook): We might want to tell extensions when app_shell updates.
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| void CefExtensionsBrowserClient::PermitExternalProtocolHandler() {
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsRunningInForcedAppMode() {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsLoggedInAsPublicAccount()  {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| ExtensionSystemProvider*
 | |
| CefExtensionsBrowserClient::GetExtensionSystemFactory() {
 | |
|   return CefExtensionSystemFactory::GetInstance();
 | |
| }
 | |
| 
 | |
| void CefExtensionsBrowserClient::RegisterExtensionFunctions(
 | |
|     ExtensionFunctionRegistry* registry) const {
 | |
|   // Register core extension-system APIs.
 | |
|   api::GeneratedFunctionRegistry::RegisterAll(registry);
 | |
| 
 | |
|   // CEF-only APIs.
 | |
|   // TODO(cef): Enable if/when CEF exposes its own Mojo APIs. See
 | |
|   // libcef/common/extensions/api/README.txt for details.
 | |
|   //api::cef::CefGeneratedFunctionRegistry::RegisterAll(registry);
 | |
| 
 | |
|   // Chrome APIs whitelisted by CEF.
 | |
|   api::cef::ChromeFunctionRegistry::RegisterAll(registry);
 | |
| }
 | |
| 
 | |
| void CefExtensionsBrowserClient::RegisterMojoServices(
 | |
|     content::RenderFrameHost* render_frame_host,
 | |
|     const Extension* extension) const {
 | |
|   RegisterServicesForFrame(render_frame_host, extension);
 | |
| }
 | |
| 
 | |
| std::unique_ptr<RuntimeAPIDelegate>
 | |
| CefExtensionsBrowserClient::CreateRuntimeAPIDelegate(
 | |
|     content::BrowserContext* context) const {
 | |
|   // TODO(extensions): Implement to support Apps.
 | |
|   NOTREACHED();
 | |
|   return nullptr;
 | |
| }
 | |
| 
 | |
| const ComponentExtensionResourceManager*
 | |
| CefExtensionsBrowserClient::GetComponentExtensionResourceManager() {
 | |
|   return resource_manager_.get();
 | |
| }
 | |
| 
 | |
| void CefExtensionsBrowserClient::BroadcastEventToRenderers(
 | |
|     events::HistogramValue histogram_value,
 | |
|     const std::string& event_name,
 | |
|     std::unique_ptr<base::ListValue> args) {
 | |
|   g_browser_process->extension_event_router_forwarder()->
 | |
|       BroadcastEventToRenderers(histogram_value, event_name, std::move(args),
 | |
|                                 GURL());
 | |
| }
 | |
| 
 | |
| net::NetLog* CefExtensionsBrowserClient::GetNetLog() {
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| ExtensionCache* CefExtensionsBrowserClient::GetExtensionCache() {
 | |
|   // Only used by Chrome via ExtensionService.
 | |
|   NOTREACHED();
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsBackgroundUpdateAllowed() {
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool CefExtensionsBrowserClient::IsMinBrowserVersionSupported(
 | |
|     const std::string& min_version) {
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| ExtensionWebContentsObserver*
 | |
| CefExtensionsBrowserClient::GetExtensionWebContentsObserver(
 | |
|     content::WebContents* web_contents) {
 | |
|   return CefExtensionWebContentsObserver::FromWebContents(web_contents);
 | |
| }
 | |
| 
 | |
| KioskDelegate* CefExtensionsBrowserClient::GetKioskDelegate() {
 | |
|   NOTREACHED();
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| void CefExtensionsBrowserClient::SetAPIClientForTest(
 | |
|     ExtensionsAPIClient* api_client) {
 | |
|   api_client_.reset(api_client);
 | |
| }
 | |
| 
 | |
| }  // namespace extensions
 |