Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(964)

Unified Diff: extensions/renderer/resources/data_sender.js

Issue 889283002: Remove Client= from device/serial/data_stream.mojom. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: This time without racing message pipes Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « extensions/renderer/resources/data_receiver.js ('k') | extensions/renderer/resources/serial_service.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/resources/data_sender.js
diff --git a/extensions/renderer/resources/data_sender.js b/extensions/renderer/resources/data_sender.js
index db259ec6e08789b8b0f01a17cc62e7c6a3227180..0fe084ffe0307fb32820dac443a342672f868ff4 100644
--- a/extensions/renderer/resources/data_sender.js
+++ b/extensions/renderer/resources/data_sender.js
@@ -21,8 +21,8 @@ define('data_sender', [
*/
function PendingSend(data) {
/**
- * The remaining data to be sent.
- * @type {!ArrayBuffer}
+ * The data to be sent.
+ * @type {ArrayBuffer}
* @private
*/
this.data_ = data;
@@ -33,12 +33,6 @@ define('data_sender', [
*/
this.length_ = data.byteLength;
/**
- * The number of bytes that have been received by the DataSink.
- * @type {number}
- * @private
- */
- this.bytesReceivedBySink_ = 0;
- /**
* The promise that will be resolved or rejected when this send completes
* or fails, respectively.
* @type {!Promise.<number>}
@@ -70,29 +64,13 @@ define('data_sender', [
};
/**
- * @typedef module:data_sender~PendingSend.ReportBytesResult
- * @property {number} bytesUnreported The number of bytes reported that were
- * not part of the send.
- * @property {boolean} done Whether this send has completed.
- * @property {?number} bytesToFlush The number of bytes to flush in the event
- * of an error.
- */
-
- /**
* Invoked when the DataSink reports that bytes have been sent. Resolves the
* promise returned by
* [getPromise()]{@link module:data_sender~PendingSend#getPromise} once all
* bytes have been reported as sent.
- * @param {number} numBytes The number of bytes sent.
- * @return {!module:data_sender~PendingSend.ReportBytesResult}
*/
- PendingSend.prototype.reportBytesSent = function(numBytes) {
- var result = this.reportBytesSentInternal_(numBytes);
- if (this.bytesReceivedBySink_ == this.length_) {
- result.done = true;
- this.successCallback_(this.bytesReceivedBySink_);
- }
- return result;
+ PendingSend.prototype.reportBytesSent = function() {
+ this.successCallback_(this.length_);
};
/**
@@ -102,84 +80,40 @@ define('data_sender', [
* the nubmer of outstanding bytes.
* @param {number} numBytes The number of bytes sent.
* @param {number} error The error reported by the DataSink.
- * @return {!module:data_sender~PendingSend.ReportBytesResult}
*/
PendingSend.prototype.reportBytesSentAndError = function(numBytes, error) {
- var result = this.reportBytesSentInternal_(numBytes);
- // If there are remaining bytes to report, the error occurred after this
- // PendingSend so we should report success.
- if (result.bytesUnreported > 0) {
- this.successCallback_(this.bytesReceivedBySink_);
- result.bytesToFlush = 0;
- return result;
- }
-
var e = new Error();
e.error = error;
- e.bytesSent = this.bytesReceivedBySink_;
+ e.bytesSent = numBytes;
this.errorCallback_(e);
- this.done = true;
- result.bytesToFlush =
- this.length_ - this.data_.byteLength - this.bytesReceivedBySink_;
- return result;
- };
-
- /**
- * Updates the internal state in response to a report from the DataSink.
- * @param {number} numBytes The number of bytes sent.
- * @return {!module:data_sender~PendingSend.ReportBytesResult}
- * @private
- */
- PendingSend.prototype.reportBytesSentInternal_ = function(numBytes) {
- this.bytesReceivedBySink_ += numBytes;
- var result = {bytesUnreported: 0};
- if (this.bytesReceivedBySink_ > this.length_) {
- result.bytesUnreported = this.bytesReceivedBySink_ - this.length_;
- this.bytesReceivedBySink_ = this.length_;
- }
- result.done = false;
- return result;
};
/**
* Writes pending data into the data pipe.
* @param {!DataSink} sink The DataSink to receive the data.
- * @param {number} availableBufferCapacity The maximum number of bytes to
- * send.
* @return {!Object} result The send result.
* @return {boolean} result.completed Whether all of the pending data was
* sent.
- * @return {number} result.remainingBufferCapacity The remaining send buffer
- * capacity.
*/
- PendingSend.prototype.sendData = function(sink, availableBufferCapacity) {
- var numBytesToSend =
- Math.min(availableBufferCapacity, this.data_.byteLength);
- sink.onData(new Uint8Array(this.data_, 0, numBytesToSend));
- this.data_ = this.data_.slice(numBytesToSend);
- return {
- completed: this.data_.byteLength == 0,
- remainingBufferCapacity: availableBufferCapacity - numBytesToSend,
- };
+ PendingSend.prototype.sendData = function(sink) {
+ var dataSent = sink.onData(new Uint8Array(this.data_));
+ this.data_ = null;
+ return dataSent;
};
/**
* A DataSender that sends data to a DataSink.
- * @param {!MojoHandle} handle The handle to the DataSink.
+ * @param {!MojoHandle} sink The handle to the DataSink.
* @param {number} bufferSize How large a buffer to use for data.
* @param {number} fatalErrorValue The send error value to report in the
* event of a fatal error.
* @constructor
* @alias module:data_sender.DataSender
*/
- function DataSender(handle, bufferSize, fatalErrorValue) {
- this.init_(handle, fatalErrorValue, bufferSize);
- this.sink_.init(bufferSize);
+ function DataSender(sink, bufferSize, fatalErrorValue) {
+ this.init_(sink, fatalErrorValue);
}
- DataSender.prototype =
- $Object.create(dataStreamMojom.DataSinkClient.stubClass.prototype);
-
/**
* Closes this DataSender.
*/
@@ -188,10 +122,6 @@ define('data_sender', [
return;
this.shutDown_ = true;
this.router_.close();
- while (this.pendingSends_.length) {
- this.pendingSends_.pop().reportBytesSentAndError(
- 0, this.fatalErrorValue_);
- }
while (this.sendsAwaitingAck_.length) {
this.sendsAwaitingAck_.pop().reportBytesSentAndError(
0, this.fatalErrorValue_);
@@ -201,13 +131,12 @@ define('data_sender', [
/**
* Initialize this DataSender.
- * @param {!MojoHandle} sink A handle to the DataSink
+ * @param {!MojoHandle} sink A handle to the DataSink.
* @param {number} fatalErrorValue The error to dispatch in the event of a
* fatal error.
- * @param {number} bufferSize The size of the send buffer.
* @private
*/
- DataSender.prototype.init_ = function(sink, fatalErrorValue, bufferSize) {
+ DataSender.prototype.init_ = function(sink, fatalErrorValue) {
/**
* The error to be dispatched in the event of a fatal error.
* @const {number}
@@ -231,13 +160,6 @@ define('data_sender', [
* @private
*/
this.sink_ = new dataStreamMojom.DataSink.proxyClass(this.router_);
- this.router_.setIncomingReceiver(this);
- /**
- * A queue of sends that have not fully sent their data to the DataSink.
- * @type {!module:data_sender~PendingSend[]}
- * @private
- */
- this.pendingSends_ = [];
/**
* A queue of sends that have sent their data to the DataSink, but have not
* been received by the DataSink.
@@ -260,12 +182,6 @@ define('data_sender', [
* @private
*/
this.cancelPromise_ = null;
- /**
- * The available send buffer capacity.
- * @type {number}
- * @private
- */
- this.availableBufferCapacity_ = bufferSize;
};
/**
@@ -281,7 +197,7 @@ define('data_sender', [
return Promise.resolve(null);
var readyToSerialize = Promise.resolve();
- if (this.pendingSends_.length || this.sendsAwaitingAck_.length) {
+ if (this.sendsAwaitingAck_.length) {
if (this.pendingCancel_)
readyToSerialize = this.cancelPromise_;
else
@@ -291,7 +207,6 @@ define('data_sender', [
var serialized = new serialization.SerializedDataSender();
serialized.sink = this.router_.connector_.handle_;
serialized.fatal_error_value = this.fatalErrorValue_;
- serialized.buffer_size = this.availableBufferCapacity_;
this.router_.connector_.handle_ = null;
this.router_.close();
this.shutDown_ = true;
@@ -320,8 +235,8 @@ define('data_sender', [
this.shutDown_ = true;
return;
}
- this.init_(
- serialized.sink, serialized.fatal_error_value, serialized.buffer_size);
+ this.init_(serialized.sink, serialized.fatal_error_value,
+ serialized.buffer_size);
};
/**
@@ -338,22 +253,11 @@ define('data_sender', [
if (this.pendingCancel_)
throw new Error('Cancel in progress');
var send = new PendingSend(data);
- this.pendingSends_.push(send);
- this.sendInternal_();
+ this.sendsAwaitingAck_.push(send);
+ send.sendData(this.sink_).then(this.reportBytesSentAndError.bind(this));
return send.getPromise();
};
- DataSender.prototype.sendInternal_ = function() {
- while (this.pendingSends_.length && this.availableBufferCapacity_) {
- var result = this.pendingSends_[0].sendData(
- this.sink_, this.availableBufferCapacity_);
- this.availableBufferCapacity_ = result.remainingBufferCapacity;
- if (result.completed) {
- this.sendsAwaitingAck_.push(this.pendingSends_.shift());
- }
- }
- };
-
/**
* Requests the cancellation of any in-progress sends. Calls to
* [send()]{@link module:data_sender.DataSender#send} will fail until the
@@ -368,7 +272,7 @@ define('data_sender', [
throw new Error('DataSender has been closed');
if (this.pendingCancel_)
throw new Error('Cancel already in progress');
- if (this.pendingSends_.length + this.sendsAwaitingAck_.length == 0)
+ if (this.sendsAwaitingAck_.length == 0)
return Promise.resolve();
this.sink_.cancel(error);
@@ -392,28 +296,17 @@ define('data_sender', [
/**
* Invoked by the DataSink to report that data has been successfully sent.
- * @param {number} numBytes The number of bytes sent.
* @private
*/
- DataSender.prototype.reportBytesSent = function(numBytes) {
- this.availableBufferCapacity_ += numBytes;
- while (numBytes > 0 && this.sendsAwaitingAck_.length) {
- var result = this.sendsAwaitingAck_[0].reportBytesSent(numBytes);
- numBytes = result.bytesUnreported;
- if (result.done)
- this.sendsAwaitingAck_.shift();
- }
- if (numBytes > 0 && this.pendingSends_.length) {
- var result = this.pendingSends_[0].reportBytesSent(numBytes);
- numBytes = result.bytesUnreported;
- }
+ DataSender.prototype.reportBytesSent = function() {
+ var result = this.sendsAwaitingAck_[0].reportBytesSent();
+ this.sendsAwaitingAck_.shift();
+
// A cancel is completed when all of the sends that were in progress have
// completed or failed. This is the case where all sends complete
// successfully.
- if (this.pendingSends_.length + this.sendsAwaitingAck_.length == 0)
+ if (this.sendsAwaitingAck_.length == 0)
this.callCancelCallback_();
-
- this.sendInternal_();
};
/**
@@ -422,26 +315,20 @@ define('data_sender', [
* @param {number} error The error reported by the DataSink.
* @private
*/
- DataSender.prototype.reportBytesSentAndError = function(numBytes, error) {
- this.availableBufferCapacity_ += numBytes;
- while (this.sendsAwaitingAck_.length) {
- var result = this.sendsAwaitingAck_[0].reportBytesSentAndError(
- numBytes, error);
- numBytes = result.bytesUnreported;
- this.sendsAwaitingAck_.shift();
- this.availableBufferCapacity_ += result.bytesToFlush;
- }
- while (this.pendingSends_.length) {
- var result = this.pendingSends_[0].reportBytesSentAndError(
- numBytes, error);
- numBytes = result.bytesUnreported;
- this.pendingSends_.shift();
- // Note: Only the first PendingSend in |pendingSends_| will have data to
- // flush as only the first can have sent data to the DataSink.
- this.availableBufferCapacity_ += result.bytesToFlush;
+ DataSender.prototype.reportBytesSentAndError = function(result) {
+ var numBytes = result.bytes_sent;
+ var error = result.error;
+ if (!error) {
+ this.reportBytesSent();
+ return;
}
+ var result =
+ this.sendsAwaitingAck_[0].reportBytesSentAndError(numBytes, error);
+ this.sendsAwaitingAck_.shift();
+ if (this.sendsAwaitingAck_.length)
+ return;
this.callCancelCallback_();
- return Promise.resolve();
+ this.sink_.clearError();
};
return {DataSender: DataSender};
« no previous file with comments | « extensions/renderer/resources/data_receiver.js ('k') | extensions/renderer/resources/serial_service.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698