summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-02 20:42:45 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-02 20:42:45 +0000
commitf9db2479a330fdee07d72c8a3d59ef7e67107a42 (patch)
tree7283bdc158532ae581df415be8121d9a5d64f7ae /chrome/browser/extensions
parent3892085db6bd1a63f8c7b0270c8a31e66e12c2b3 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/extensions/extension_message_service.cc49
-rw-r--r--chrome/browser/extensions/extension_message_service.h12
-rw-r--r--chrome/browser/extensions/extension_messages_browsertest.cc21
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);
}
}