summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/resources
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-02 20:42:26 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-02 20:42:26 +0000
commitb9eea12850008f465aaa2d20ab84a2b0b5be9671 (patch)
tree9b813444e9e7bac7f5c3e0c7b8ce47716fd53fd9 /chrome/renderer/resources
parent87638af779ecfa2358090671234a3f239db47d37 (diff)
downloadchromium_src-b9eea12850008f465aaa2d20ab84a2b0b5be9671.zip
chromium_src-b9eea12850008f465aaa2d20ab84a2b0b5be9671.tar.gz
chromium_src-b9eea12850008f465aaa2d20ab84a2b0b5be9671.tar.bz2
Fix some issues with extension messaging:
- Disconnect ports properly (javascript mistake). - Use the right port ID when dispatching the disconnect event. - Fix a bug with 2 extensions loaded in the same process. BUG=12686 BUG=15798 TEST=Load an extension that uses messaging, and make sure it disconnects when you navigate or close the connecting. Review URL: http://codereview.chromium.org/152003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19844 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/resources')
-rw-r--r--chrome/renderer/resources/event_bindings.js17
-rw-r--r--chrome/renderer/resources/extension_process_bindings.js5
-rw-r--r--chrome/renderer/resources/renderer_extension_bindings.js24
3 files changed, 34 insertions, 12 deletions
diff --git a/chrome/renderer/resources/event_bindings.js b/chrome/renderer/resources/event_bindings.js
index 78a1ceb..a58cf37 100644
--- a/chrome/renderer/resources/event_bindings.js
+++ b/chrome/renderer/resources/event_bindings.js
@@ -59,6 +59,12 @@ var chrome = chrome || {};
}
};
+ // Test if a named event has any listeners.
+ chromeHidden.Event.hasListener = function(name) {
+ return (attachedNamedEvents[name] &&
+ attachedNamedEvents[name].listeners_.length > 0);
+ }
+
// Registers a callback to be called when this event is dispatched.
chrome.Event.prototype.addListener = function(cb) {
this.listeners_.push(cb);
@@ -182,11 +188,16 @@ var chrome = chrome || {};
request(sargs, requestId, hasCallback);
}
- // Special unload event: we don't use the DOM unload because that slows
- // down tab shutdown. On the other hand, this might not always fire, since
- // Chrome will terminate renderers on shutdown (SuddenTermination).
+ // Special load events: we don't use the DOM unload because that slows
+ // down tab shutdown. On the other hand, onUnload might not always fire,
+ // since Chrome will terminate renderers on shutdown (SuddenTermination).
+ chromeHidden.onLoad = new chrome.Event();
chromeHidden.onUnload = new chrome.Event();
+ chromeHidden.dispatchOnLoad = function(extensionId) {
+ chromeHidden.onLoad.dispatch(extensionId);
+ }
+
chromeHidden.dispatchOnUnload = function() {
chromeHidden.onUnload.dispatch();
for (var i in allAttachedEvents)
diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js
index 2e76723..5b6239c 100644
--- a/chrome/renderer/resources/extension_process_bindings.js
+++ b/chrome/renderer/resources/extension_process_bindings.js
@@ -490,7 +490,10 @@ var chrome = chrome || {};
// Self.
chrome.self = chrome.self || {};
- chrome.self.onConnect = new chrome.Event("channel-connect");
+
+ chromeHidden.onLoad.addListener(function (extensionId) {
+ chrome.self.onConnect = new chrome.Event("channel-connect:" + extensionId);
+ });
chrome.self.getViews = function() {
return GetViews();
diff --git a/chrome/renderer/resources/renderer_extension_bindings.js b/chrome/renderer/resources/renderer_extension_bindings.js
index f9d354e..b27a2df 100644
--- a/chrome/renderer/resources/renderer_extension_bindings.js
+++ b/chrome/renderer/resources/renderer_extension_bindings.js
@@ -29,22 +29,30 @@ var chrome = chrome || {};
this.onDisconnect = new chrome.Event();
this.onMessage = new chrome.Event();
ports[portId] = this;
-
+
+ var port = this;
chromeHidden.onUnload.addListener(function() {
- this.disconnect();
+ port.disconnect();
});
};
chromeHidden.Port = {};
// Called by native code when a channel has been opened to this context.
- chromeHidden.Port.dispatchOnConnect = function(portId, tab) {
- var port = new chrome.Port(portId);
- if (tab) {
- tab = JSON.parse(tab);
+ chromeHidden.Port.dispatchOnConnect = function(portId, tab, extensionId) {
+ // Only create a new Port if someone is actually listening for a connection.
+ // In addition to being an optimization, this also fixes a bug where if 2
+ // channels were opened to and from the same process, closing one would
+ // close both.
+ var connectEvent = "channel-connect:" + (extensionId || "");
+ if (chromeHidden.Event.hasListener(connectEvent)) {
+ var port = new chrome.Port(portId);
+ if (tab) {
+ tab = JSON.parse(tab);
+ }
+ port.tab = tab;
+ chromeHidden.Event.dispatch(connectEvent, [port]);
}
- port.tab = tab;
- chromeHidden.Event.dispatch("channel-connect", [port]);
};
// Called by native code when a channel has been closed.