Chromium Code Reviews| Index: extensions/renderer/resources/data_sender.js |
| diff --git a/extensions/renderer/resources/data_sender.js b/extensions/renderer/resources/data_sender.js |
| index ee1abb33ab0b98d29639f21c8ae9098e500d2a24..c9270f705aea732f9f23e7a914689c3d2142932d 100644 |
| --- a/extensions/renderer/resources/data_sender.js |
| +++ b/extensions/renderer/resources/data_sender.js |
| @@ -5,9 +5,10 @@ |
| define('data_sender', [ |
| 'async_waiter', |
| 'device/serial/data_stream.mojom', |
| + 'device/serial/data_stream_serialization.mojom', |
| 'mojo/public/js/bindings/core', |
| 'mojo/public/js/bindings/router', |
| -], function(asyncWaiter, dataStreamMojom, core, routerModule) { |
| +], function(asyncWaiter, dataStreamMojom, serialization, core, routerModule) { |
| /** |
| * @module data_sender |
| */ |
| @@ -257,10 +258,70 @@ define('data_sender', [ |
| this.sendsAwaitingAck_.pop().reportBytesSentAndError( |
| 0, this.fatalErrorValue_); |
| } |
| - if (this.pendingCancel_) { |
| - this.pendingCancel_(); |
| - this.pendingCancel_ = null; |
| + this.callCancelCallback_(); |
| + }; |
| + |
| + /** |
| + * Serializes this DataSender. |
| + * @return {Promise.<?SerializedDataSender>} The serialization of this |
|
raymes
2014/09/18 03:16:06
returns a promise that resolves to
Sam McNally
2014/09/19 04:58:46
Done.
|
| + * DataSender. If this DataSender has shut down, this will return null. |
|
raymes
2014/09/18 03:16:06
It's probably worth noting that any sends in progr
Sam McNally
2014/09/19 04:58:47
Done.
|
| + */ |
| + DataSender.prototype.serialize = function() { |
| + if (this.shutDown_) |
| + return Promise.resolve(null); |
| + |
| + var readyToSerialize = Promise.resolve(); |
| + if (this.pendingSends_.length) { |
| + if (this.pendingCancel_) |
| + readyToSerialize = this.cancelPromise_; |
| + else |
| + readyToSerialize = this.cancel(this.fatalErrorValue_); |
| } |
| + return readyToSerialize.then(function() { |
| + this.waiter_.stop(); |
| + var serialized = new serialization.SerializedDataSender(); |
| + serialized.sink = this.router_.connector_.handle_, |
| + serialized.data_pipe = this.sendPipe_, |
| + serialized.fatal_error_value = this.fatalErrorValue_, |
| + this.router_.connector_.handle_ = null; |
| + this.router_.close(); |
| + this.shutDown_ = true; |
| + return serialized; |
| + }.bind(this)); |
| + }; |
| + |
| + /** |
| + * Deserializes a SerializedDataSender. |
| + * @param {?SerializedDataSender} serialized The serialized DataSender. |
| + * @return {DataSender} The deserialized DataSender. |
| + */ |
| + DataSender.deserialize = function(serialized) { |
| + var sender = $Object.create(DataSender.prototype); |
| + sender.deserialize_(serialized); |
| + return sender; |
| + }; |
| + |
| + /** |
| + * Deserializes a SerializedDataSender into this DataSender. |
| + * @param {?SerializedDataSender} serialized The serialized DataSender. |
| + * @private |
| + */ |
| + DataSender.prototype.deserialize_ = function(serialized) { |
| + if (!serialized) { |
| + this.shutDown_ = true; |
| + return; |
| + } |
| + this.sendPipe_ = serialized.data_pipe; |
| + this.fatalErrorValue_ = serialized.fatal_error_value; |
| + this.shutDown_ = false; |
| + this.router_ = new routerModule.Router(serialized.sink); |
| + this.sink_ = new dataStreamMojom.DataSinkProxy(this.router_); |
| + this.router_.setIncomingReceiver(this); |
| + this.waiter_ = new asyncWaiter.AsyncWaiter(this.sendPipe_, |
| + core.HANDLE_SIGNAL_WRITABLE, |
| + this.onHandleReady_.bind(this)); |
| + this.pendingSends_ = []; |
| + this.sendsAwaitingAck_ = []; |
|
raymes
2014/09/18 03:16:06
One downside of this approach (not calling the con
Sam McNally
2014/09/19 04:58:47
Done.
|
| }; |
| /** |
| @@ -301,9 +362,10 @@ define('data_sender', [ |
| return Promise.resolve(); |
| this.sink_.cancel(error); |
| - return new Promise(function(resolve) { |
| + this.cancelPromise_ = new Promise(function(resolve) { |
| this.pendingCancel_ = resolve; |
| }.bind(this)); |
| + return this.cancelPromise_; |
|
raymes
2014/09/18 03:16:06
so it's safe to have multiple things call .then()
Sam McNally
2014/09/19 04:58:47
Yes!
|
| }; |
| /** |
| @@ -337,6 +399,7 @@ define('data_sender', [ |
| */ |
| DataSender.prototype.callCancelCallback_ = function() { |
| if (this.pendingCancel_) { |
| + this.cancelPromise_ = null; |
| this.pendingCancel_(); |
| this.pendingCancel_ = null; |
| } |