Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chrome_content_browser_client.h"
      6 
      7 #include "chrome/browser/debugger/devtools_handler.h"
      8 #include "chrome/browser/desktop_notification_handler.h"
      9 #include "chrome/browser/extensions/extension_message_handler.h"
     10 #include "chrome/browser/extensions/extension_service.h"
     11 #include "chrome/browser/printing/printing_message_filter.h"
     12 #include "chrome/browser/profiles/profile.h"
     13 #include "chrome/browser/renderer_host/chrome_render_message_filter.h"
     14 #include "chrome/browser/search_engines/search_provider_install_state_message_filter.h"
     15 #include "chrome/browser/spellcheck_message_filter.h"
     16 #include "chrome/browser/ui/webui/chrome_web_ui_factory.h"
     17 #include "content/browser/renderer_host/browser_render_process_host.h"
     18 #include "content/browser/renderer_host/render_view_host.h"
     19 
     20 namespace chrome {
     21 
     22 void ChromeContentBrowserClient::RenderViewHostCreated(
     23     RenderViewHost* render_view_host) {
     24   new DesktopNotificationHandler(render_view_host);
     25   new DevToolsHandler(render_view_host);
     26   new ExtensionMessageHandler(render_view_host);
     27 }
     28 
     29 void ChromeContentBrowserClient::PreCreateRenderView(
     30     RenderViewHost* render_view_host,
     31     Profile* profile,
     32     const GURL& url) {
     33   // Tell the RenderViewHost whether it will be used for an extension process.
     34   ExtensionService* service = profile->GetExtensionService();
     35   if (service) {
     36     bool is_extension_process = service->ExtensionBindingsAllowed(url);
     37     render_view_host->set_is_extension_process(is_extension_process);
     38 
     39     const Extension* installed_app = service->GetInstalledApp(url);
     40     static_cast<BrowserRenderProcessHost*>(render_view_host->process())->
     41         set_installed_app(installed_app);
     42   }
     43 }
     44 
     45 void ChromeContentBrowserClient::BrowserRenderProcessHostCreated(
     46     BrowserRenderProcessHost* host) {
     47   host->channel()->AddFilter(new ChromeRenderMessageFilter(
     48       host->id(),
     49       host->profile(),
     50       host->profile()->GetRequestContextForPossibleApp(
     51           host->installed_app())));
     52   host->channel()->AddFilter(new PrintingMessageFilter());
     53   host->channel()->AddFilter(
     54       new SearchProviderInstallStateMessageFilter(host->id(), host->profile()));
     55   host->channel()->AddFilter(new SpellCheckMessageFilter());
     56 }
     57 
     58 content::WebUIFactory* ChromeContentBrowserClient::GetWebUIFactory() {
     59   return ChromeWebUIFactory::GetInstance();
     60 }
     61 
     62 GURL ChromeContentBrowserClient::GetEffectiveURL(Profile* profile,
     63                                                  const GURL& url) {
     64   // Get the effective URL for the given actual URL. If the URL is part of an
     65   // installed app, the effective URL is an extension URL with the ID of that
     66   // extension as the host. This has the effect of grouping apps together in
     67   // a common SiteInstance.
     68   if (!profile || !profile->GetExtensionService())
     69     return url;
     70 
     71   const Extension* extension =
     72       profile->GetExtensionService()->GetExtensionByWebExtent(url);
     73   if (!extension)
     74     return url;
     75 
     76   // If the URL is part of an extension's web extent, convert it to an
     77   // extension URL.
     78   return extension->GetResourceURL(url.path());
     79 }
     80 
     81 }  // namespace chrome
     82