| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 var Event = require('event_bindings').Event; | |
| 6 var messagingNatives = requireNative('messaging_natives'); | |
| 7 var utils = require('utils'); | |
| 8 | |
| 9 // Port object. Represents a connection to another script context through | |
| 10 // which messages can be passed. | |
| 11 function Port(portId, opt_name) { | |
| 12 this.portId_ = portId; | |
| 13 this.name = opt_name; | |
| 14 | |
| 15 var portSchema = {name: 'port', $ref: 'runtime.Port'}; | |
| 16 var messageSchema = {name: 'message', type: 'any', optional: true}; | |
| 17 var options = {unmanaged: true}; | |
| 18 | |
| 19 this.onMessage = new Event(null, [messageSchema, portSchema], options); | |
| 20 this.onDisconnect = new Event(null, [portSchema], options); | |
| 21 this.onDestroy_ = null; | |
| 22 } | |
| 23 | |
| 24 // Sends a message asynchronously to the context on the other end of this | |
| 25 // port. | |
| 26 Port.prototype.postMessage = function(msg) { | |
| 27 // JSON.stringify doesn't support a root object which is undefined. | |
| 28 if (msg === undefined) | |
| 29 msg = null; | |
| 30 msg = $JSON.stringify(msg); | |
| 31 if (msg === undefined) { | |
| 32 // JSON.stringify can fail with unserializable objects. Log an error and | |
| 33 // drop the message. | |
| 34 // | |
| 35 // TODO(kalman/mpcomplete): it would be better to do the same validation | |
| 36 // here that we do for runtime.sendMessage (and variants), i.e. throw an | |
| 37 // schema validation Error, but just maintain the old behaviour until | |
| 38 // there's a good reason not to (http://crbug.com/263077). | |
| 39 console.error('Illegal argument to Port.postMessage'); | |
| 40 return; | |
| 41 } | |
| 42 messagingNatives.PostMessage(this.portId_, msg); | |
| 43 }; | |
| 44 | |
| 45 // Disconnects the port from the other end. | |
| 46 Port.prototype.disconnect = function() { | |
| 47 messagingNatives.CloseChannel(this.portId_, true); | |
| 48 this.destroy_(); | |
| 49 }; | |
| 50 | |
| 51 Port.prototype.destroy_ = function() { | |
| 52 if (this.onDestroy_) | |
| 53 this.onDestroy_(); | |
| 54 // Destroy the onMessage/onDisconnect events in case the extension added | |
| 55 // listeners, but didn't remove them, when the port closed. | |
| 56 privates(this.onMessage).impl.destroy_(); | |
| 57 privates(this.onDisconnect).impl.destroy_(); | |
| 58 messagingNatives.PortRelease(this.portId_); | |
| 59 }; | |
| 60 | |
| 61 exports.Port = utils.expose('Port', Port, { | |
| 62 functions: ['disconnect', 'postMessage'], | |
| 63 properties: ['name', 'onMessage', 'onDisconnect'] | |
| 64 }); | |
| OLD | NEW |