Revert "Revert 83168 - Revert "Revert 83100 - Remove weird dependency on extensions from webui.Re-plumb extension request messages in a more sane way.Before, each RVH had ProcessWebUIMessage(), which wasserving as a manual way of plumbing both WebUI andextension messages to the right place, even though onlya few RVHD responded to either message.Instead of this, we now just teach more of the stack howto handle IPC messages in general, and delegate them upthrough the stack, giving each layer a chance to handlethem if it knows how.The result is simpler and smaller:179 insertions(+), 252 deletions(-)BUG=80311Review URL: http://codereview.chromium.org/6901021"This reverts commit 643b280cedd9f0b76948686f39f50f295aba362f.TBR=mpcomplete@chromium.org"
This reverts commit ba6603c3cc46f1b83219be906ab36f8f2b3372e2.
[email protected]
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@83188 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index 26b466b4..efca9b6 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -26,7 +26,6 @@
#include "chrome/browser/extensions/extension_idle_api.h"
#include "chrome/browser/extensions/extension_infobar_module.h"
#include "chrome/browser/extensions/extension_management_api.h"
-#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/extensions/extension_metrics_module.h"
#include "chrome/browser/extensions/extension_module.h"
#include "chrome/browser/extensions/extension_omnibox_api.h"
@@ -54,10 +53,13 @@
#include "chrome/browser/ui/webui/favicon_source.h"
#include "chrome/common/extensions/extension_messages.h"
#include "chrome/common/url_constants.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/common/notification_service.h"
#include "content/common/result_codes.h"
+#include "ipc/ipc_message.h"
+#include "ipc/ipc_message_macros.h"
#include "third_party/skia/include/core/SkBitmap.h"
#if defined(TOOLKIT_VIEWS)
@@ -473,8 +475,28 @@
return browser;
}
-void ExtensionFunctionDispatcher::HandleRequest(
- const ExtensionHostMsg_DomMessage_Params& params) {
+bool ExtensionFunctionDispatcher::OnMessageReceived(
+ const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(ExtensionFunctionDispatcher, message)
+ IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+void ExtensionFunctionDispatcher::OnRequest(
+ const ExtensionHostMsg_Request_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.
+ render_view_host_->Send(new ExtensionMsg_Response(
+ render_view_host_->routing_id(), params.request_id, false,
+ std::string(), "Access to extension API denied."));
+ return;
+ }
+
scoped_refptr<ExtensionFunction> function(
FactoryRegistry::GetInstance()->NewFunction(params.name));
function->set_dispatcher_peer(peer_);
diff --git a/chrome/browser/extensions/extension_function_dispatcher.h b/chrome/browser/extensions/extension_function_dispatcher.h
index cb679887..9f91d9d 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.h
+++ b/chrome/browser/extensions/extension_function_dispatcher.h
@@ -11,6 +11,7 @@
#include "base/memory/ref_counted.h"
#include "googleurl/src/gurl.h"
+#include "ipc/ipc_channel.h"
#include "ui/gfx/native_widget_types.h"
class Browser;
@@ -20,7 +21,7 @@
class Profile;
class RenderViewHost;
class TabContents;
-struct ExtensionHostMsg_DomMessage_Params;
+struct ExtensionHostMsg_Request_Params;
// A factory function for creating new ExtensionFunction instances.
typedef ExtensionFunction* (*ExtensionFunctionFactory)();
@@ -28,7 +29,7 @@
// ExtensionFunctionDispatcher receives requests to execute functions from
// Chromium extensions running in a RenderViewHost and dispatches them to the
// appropriate handler. It lives entirely on the UI thread.
-class ExtensionFunctionDispatcher {
+class ExtensionFunctionDispatcher : public IPC::Channel::Listener {
public:
class Delegate {
public:
@@ -85,8 +86,8 @@
Delegate* delegate() { return delegate_; }
- // Handle a request to execute an extension function.
- void HandleRequest(const ExtensionHostMsg_DomMessage_Params& params);
+ // If |message| is an extension request, handle it. Returns true if handled.
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// Send a response to a function.
void SendResponse(ExtensionFunction* api, bool success);
@@ -121,6 +122,9 @@
const Extension* extension,
const GURL& url);
+ // Message handlers.
+ void OnRequest(const ExtensionHostMsg_Request_Params& params);
+
// We need to keep a pointer to the profile because we use it in the dtor
// in sending EXTENSION_FUNCTION_DISPATCHER_DESTROYED, but by that point
// the render_view_host_ has been deleted.
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index 74f28e3..d2e5bec 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -546,13 +546,6 @@
return webkit_prefs;
}
-void ExtensionHost::ProcessWebUIMessage(
- const ExtensionHostMsg_DomMessage_Params& params) {
- if (extension_function_dispatcher_.get()) {
- extension_function_dispatcher_->HandleRequest(params);
- }
-}
-
RenderViewHostDelegate::View* ExtensionHost::GetViewDelegate() {
return this;
}
@@ -784,6 +777,11 @@
}
bool ExtensionHost::OnMessageReceived(const IPC::Message& message) {
+ if (extension_function_dispatcher_.get() &&
+ extension_function_dispatcher_->OnMessageReceived(message)) {
+ return true;
+ }
+
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message)
IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnRunFileChooser)
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
index 63adef8..1a23d20 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -128,8 +128,6 @@
// RenderViewHostDelegate implementation.
virtual RenderViewHostDelegate::View* GetViewDelegate();
virtual WebPreferences GetWebkitPrefs();
- virtual void ProcessWebUIMessage(
- const ExtensionHostMsg_DomMessage_Params& params);
virtual void RunJavaScriptMessage(const std::wstring& message,
const std::wstring& default_prompt,
const GURL& frame_url,
diff --git a/chrome/browser/extensions/extension_message_handler.cc b/chrome/browser/extensions/extension_message_handler.cc
index 52517cbd..4447dac 100644
--- a/chrome/browser/extensions/extension_message_handler.cc
+++ b/chrome/browser/extensions/extension_message_handler.cc
@@ -10,7 +10,6 @@
#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"
ExtensionMessageHandler::ExtensionMessageHandler(
RenderViewHost* render_view_host)
@@ -25,7 +24,6 @@
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;
@@ -39,18 +37,3 @@
port_id, message);
}
}
-
-void ExtensionMessageHandler::OnRequest(
- 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."));
- return;
- }
-
- render_view_host()->delegate()->ProcessWebUIMessage(params);
-}
diff --git a/chrome/browser/extensions/extension_message_handler.h b/chrome/browser/extensions/extension_message_handler.h
index 3a5c0509..0ba49405e 100644
--- a/chrome/browser/extensions/extension_message_handler.h
+++ b/chrome/browser/extensions/extension_message_handler.h
@@ -14,6 +14,12 @@
// Filters and dispatches extension-related IPC messages that arrive from
// renderers. There is one of these objects for each RenderViewHost in Chrome.
// Contrast this with ExtensionTabHelper, which is only created for TabContents.
+//
+// TODO(aa): Handling of content script messaging should be able to move to EFD
+// once there is an EFD for every RVHD where extension code can run. Then we
+// could eliminate this class. Right now, we don't end up with an EFD for tab
+// contents unless that tab contents is hosting chrome-extension:// URLs. That
+// still leaves content scripts. See also: crbug.com/80307.
class ExtensionMessageHandler : public RenderViewHostObserver {
public:
// |sender| is guaranteed to outlive this object.
@@ -26,7 +32,6 @@
private:
// Message handlers.
void OnPostMessage(int port_id, const std::string& message);
- void OnRequest(const ExtensionHostMsg_DomMessage_Params& params);
DISALLOW_COPY_AND_ASSIGN(ExtensionMessageHandler);
};
diff --git a/chrome/browser/extensions/extension_web_ui.cc b/chrome/browser/extensions/extension_web_ui.cc
index 1a9b122..7192c03 100644
--- a/chrome/browser/extensions/extension_web_ui.cc
+++ b/chrome/browser/extensions/extension_web_ui.cc
@@ -28,6 +28,7 @@
#include "content/browser/tab_contents/tab_contents.h"
#include "content/common/bindings_policy.h"
#include "content/common/page_transition_types.h"
+#include "ipc/ipc_message.h"
#include "net/base/file_stream.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/codec/png_codec.h"
@@ -184,9 +185,11 @@
ResetExtensionBookmarkManagerEventRouter();
}
-void ExtensionWebUI::ProcessWebUIMessage(
- const ExtensionHostMsg_DomMessage_Params& params) {
- extension_function_dispatcher_->HandleRequest(params);
+bool ExtensionWebUI::OnMessageReceived(const IPC::Message& message) {
+ if (extension_function_dispatcher_.get())
+ return extension_function_dispatcher_->OnMessageReceived(message);
+
+ return false;
}
Browser* ExtensionWebUI::GetBrowser() {
diff --git a/chrome/browser/extensions/extension_web_ui.h b/chrome/browser/extensions/extension_web_ui.h
index 34f0899..f41ead3b 100644
--- a/chrome/browser/extensions/extension_web_ui.h
+++ b/chrome/browser/extensions/extension_web_ui.h
@@ -14,6 +14,7 @@
#include "chrome/browser/favicon_service.h"
#include "chrome/common/extensions/extension.h"
#include "content/browser/webui/web_ui.h"
+#include "ipc/ipc_channel.h"
class GURL;
class ListValue;
@@ -21,7 +22,7 @@
class Profile;
class RenderViewHost;
class TabContents;
-struct ExtensionHostMsg_DomMessage_Params;
+struct ExtensionHostMsg_Request_Params;
// This class implements WebUI for extensions and allows extensions to put UI in
// the main tab contents area. For example, each extension can specify an
@@ -42,10 +43,9 @@
}
// WebUI
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
virtual void RenderViewCreated(RenderViewHost* render_view_host);
virtual void RenderViewReused(RenderViewHost* render_view_host);
- virtual void ProcessWebUIMessage(
- const ExtensionHostMsg_DomMessage_Params& params);
// ExtensionFunctionDispatcher::Delegate
virtual Browser* GetBrowser();