Chromium Code Reviews| Index: chrome/browser/extensions/extension_service.cc |
| diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc |
| index 8fc25936e35cbc882f8ff4f3fafdc3b9c56e78b5..352c0d72aad105e9cedd5d720e5f309887602ea2 100644 |
| --- a/chrome/browser/extensions/extension_service.cc |
| +++ b/chrome/browser/extensions/extension_service.cc |
| @@ -78,6 +78,7 @@ |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/chrome_version_info.h" |
| #include "chrome/common/extensions/api/plugins/plugins_handler.h" |
| +#include "chrome/common/extensions/api/url_handlers/url_handlers_parser.h" |
| #include "chrome/common/extensions/background_info.h" |
| #include "chrome/common/extensions/extension.h" |
| #include "chrome/common/extensions/extension_file_util.h" |
| @@ -131,6 +132,7 @@ using extensions::PermissionMessage; |
| using extensions::PermissionMessages; |
| using extensions::PermissionSet; |
| using extensions::UnloadedExtensionInfo; |
| +using extensions::AppEventRouter; |
| namespace errors = extension_manifest_errors; |
| @@ -199,6 +201,16 @@ const char ExtensionService::kManagedSettingsDirectoryName[] = |
| const char ExtensionService::kStateStoreName[] = "Extension State"; |
| const char ExtensionService::kRulesStoreName[] = "Extension Rules"; |
| +bool ExtensionService::OnMessageReceived(const IPC::Message& message) { |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP(ExtensionService, message) |
| + IPC_MESSAGE_HANDLER(ExtensionHostMsg_OnRedirectUrlToApp, |
| + OnRedirectUrlToApp) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| +} |
| + |
| void ExtensionService::CheckExternalUninstall(const std::string& id) { |
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| @@ -2493,6 +2505,34 @@ bool ExtensionService::ShouldBlockUrlInBrowserTab(GURL* url) { |
| return false; |
| } |
| +bool ExtensionService::MaybeRedirectUrlToApp(const GURL& url, |
| + const GURL& referrer_url) { |
| + // NOTE: The current API spec enforces at most a single app matching a URL. |
| + // TODO: Actually implement the above-mentioned enforcement. |
| + const extensions::UrlHandlerInfo* handler = |
| + extensions_.GetHandlingAppForURL(url); |
| + if (handler) { |
| + CHECK(handler->app->is_platform_app()); |
| + extensions::AppEventRouter::DispatchOnLaunchedEventWithURL( |
| + profile_, handler->app, handler->id, url, referrer_url); |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| +void ExtensionService::OnRedirectUrlToApp(const std::string& app_id, |
| + const std::string& handler_id, |
| + const GURL& url, |
| + const GURL& referrer_url) { |
| + const Extension* app = GetExtensionById(app_id, true); |
| + if (app) { |
| + CHECK(app->is_platform_app()); |
|
asargent_no_longer_on_chrome
2013/08/14 18:05:12
Note that a renderer process could be compromised,
sergeygs
2013/08/18 11:40:24
After more careful thinking, this should have been
|
| + extensions::AppEventRouter::DispatchOnLaunchedEventWithURL( |
| + profile_, app, handler_id, url, referrer_url); |
| + } |
| +} |
| + |
| bool ExtensionService::OnExternalExtensionFileFound( |
| const std::string& id, |
| const Version* version, |