Index: extensions/renderer/resources/messaging.js |
diff --git a/extensions/renderer/resources/messaging.js b/extensions/renderer/resources/messaging.js |
index 7a5c91040305c2ea9a86acc6020276f5b278bc29..9fc29d49752b1e788edc7015cf1c8e4725e5f5e6 100644 |
--- a/extensions/renderer/resources/messaging.js |
+++ b/extensions/renderer/resources/messaging.js |
@@ -6,14 +6,13 @@ |
// TODO(kalman): factor requiring chrome out of here. |
var chrome = requireNative('chrome').GetChrome(); |
- var Event = require('event_bindings').Event; |
var lastError = require('lastError'); |
var logActivity = requireNative('activityLogger'); |
var logging = requireNative('logging'); |
var messagingNatives = requireNative('messaging_natives'); |
+ var Port = require('port').Port; |
var processNatives = requireNative('process'); |
var unloadEvent = require('unload_event'); |
- var utils = require('utils'); |
var messagingUtils = require('messaging_utils'); |
// The reserved channel name for the sendRequest/send(Native)Message APIs. |
@@ -33,64 +32,6 @@ |
// channel. |
function getOppositePortId(portId) { return portId ^ 1; } |
- // Port object. Represents a connection to another script context through |
- // which messages can be passed. |
- function PortImpl(portId, opt_name) { |
- this.portId_ = portId; |
- this.name = opt_name; |
- |
- var portSchema = {name: 'port', $ref: 'runtime.Port'}; |
- var options = {unmanaged: true}; |
- this.onDisconnect = new Event(null, [portSchema], options); |
- this.onMessage = new Event( |
- null, |
- [{name: 'message', type: 'any', optional: true}, portSchema], |
- options); |
- this.onDestroy_ = null; |
- } |
- |
- // Sends a message asynchronously to the context on the other end of this |
- // port. |
- PortImpl.prototype.postMessage = function(msg) { |
- // JSON.stringify doesn't support a root object which is undefined. |
- if (msg === undefined) |
- msg = null; |
- msg = $JSON.stringify(msg); |
- if (msg === undefined) { |
- // JSON.stringify can fail with unserializable objects. Log an error and |
- // drop the message. |
- // |
- // TODO(kalman/mpcomplete): it would be better to do the same validation |
- // here that we do for runtime.sendMessage (and variants), i.e. throw an |
- // schema validation Error, but just maintain the old behaviour until |
- // there's a good reason not to (http://crbug.com/263077). |
- console.error('Illegal argument to Port.postMessage'); |
- return; |
- } |
- messagingNatives.PostMessage(this.portId_, msg); |
- }; |
- |
- // Disconnects the port from the other end. |
- PortImpl.prototype.disconnect = function() { |
- messagingNatives.CloseChannel(this.portId_, true); |
- this.destroy_(); |
- }; |
- |
- PortImpl.prototype.destroy_ = function() { |
- var portId = this.portId_; |
- |
- if (this.onDestroy_) |
- this.onDestroy_(); |
- privates(this.onDisconnect).impl.destroy_(); |
- privates(this.onMessage).impl.destroy_(); |
- |
- messagingNatives.PortRelease(portId); |
- unloadEvent.removeListener(portReleasers[portId]); |
- |
- delete ports[portId]; |
- delete portReleasers[portId]; |
- }; |
- |
// Returns true if the specified port id is in this context. This is used by |
// the C++ to avoid creating the javascript message for all the contexts that |
// don't care about a particular message. |
@@ -113,6 +54,14 @@ |
return port; |
}; |
+ // Called when a Port is destroyed. Does general accounting cleanup. |
+ function onPortDestroyed(port) { |
+ var portId = privates(port).impl.portId_; |
+ unloadEvent.removeListener(portReleasers[portId]); |
+ delete ports[portId]; |
+ delete portReleasers[portId]; |
+ } |
+ |
// Helper function for dispatchOnRequest. |
function handleSendRequestError(isSendMessage, |
responseCallbackPreserved, |
@@ -200,6 +149,7 @@ |
privates(port).impl.onDestroy_ = function() { |
port.onMessage.removeListener(messageListener); |
+ onPortDestroyed(port); |
}; |
port.onMessage.addListener(messageListener); |
@@ -358,6 +308,7 @@ |
privates(port).impl.onDestroy_ = function() { |
Devlin
2015/04/17 00:14:52
I don't love this part, especially now that it's i
not at google - send to devlin
2015/04/17 00:16:34
You need to be careful, because Ports are exposed
Devlin
2015/04/17 00:25:52
Right, in my mind there's:
Private private: Nothin
not at google - send to devlin
2015/04/17 00:27:59
Heh, a distinction unique to these JS bindings.
A
|
port.onDisconnect.removeListener(disconnectListener); |
port.onMessage.removeListener(messageListener); |
+ onPortDestroyed(port); |
}; |
port.onDisconnect.addListener(disconnectListener); |
port.onMessage.addListener(messageListener); |
@@ -373,20 +324,9 @@ |
return alignedArgs; |
} |
-var Port = utils.expose('Port', PortImpl, { functions: [ |
- 'disconnect', |
- 'postMessage' |
- ], |
- properties: [ |
- 'name', |
- 'onDisconnect', |
- 'onMessage' |
- ] }); |
- |
exports.kRequestChannel = kRequestChannel; |
exports.kMessageChannel = kMessageChannel; |
exports.kNativeMessageChannel = kNativeMessageChannel; |
-exports.Port = Port; |
exports.createPort = createPort; |
exports.sendMessageImpl = sendMessageImpl; |
exports.sendMessageUpdateArguments = sendMessageUpdateArguments; |