diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-02 20:42:26 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-02 20:42:26 +0000 |
commit | b9eea12850008f465aaa2d20ab84a2b0b5be9671 (patch) | |
tree | 9b813444e9e7bac7f5c3e0c7b8ce47716fd53fd9 /chrome/renderer/resources | |
parent | 87638af779ecfa2358090671234a3f239db47d37 (diff) | |
download | chromium_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.js | 17 | ||||
-rw-r--r-- | chrome/renderer/resources/extension_process_bindings.js | 5 | ||||
-rw-r--r-- | chrome/renderer/resources/renderer_extension_bindings.js | 24 |
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. |