diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-08 21:03:10 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-08 21:03:10 +0000 |
commit | f364d139a49933c7212d521801fec68d1b229487 (patch) | |
tree | 7c4fe037e5a083276962d668369dff201eeaf612 /chrome/browser/extensions/extension_message_handler.cc | |
parent | 5bba4dd3a7ad928f6c8a58aea8d716605eec285a (diff) | |
download | chromium_src-f364d139a49933c7212d521801fec68d1b229487.zip chromium_src-f364d139a49933c7212d521801fec68d1b229487.tar.gz chromium_src-f364d139a49933c7212d521801fec68d1b229487.tar.bz2 |
Relanding http://src.chromium.org/viewvc/chrome?view=rev&revision=80938.
Add a new RenderViewHostObserver interface for filtering IPCs send to RenderViewHost. This is needed because with TabContentsObserver, an observer might not know which RenderViewHost a message came from duing a pending navigation. A side-benefit is that we only have to add these observers once, instead of remembering/knowing all the delegates that might want to filter these messages.
BUG=78629
Review URL: http://codereview.chromium.org/6813046
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80984 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 | 81 |
1 files changed, 13 insertions, 68 deletions
diff --git a/chrome/browser/extensions/extension_message_handler.cc b/chrome/browser/extensions/extension_message_handler.cc index 9b872d0..52517cb 100644 --- a/chrome/browser/extensions/extension_message_handler.cc +++ b/chrome/browser/extensions/extension_message_handler.cc @@ -4,7 +4,6 @@ #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" @@ -12,15 +11,10 @@ #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) { + RenderViewHost* render_view_host) + : RenderViewHostObserver(render_view_host) { } ExtensionMessageHandler::~ExtensionMessageHandler() { @@ -37,75 +31,26 @@ bool ExtensionMessageHandler::OnMessageReceived( 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( + Profile* profile = render_view_host()->process()->profile(); + 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)) { + if (!ChildProcessSecurityPolicy::GetInstance()-> + HasExtensionBindings(render_view_host()->process()->id())) { + // This can happen if someone uses window.open() to open an extension URL + // from a non-extension context. + Send(new ExtensionMsg_Response( + routing_id(), params.request_id, false, std::string(), + "Access to extension API denied.")); return; } - tab_contents()->render_view_host()->delegate()->ProcessWebUIMessage(params); + render_view_host()->delegate()->ProcessWebUIMessage(params); } |