Index: chrome/browser/renderer_host/chrome_render_view_host_observer.cc |
diff --git a/chrome/browser/renderer_host/chrome_render_view_host_observer.cc b/chrome/browser/renderer_host/chrome_render_view_host_observer.cc |
index 081163f663d270c7447a924917a6eefc6107e767..9132b6c5ce53b8b942ddb82498b67cafbc5f4356 100644 |
--- a/chrome/browser/renderer_host/chrome_render_view_host_observer.cc |
+++ b/chrome/browser/renderer_host/chrome_render_view_host_observer.cc |
@@ -6,12 +6,18 @@ |
#include "base/command_line.h" |
#include "chrome/browser/dom_operation_notification_details.h" |
+#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/net/predictor_api.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/common/chrome_notification_types.h" |
#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/extensions/extension_messages.h" |
#include "chrome/common/render_messages.h" |
-#include "content/browser/renderer_host/render_view_host.h" |
+#include "content/browser/browsing_instance.h" |
+#include "content/browser/child_process_security_policy.h" |
#include "content/browser/renderer_host/render_view_host_delegate.h" |
-#include "chrome/common/chrome_notification_types.h" |
+#include "content/browser/renderer_host/render_view_host.h" |
+#include "content/browser/site_instance.h" |
#include "content/common/notification_service.h" |
#include "content/common/url_constants.h" |
#include "content/common/view_messages.h" |
@@ -24,6 +30,57 @@ ChromeRenderViewHostObserver::ChromeRenderViewHostObserver( |
ChromeRenderViewHostObserver::~ChromeRenderViewHostObserver() { |
} |
+void ChromeRenderViewHostObserver::RenderViewHostInitialized() { |
+ InitRenderViewHostForExtensions(); |
+} |
+ |
+void ChromeRenderViewHostObserver::InitRenderViewHostForExtensions() { |
+ // Note that due to GetEffectiveURL(), even hosted apps will have a |
Charlie Reis
2011/08/11 19:10:55
A little unfortunate that we're duplicating the co
|
+ // chrome-extension:// URL for their site, so we can ignore that wrinkle here. |
+ SiteInstance* site_instance = render_view_host()->site_instance(); |
+ const GURL& site = site_instance->site(); |
+ |
+ if (!site.SchemeIs(chrome::kExtensionScheme)) |
+ return; |
+ |
+ Profile* profile = Profile::FromBrowserContext( |
+ site_instance->browsing_instance()->browser_context()); |
+ ExtensionService* service = profile->GetExtensionService(); |
+ if (!service) |
+ return; |
+ |
+ // This can happen if somebody typos a chrome-extension:// URL. |
+ const Extension* extension = service->GetExtensionByURL(site); |
+ if (!extension) |
+ return; |
+ |
+ RenderProcessHost* process = render_view_host()->process(); |
+ |
+ if (extension->is_app()) { |
+ Send(new ExtensionMsg_ActivateApplication(extension->id())); |
+ // Record which, if any, installed app is associated with this process. |
+ // TODO(aa): Totally lame to store this state in a global map in extension |
+ // service. Can we get it from EPM instead? |
+ service->SetInstalledAppForRenderer(process->id(), extension); |
+ } |
+ |
+ // Some extensions use chrome:// URLs. |
+ Extension::Type type = extension->GetType(); |
+ if (type == Extension::TYPE_EXTENSION || |
+ type == Extension::TYPE_PACKAGED_APP) { |
+ ChildProcessSecurityPolicy::GetInstance()->GrantScheme( |
+ process->id(), chrome::kChromeUIScheme); |
+ } |
+ |
+ if (type == Extension::TYPE_EXTENSION || |
+ type == Extension::TYPE_USER_SCRIPT || |
+ type == Extension::TYPE_PACKAGED_APP || |
+ (type == Extension::TYPE_HOSTED_APP && |
+ extension->location() == Extension::COMPONENT)) { |
+ Send(new ExtensionMsg_ActivateExtension(extension->id())); |
+ } |
+} |
+ |
void ChromeRenderViewHostObserver::Navigate( |
const ViewMsg_Navigate_Params& params) { |
const GURL& url = params.url; |