diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-05 17:01:18 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-05 17:01:18 +0000 |
commit | 553602e16e938000f103cc7d58e4aac3247508d7 (patch) | |
tree | e35c5fcb46d36b4baf3b4a18a86171001df6c55a /chrome/browser/extensions/extension_message_handler.cc | |
parent | a6721299849fff3b25e7b2a0e6f16aa0df7a9b11 (diff) | |
download | chromium_src-553602e16e938000f103cc7d58e4aac3247508d7.zip chromium_src-553602e16e938000f103cc7d58e4aac3247508d7.tar.gz chromium_src-553602e16e938000f103cc7d58e4aac3247508d7.tar.bz2 |
Move dispatching and sending of the last extension specific messages out of TabContents and RenderView.I added a TabContents::Registrar helper class for allowing classing to temporarily observe a TabContents. This allows them to easily and safetly filter IPC messages. I used this for ExecuteCodeInTabFunction.
Review URL: http://codereview.chromium.org/6794035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80468 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_message_handler.cc')
-rw-r--r-- | chrome/browser/extensions/extension_message_handler.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_message_handler.cc b/chrome/browser/extensions/extension_message_handler.cc new file mode 100644 index 0000000..eb407bc --- /dev/null +++ b/chrome/browser/extensions/extension_message_handler.cc @@ -0,0 +1,111 @@ +// Copyright (c) 2011 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 "chrome/browser/extensions/extension_message_handler.h" + +#include "chrome/browser/extensions/extension_function_dispatcher.h" +#include "chrome/browser/extensions/extension_message_service.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/common/extensions/extension_messages.h" +#include "content/browser/child_process_security_policy.h" +#include "content/browser/renderer_host/render_process_host.h" +#include "content/browser/renderer_host/render_view_host.h" +#include "content/browser/renderer_host/render_view_host_delegate.h" +#include "content/browser/tab_contents/tab_contents.h" +#include "content/common/notification_service.h" + +ExtensionMessageHandler::ExtensionMessageHandler( + int child_id, IPC::Message::Sender* sender, Profile* profile) + : child_id_(child_id), + sender_(sender), + extension_function_dispatcher_(NULL), + profile_(profile) { +} + +ExtensionMessageHandler::~ExtensionMessageHandler() { +} + +bool ExtensionMessageHandler::OnMessageReceived( + const IPC::Message& message) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(ExtensionMessageHandler, message) + IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage) + IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +bool ExtensionMessageHandler::CanDispatchRequest( + int child_id, + int routing_id, + const ExtensionHostMsg_DomMessage_Params& params) { + if (!ChildProcessSecurityPolicy::GetInstance()-> + HasExtensionBindings(child_id)) { + // This can happen if someone uses window.open() to open an extension URL + // from a non-extension context. + sender_->Send(new ExtensionMsg_Response( + routing_id, params.request_id, false, std::string(), + "Access to extension API denied.")); + return false; + } + + return true; +} + +void ExtensionMessageHandler::OnPostMessage(int port_id, + const std::string& message) { + if (profile_->GetExtensionMessageService()) { + profile_->GetExtensionMessageService()->PostMessageFromRenderer( + port_id, message); + } +} + +void ExtensionMessageHandler::OnRequest( + const IPC::Message& message, + const ExtensionHostMsg_DomMessage_Params& params) { + DCHECK(child_id_); + if (!extension_function_dispatcher_ || + !CanDispatchRequest(child_id_, message.routing_id(), params)) { + return; + } + + extension_function_dispatcher_->HandleRequest(params); +} + +ExtensionMessageObserver::ExtensionMessageObserver(TabContents* tab_contents) + : TabContentsObserver(tab_contents), + ALLOW_THIS_IN_INITIALIZER_LIST( + handler_(0, this, tab_contents->profile())) { + // We don't pass in a child_id to handler_ since for TabContents that can + // change later. +} + +ExtensionMessageObserver::~ExtensionMessageObserver() { +} + +bool ExtensionMessageObserver::OnMessageReceived(const IPC::Message& message) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(ExtensionMessageObserver, message) + IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + + if (!handled) + handled = handler_.OnMessageReceived(message); + return handled; +} + +void ExtensionMessageObserver::OnRequest( + const IPC::Message& message, + const ExtensionHostMsg_DomMessage_Params& params) { + if (!handler_.CanDispatchRequest( + tab_contents()->render_view_host()->process()->id(), + message.routing_id(), + params)) { + return; + } + + tab_contents()->render_view_host()->delegate()->ProcessWebUIMessage(params); +} |