diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-08 17:38:14 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-08 17:38:14 +0000 |
commit | ff1e913c6d63f3b5b12b4d0cb0b960bcb2e682af (patch) | |
tree | d92f1e8949d181069e0defe685d8e4b65c42619e /chrome/browser/extensions/extension_message_handler.cc | |
parent | afc4ce91f94bc0cb976884e1c1c785a9e75f127a (diff) | |
download | chromium_src-ff1e913c6d63f3b5b12b4d0cb0b960bcb2e682af.zip chromium_src-ff1e913c6d63f3b5b12b4d0cb0b960bcb2e682af.tar.gz chromium_src-ff1e913c6d63f3b5b12b4d0cb0b960bcb2e682af.tar.bz2 |
Revert 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=78629Review URL: http://codereview.chromium.org/6812030
TBR=jam@chromium.org
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80956 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, 68 insertions, 13 deletions
diff --git a/chrome/browser/extensions/extension_message_handler.cc b/chrome/browser/extensions/extension_message_handler.cc index 52517cb..9b872d0 100644 --- a/chrome/browser/extensions/extension_message_handler.cc +++ b/chrome/browser/extensions/extension_message_handler.cc @@ -4,6 +4,7 @@ #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" @@ -11,10 +12,15 @@ #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( - RenderViewHost* render_view_host) - : RenderViewHostObserver(render_view_host) { + int child_id, IPC::Message::Sender* sender, Profile* profile) + : child_id_(child_id), + sender_(sender), + extension_function_dispatcher_(NULL), + profile_(profile) { } ExtensionMessageHandler::~ExtensionMessageHandler() { @@ -31,26 +37,75 @@ 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) { - Profile* profile = render_view_host()->process()->profile(); - if (profile->GetExtensionMessageService()) { - profile->GetExtensionMessageService()->PostMessageFromRenderer( + if (profile_->GetExtensionMessageService()) { + profile_->GetExtensionMessageService()->PostMessageFromRenderer( port_id, message); } } void ExtensionMessageHandler::OnRequest( + const IPC::Message& message, const ExtensionHostMsg_DomMessage_Params& 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.")); + 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; } - render_view_host()->delegate()->ProcessWebUIMessage(params); + tab_contents()->render_view_host()->delegate()->ProcessWebUIMessage(params); } |