diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-02 20:42:45 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-02 20:42:45 +0000 |
commit | f9db2479a330fdee07d72c8a3d59ef7e67107a42 (patch) | |
tree | 7283bdc158532ae581df415be8121d9a5d64f7ae /chrome/browser/extensions | |
parent | 3892085db6bd1a63f8c7b0270c8a31e66e12c2b3 (diff) | |
download | chromium_src-f9db2479a330fdee07d72c8a3d59ef7e67107a42.zip chromium_src-f9db2479a330fdee07d72c8a3d59ef7e67107a42.tar.gz chromium_src-f9db2479a330fdee07d72c8a3d59ef7e67107a42.tar.bz2 |
Report failures when opening an extension port to the caller.
Extension ports are now disconnected if you try to open a port to something
that has no message channel listeners. This can happen e.g. if you try to open
a port to a tab that has no content scripts injected.
Also removed usage of the generic MessageInvoke by the ExtensionMessageService. Event.dispatchJSON is the only remaining user of that.
BUG=32899,120531
TEST=no
Review URL: https://chromiumcodereview.appspot.com/9963041
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130203 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
3 files changed, 28 insertions, 54 deletions
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc index 043ae38..e8ac077 100644 --- a/chrome/browser/extensions/extension_message_service.cc +++ b/chrome/browser/extensions/extension_message_service.cc @@ -84,11 +84,6 @@ struct ExtensionMessageService::OpenChannelParams { channel_name(channel_name) {} }; -const char ExtensionMessageService::kDispatchOnConnect[] = - "Port.dispatchOnConnect"; -const char ExtensionMessageService::kDispatchOnDisconnect[] = - "Port.dispatchOnDisconnect"; - namespace { static base::StaticAtomicSequenceNumber g_next_channel_id; @@ -99,37 +94,22 @@ static void DispatchOnConnect(const ExtensionMessageService::MessagePort& port, const std::string& tab_json, const std::string& source_extension_id, const std::string& target_extension_id) { - ListValue args; - args.Set(0, Value::CreateIntegerValue(dest_port_id)); - args.Set(1, Value::CreateStringValue(channel_name)); - args.Set(2, Value::CreateStringValue(tab_json)); - args.Set(3, Value::CreateStringValue(source_extension_id)); - args.Set(4, Value::CreateStringValue(target_extension_id)); - CHECK(port.process); - port.process->Send( - new ExtensionMsg_MessageInvoke( - port.routing_id, - target_extension_id, - ExtensionMessageService::kDispatchOnConnect, args, GURL(), - false)); // Not a user gesture + port.process->Send(new ExtensionMsg_DispatchOnConnect( + port.routing_id, dest_port_id, channel_name, + tab_json, source_extension_id, target_extension_id)); } static void DispatchOnDisconnect( const ExtensionMessageService::MessagePort& port, int source_port_id, bool connection_error) { - ListValue args; - args.Set(0, Value::CreateIntegerValue(source_port_id)); - args.Set(1, Value::CreateBooleanValue(connection_error)); - port.process->Send(new ExtensionMsg_MessageInvoke(port.routing_id, - "", ExtensionMessageService::kDispatchOnDisconnect, args, GURL(), - false)); // Not a user gesture + port.process->Send(new ExtensionMsg_DispatchOnDisconnect( + port.routing_id, source_port_id, connection_error)); } static void DispatchOnMessage(const ExtensionMessageService::MessagePort& port, const std::string& message, int target_port_id) { - port.process->Send( - new ExtensionMsg_DeliverMessage( - port.routing_id, target_port_id, message)); + port.process->Send(new ExtensionMsg_DeliverMessage( + port.routing_id, target_port_id, message)); } static content::RenderProcessHost* GetExtensionProcess( @@ -325,7 +305,7 @@ bool ExtensionMessageService::OpenChannelImpl(const OpenChannelParams& params) { return true; } -void ExtensionMessageService::CloseChannel(int port_id) { +void ExtensionMessageService::CloseChannel(int port_id, bool connection_error) { // Note: The channel might be gone already, if the other side closed first. int channel_id = GET_CHANNEL_ID(port_id); MessageChannelMap::iterator it = channels_.find(channel_id); @@ -335,23 +315,24 @@ void ExtensionMessageService::CloseChannel(int port_id) { lazy_background_task_queue_->AddPendingTask( pending->second.first, pending->second.second, base::Bind(&ExtensionMessageService::PendingCloseChannel, - base::Unretained(this), port_id)); + base::Unretained(this), port_id, connection_error)); } return; } - CloseChannelImpl(it, port_id, true); + CloseChannelImpl(it, port_id, connection_error, true); } void ExtensionMessageService::CloseChannelImpl( MessageChannelMap::iterator channel_iter, int closing_port_id, - bool notify_other_port) { + bool connection_error, bool notify_other_port) { MessageChannel* channel = channel_iter->second; // Notify the other side. if (notify_other_port) { const MessagePort& port = IS_OPENER_PORT_ID(closing_port_id) ? channel->receiver : channel->opener; - DispatchOnDisconnect(port, GET_OPPOSITE_PORT_ID(closing_port_id), false); + DispatchOnDisconnect(port, GET_OPPOSITE_PORT_ID(closing_port_id), + connection_error); } // Balance the addrefs in OpenChannelImpl. @@ -421,10 +402,10 @@ void ExtensionMessageService::OnProcessClosed( if (current->second->opener.process == process) { CloseChannelImpl(current, GET_CHANNEL_OPENER_ID(current->first), - notify_other_port); + false, notify_other_port); } else if (current->second->receiver.process == process) { CloseChannelImpl(current, GET_CHANNEL_RECEIVERS_ID(current->first), - notify_other_port); + false, notify_other_port); } } } diff --git a/chrome/browser/extensions/extension_message_service.h b/chrome/browser/extensions/extension_message_service.h index 9dad907..c0c953b 100644 --- a/chrome/browser/extensions/extension_message_service.h +++ b/chrome/browser/extensions/extension_message_service.h @@ -53,10 +53,6 @@ class ExtensionMessageService : public content::NotificationObserver { struct MessageChannel; struct MessagePort; - // Javascript function name constants. - static const char kDispatchOnConnect[]; - static const char kDispatchOnDisconnect[]; - // Allocates a pair of port ids. // NOTE: this can be called from any thread. static void AllocatePortIdPair(int* port1, int* port2); @@ -83,7 +79,7 @@ class ExtensionMessageService : public content::NotificationObserver { // Closes the message channel associated with the given port, and notifies // the other side. - void CloseChannel(int port_id); + void CloseChannel(int port_id, bool connection_error); // Sends a message from a renderer to the given port. void PostMessageFromRenderer(int port_id, const std::string& message); @@ -105,7 +101,7 @@ class ExtensionMessageService : public content::NotificationObserver { bool OpenChannelImpl(const OpenChannelParams& params); void CloseChannelImpl(MessageChannelMap::iterator channel_iter, - int port_id, + int port_id, bool connection_error, bool notify_other_port); // content::NotificationObserver interface. @@ -127,8 +123,8 @@ class ExtensionMessageService : public content::NotificationObserver { void PendingOpenChannel(const OpenChannelParams& params, int source_process_id, ExtensionHost* host); - void PendingCloseChannel(int port_id, ExtensionHost*) { - CloseChannel(port_id); + void PendingCloseChannel(int port_id, bool connection_error, ExtensionHost*) { + CloseChannel(port_id, connection_error); } void PendingPostMessage(int port_id, const std::string& message, diff --git a/chrome/browser/extensions/extension_messages_browsertest.cc b/chrome/browser/extensions/extension_messages_browsertest.cc index a79f021..784ffb7 100644 --- a/chrome/browser/extensions/extension_messages_browsertest.cc +++ b/chrome/browser/extensions/extension_messages_browsertest.cc @@ -22,22 +22,19 @@ static const char kTestingExtensionId[] = "oooooooooooooooooooooooooooooooo"; void DispatchOnConnect(const ChromeV8ContextSet& v8_context_set, int source_port_id, const std::string& name, const std::string& tab_json) { - ListValue args; - args.Set(0, Value::CreateIntegerValue(source_port_id)); - args.Set(1, Value::CreateStringValue(name)); - args.Set(2, Value::CreateStringValue(tab_json)); - args.Set(3, Value::CreateStringValue(kTestingExtensionId)); - args.Set(4, Value::CreateStringValue(kTestingExtensionId)); - v8_context_set.DispatchChromeHiddenMethod( - "", ExtensionMessageService::kDispatchOnConnect, args, NULL, GURL()); + MiscellaneousBindings::DispatchOnConnect( + v8_context_set.GetAll(), + source_port_id, name, tab_json, + kTestingExtensionId, kTestingExtensionId, + NULL); } void DispatchOnDisconnect(const ChromeV8ContextSet& v8_context_set, int source_port_id) { - ListValue args; - args.Set(0, Value::CreateIntegerValue(source_port_id)); - v8_context_set.DispatchChromeHiddenMethod( - "", ExtensionMessageService::kDispatchOnDisconnect, args, NULL, GURL()); + MiscellaneousBindings::DispatchOnDisconnect( + v8_context_set.GetAll(), + source_port_id, false, + NULL); } } |