| Index: chrome/browser/extensions/extension_message_handler.cc
|
| diff --git a/chrome/browser/extensions/extension_message_handler.cc b/chrome/browser/extensions/extension_message_handler.cc
|
| index 88955308667a1748c7b1e44ea29d2c6f2261b062..1f9ed9214847337059f1196fa8c59bbb0b36a394 100644
|
| --- a/chrome/browser/extensions/extension_message_handler.cc
|
| +++ b/chrome/browser/extensions/extension_message_handler.cc
|
| @@ -4,7 +4,9 @@
|
|
|
| #include "chrome/browser/extensions/extension_message_handler.h"
|
|
|
| +#include "chrome/browser/extensions/app_notify_channel_setup.h"
|
| #include "chrome/browser/extensions/extension_message_service.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/extensions/extension_messages.h"
|
| #include "content/browser/child_process_security_policy.h"
|
| @@ -25,6 +27,8 @@ bool ExtensionMessageHandler::OnMessageReceived(
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(ExtensionMessageHandler, message)
|
| IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage)
|
| + IPC_MESSAGE_HANDLER(ExtensionHostMsg_GetAppNotifyChannel,
|
| + OnGetAppNotifyChannel)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| IPC_END_MESSAGE_MAP()
|
| return handled;
|
| @@ -44,3 +48,37 @@ void ExtensionMessageHandler::OnPostMessage(int port_id,
|
| port_id, message);
|
| }
|
| }
|
| +
|
| +void ExtensionMessageHandler::OnGetAppNotifyChannel(
|
| + int request_id,
|
| + const GURL& requestor_url,
|
| + const std::string& client_id) {
|
| +
|
| + // Check for permission first.
|
| + Profile* profile = Profile::FromBrowserContext(
|
| + render_view_host()->process()->browser_context());
|
| + ExtensionService* extension_service = profile->GetExtensionService();
|
| + if (!extension_service || !extension_service->is_ready())
|
| + return;
|
| + const Extension* extension =
|
| + extension_service->GetInstalledApp(requestor_url);
|
| + if (!extension ||
|
| + !extension->HasAPIPermission(ExtensionAPIPermission::kExperimental)) {
|
| + AppNotifyChannelSetupComplete(request_id, "", "permission_error");
|
| + return;
|
| + }
|
| +
|
| + scoped_refptr<AppNotifyChannelSetup> channel_setup(
|
| + new AppNotifyChannelSetup(request_id,
|
| + client_id,
|
| + requestor_url,
|
| + this->AsWeakPtr()));
|
| + channel_setup->Start();
|
| + // We'll get called back in AppNotifyChannelSetupComplete.
|
| +}
|
| +
|
| +void ExtensionMessageHandler::AppNotifyChannelSetupComplete(
|
| + int request_id, const std::string& client_id, const std::string& error) {
|
| + Send(new ExtensionMsg_GetAppNotifyChannelResponse(
|
| + routing_id(), request_id, client_id, error));
|
| +}
|
|
|