summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_message_handler.cc
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-08 21:03:10 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-08 21:03:10 +0000
commitf364d139a49933c7212d521801fec68d1b229487 (patch)
tree7c4fe037e5a083276962d668369dff201eeaf612 /chrome/browser/extensions/extension_message_handler.cc
parent5bba4dd3a7ad928f6c8a58aea8d716605eec285a (diff)
downloadchromium_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.cc81
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);
}