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

Unified Diff: third_party/WebKit/LayoutTests/http/tests/streams/resources/rs-utils.js

Issue 1404523005: Implement author-constructible ReadableStream using V8 extras (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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
Index: third_party/WebKit/LayoutTests/http/tests/streams/resources/rs-utils.js
diff --git a/third_party/WebKit/LayoutTests/http/tests/streams/resources/rs-utils.js b/third_party/WebKit/LayoutTests/http/tests/streams/resources/rs-utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..fc386a4c22abce5aaaecf2e33e85b499aee7be6c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/streams/resources/rs-utils.js
@@ -0,0 +1,191 @@
+'use strict';
+(function () {
+
+function RandomPushSource(toPush) {
+ this.pushed = 0;
+ this.toPush = toPush;
+ this.started = false;
+ this.paused = false;
+ this.closed = false;
+
+ this._intervalHandle = null;
+}
+
+RandomPushSource.prototype = {
+
+ readStart: function() {
+ if (this.closed) {
+ return;
+ }
+
+ if (!this.started) {
+ this._intervalHandle = setInterval(writeChunk, 23);
+ this.started = true;
+ }
+
+ if (this.paused) {
+ this._intervalHandle = setInterval(writeChunk, 23);
+ this.paused = false;
+ }
+
+ var source = this;
+ function writeChunk() {
+ if (source.paused) {
+ return;
+ }
+
+ source.pushed++;
+
+ if (source.toPush > 0 && source.pushed > source.toPush) {
+ if (source._intervalHandle) {
+ clearInterval(source._intervalHandle);
+ source._intervalHandle = undefined;
+ }
+ source.closed = true;
+ source.onend();
+ } else {
+ source.ondata(randomChunk(128));
+ }
+ }
+ },
+
+ readStop: function() {
+ if (this.paused) {
+ return;
+ }
+
+ if (this.started) {
+ this.paused = true;
+ clearInterval(this._intervalHandle);
+ this._intervalHandle = undefined;
+ } else {
+ throw new Error('Can\'t pause reading an unstarted source.');
+ }
+ }
+};
+
+function randomChunk(size) {
+ var chunk = '';
+
+ for (var i = 0; i < size; i++) {
+ // Add a random character from the basic printable ASCII set.
+ chunk += String.fromCharCode(Math.round(Math.random() * 84) + 32)
+ }
+
+ return chunk;
+}
+
+function readableStreamToArray(readable, reader) {
+ var chunks = [];
+
+ if (reader == undefined) {
+ reader = readable.getReader();
+ }
+
+ return pump();
+
+ function pump() {
+ return reader.read().then(function(result) {
+ if (result.done) {
+ return chunks;
+ }
+
+ chunks.push(result.value);
+ return pump();
+ });
+ }
+}
+
+function SequentialPullSource(limit, async) {
+ this.current = 0;
+ this.limit = limit;
+ this.opened = false;
+ this.closed = false;
+
+ this._exec = function(f) {
+ f();
+ };
+ if (async)
+ this._exec = function(f) {
+ setTimeout(f, 0);
+ };
+}
+
+SequentialPullSource.prototype = {
+
+ open: function(cb) {
+ var myFunction = function() {
+ this.opened = true
+ cb();
+ };
+ this._exec(myFunction.bind(this));
+ },
+
+ read: function(cb) {
+ var myFunction = function() {
+ if (++this.current <= this.limit) {
+ cb(null, false, this.current);
+ } else {
+ cb(null, true, null);
+ }
+ };
+ this._exec(myFunction.bind(this));
+ },
+
+ close: function(cb) {
+ var myFunction = function() {
+ this.closed = true;
+ cb();
+ };
+ this._exec(myFunction.bind(this));
+ },
+}
+
+function sequentialReadableStream(limit, options) {
+ var sequentialSource = new SequentialPullSource(limit, options);
+
+ var stream = new ReadableStream({
+ start: function() {
+ return new Promise(function(resolve, reject) {
+ sequentialSource.open(function(err) {
+ if (err) {
+ reject(err);
+ }
+ resolve();
+ });
+ });
+ },
+
+ pull: function(c) {
+ return new Promise(function(resolve, reject) {
+ sequentialSource.read(function(err, done, chunk) {
+ if (err) {
+ reject(err);
+ } else if (done) {
+ sequentialSource.close(function(err) {
+ if (err) {
+ reject(err);
+ }
+ c.close();
+ resolve();
+ });
+ } else {
+ c.enqueue(chunk);
+ resolve();
+ }
+ });
+ });
+ },
+ });
+
+ stream.source = sequentialSource;
+
+ return stream;
+}
+
+
+self.RandomPushSource = RandomPushSource;
+self.readableStreamToArray = readableStreamToArray;
+self.sequentialReadableStream = sequentialReadableStream;
+
+})();

Powered by Google App Engine
This is Rietveld 408576698