summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/resources
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-09 19:26:35 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-09 19:26:35 +0000
commit0f605396ab522e1f2f48824c42bb784e9784d479 (patch)
tree062f717563b296a520791bd29c25fd21038b2920 /chrome/renderer/resources
parent609a1ec621cdcce03328b56e4b744ce9498b2177 (diff)
downloadchromium_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.js44
-rw-r--r--chrome/renderer/resources/extension_process_bindings.js43
-rw-r--r--chrome/renderer/resources/renderer_extension_bindings.js32
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 || {};
})();