diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-09 19:26:35 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-09 19:26:35 +0000 |
commit | 0f605396ab522e1f2f48824c42bb784e9784d479 (patch) | |
tree | 062f717563b296a520791bd29c25fd21038b2920 /chrome/renderer/resources | |
parent | 609a1ec621cdcce03328b56e4b744ce9498b2177 (diff) | |
download | chromium_src-0f605396ab522e1f2f48824c42bb784e9784d479.zip chromium_src-0f605396ab522e1f2f48824c42bb784e9784d479.tar.gz chromium_src-0f605396ab522e1f2f48824c42bb784e9784d479.tar.bz2 |
Make the API to open a message channel symmetric, so it works the same whether opening from a tab or extension.
Also, move the callback handling back to extension_process_bindings, since I
didn't need it in event_bindings to implement this, and it didn't make sense
there anyway.
BUG=12461
TEST=no
Review URL: http://codereview.chromium.org/149237
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20296 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/resources')
-rw-r--r-- | chrome/renderer/resources/event_bindings.js | 44 | ||||
-rw-r--r-- | chrome/renderer/resources/extension_process_bindings.js | 43 | ||||
-rw-r--r-- | chrome/renderer/resources/renderer_extension_bindings.js | 32 |
3 files changed, 66 insertions, 53 deletions
diff --git a/chrome/renderer/resources/event_bindings.js b/chrome/renderer/resources/event_bindings.js index a58cf37..5fb16f9 100644 --- a/chrome/renderer/resources/event_bindings.js +++ b/chrome/renderer/resources/event_bindings.js @@ -12,7 +12,6 @@ var chrome = chrome || {}; native function GetChromeHidden(); native function AttachEvent(eventName); native function DetachEvent(eventName); - native function GetNextRequestId(); var chromeHidden = GetChromeHidden(); @@ -149,45 +148,6 @@ var chrome = chrome || {}; delete attachedNamedEvents[this.eventName_]; }; - // Callback handling. - var callbacks = []; - chromeHidden.handleResponse = function(requestId, name, - success, response, error) { - try { - if (!success) { - if (!error) - error = "Unknown error." - console.error("Error during " + name + ": " + error); - return; - } - - if (callbacks[requestId]) { - if (response) { - callbacks[requestId](JSON.parse(response)); - } else { - callbacks[requestId](); - } - } - } finally { - delete callbacks[requestId]; - } - }; - - // Send an API request and optionally register a callback. - chromeHidden.sendRequest = function(request, args, callback) { - // JSON.stringify doesn't support a root object which is undefined. - if (args === undefined) - args = null; - var sargs = JSON.stringify(args); - var requestId = GetNextRequestId(); - var hasCallback = false; - if (callback) { - hasCallback = true; - callbacks[requestId] = callback; - } - request(sargs, requestId, hasCallback); - } - // 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). @@ -203,4 +163,8 @@ var chrome = chrome || {}; for (var i in allAttachedEvents) allAttachedEvents[i].detach_(); } + + chromeHidden.dispatchError = function(msg) { + console.error(msg); + } })(); diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js index 5b6239c..f3893fb 100644 --- a/chrome/renderer/resources/extension_process_bindings.js +++ b/chrome/renderer/resources/extension_process_bindings.js @@ -35,6 +35,7 @@ var chrome = chrome || {}; native function MoveBookmark(); native function SetBookmarkTitle(); native function GetChromeHidden(); + native function GetNextRequestId(); if (!chrome) chrome = {}; @@ -72,7 +73,44 @@ var chrome = chrome || {}; } } - var sendRequest = chromeHidden.sendRequest; + // Callback handling. + var callbacks = []; + chromeHidden.handleResponse = function(requestId, name, + success, response, error) { + try { + if (!success) { + if (!error) + error = "Unknown error." + console.error("Error during " + name + ": " + error); + return; + } + + if (callbacks[requestId]) { + if (response) { + callbacks[requestId](JSON.parse(response)); + } else { + callbacks[requestId](); + } + } + } finally { + delete callbacks[requestId]; + } + }; + + // Send an API request and optionally register a callback. + function sendRequest(request, args, callback) { + // JSON.stringify doesn't support a root object which is undefined. + if (args === undefined) + args = null; + var sargs = JSON.stringify(args); + var requestId = GetNextRequestId(); + var hasCallback = false; + if (callback) { + hasCallback = true; + callbacks[requestId] = callback; + } + request(sargs, requestId, hasCallback); + } //---------------------------------------------------------------------------- @@ -492,6 +530,9 @@ var chrome = chrome || {}; chrome.self = chrome.self || {}; chromeHidden.onLoad.addListener(function (extensionId) { + chrome.extension = new chrome.Extension(extensionId); + // TODO(mpcomplete): self.onConnect is deprecated. Remove it at 1.0. + // http://code.google.com/p/chromium/issues/detail?id=16356 chrome.self.onConnect = new chrome.Event("channel-connect:" + extensionId); }); diff --git a/chrome/renderer/resources/renderer_extension_bindings.js b/chrome/renderer/resources/renderer_extension_bindings.js index b27a2df..2a41d5f 100644 --- a/chrome/renderer/resources/renderer_extension_bindings.js +++ b/chrome/renderer/resources/renderer_extension_bindings.js @@ -22,21 +22,26 @@ var chrome = chrome || {}; // Port object. Represents a connection to another script context through // which messages can be passed. chrome.Port = function(portId) { - if (ports[portId]) { - throw new Error("Port '" + portId + "' already exists."); - } - this.portId_ = portId; // TODO(mpcomplete): readonly + this.portId_ = portId; this.onDisconnect = new chrome.Event(); this.onMessage = new chrome.Event(); - ports[portId] = this; + }; - var port = this; + chromeHidden.Port = {}; + + // Hidden port creation function. We don't want to expose an API that lets + // people add arbitrary port IDs to the port list. + chromeHidden.Port.createPort = function(portId) { + if (ports[portId]) { + throw new Error("Port '" + portId + "' already exists."); + } + var port = new chrome.Port(portId); + ports[portId] = port; chromeHidden.onUnload.addListener(function() { port.disconnect(); }); - }; - - chromeHidden.Port = {}; + return port; + } // Called by native code when a channel has been opened to this context. chromeHidden.Port.dispatchOnConnect = function(portId, tab, extensionId) { @@ -44,9 +49,9 @@ var chrome = chrome || {}; // 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 || ""); + var connectEvent = "channel-connect:" + extensionId; if (chromeHidden.Event.hasListener(connectEvent)) { - var port = new chrome.Port(portId); + var port = chromeHidden.Port.createPort(portId); if (tab) { tab = JSON.parse(tab); } @@ -93,6 +98,7 @@ var chrome = chrome || {}; // Extension object. chrome.Extension = function(id) { this.id_ = id; + this.onConnect = new chrome.Event('channel-connect:' + id); }; // Opens a message channel to the extension. Returns a Port for @@ -101,7 +107,7 @@ var chrome = chrome || {}; var portId = OpenChannelToExtension(this.id_); if (portId == -1) throw new Error("No such extension: '" + this.id_ + "'"); - return new chrome.Port(portId); + return chromeHidden.Port.createPort(portId); }; // Returns a resource URL that can be used to fetch a resource from this @@ -109,4 +115,6 @@ var chrome = chrome || {}; chrome.Extension.prototype.getURL = function(path) { return "chrome-extension://" + this.id_ + "/" + path; }; + + chrome.self = chrome.self || {}; })(); |