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..0f3222e23cab7a0a6d6177116c99ed90df957977 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/http/tests/streams/resources/rs-utils.js |
@@ -0,0 +1,185 @@ |
+'use strict'; |
+(function () { |
+ |
+ class RandomPushSource { |
+ constructor(toPush) { |
+ this.pushed = 0; |
+ this.toPush = toPush; |
+ this.started = false; |
+ this.paused = false; |
+ this.closed = false; |
+ |
+ this._intervalHandle = null; |
+ } |
+ |
+ readStart() { |
+ if (this.closed) { |
+ return; |
+ } |
+ |
+ if (!this.started) { |
+ this._intervalHandle = setInterval(writeChunk, 2); |
+ this.started = true; |
+ } |
+ |
+ if (this.paused) { |
+ this._intervalHandle = setInterval(writeChunk, 2); |
+ this.paused = false; |
+ } |
+ |
+ const 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() { |
+ 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) { |
+ let chunk = ''; |
+ |
+ for (let 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) { |
+ if (reader === undefined) { |
+ reader = readable.getReader(); |
+ } |
+ |
+ const chunks = []; |
+ |
+ return pump(); |
+ |
+ function pump() { |
+ return reader.read().then(result => { |
+ if (result.done) { |
+ return chunks; |
+ } |
+ |
+ chunks.push(result.value); |
+ return pump(); |
+ }); |
+ } |
+ } |
+ |
+ class SequentialPullSource { |
+ constructor(limit, options) { |
+ const async = options && options.async; |
+ |
+ this.current = 0; |
+ this.limit = limit; |
+ this.opened = false; |
+ this.closed = false; |
+ |
+ this._exec = f => f(); |
+ if (async) { |
+ this._exec = f => setTimeout(f, 0); |
+ } |
+ } |
+ |
+ open(cb) { |
+ this._exec(() => { |
+ this.opened = true; |
+ cb(); |
+ }); |
+ } |
+ |
+ read(cb) { |
+ this._exec(() => { |
+ if (++this.current <= this.limit) { |
+ cb(null, false, this.current); |
+ } else { |
+ cb(null, true, null); |
+ } |
+ }); |
+ } |
+ |
+ close(cb) { |
+ this._exec(() => { |
+ this.closed = true; |
+ cb(); |
+ }); |
+ } |
+ } |
+ |
+ function sequentialReadableStream(limit, options) { |
+ const sequentialSource = new SequentialPullSource(limit, options); |
+ |
+ const stream = new ReadableStream({ |
+ start() { |
+ return new Promise((resolve, reject) => { |
+ sequentialSource.open(err => { |
+ if (err) { |
+ reject(err); |
+ } |
+ resolve(); |
+ }); |
+ }); |
+ }, |
+ |
+ pull(c) { |
+ return new Promise((resolve, reject) => { |
+ sequentialSource.read((err, done, chunk) => { |
+ if (err) { |
+ reject(err); |
+ } else if (done) { |
+ sequentialSource.close(err2 => { |
+ if (err2) { |
+ reject(err2); |
+ } |
+ c.close(); |
+ resolve(); |
+ }); |
+ } else { |
+ c.enqueue(chunk); |
+ resolve(); |
+ } |
+ }); |
+ }); |
+ } |
+ }); |
+ |
+ stream.source = sequentialSource; |
+ |
+ return stream; |
+ } |
+ |
+ |
+ self.RandomPushSource = RandomPushSource; |
+ self.readableStreamToArray = readableStreamToArray; |
+ self.sequentialReadableStream = sequentialReadableStream; |
+ |
+}()); |