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

Unified Diff: third_party/WebKit/Source/core/streams/ReadableStream.js

Issue 1167343002: Add methods for creating V8 extras-based ReadableStreams from C++ (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Trying blindly to resolve circular dependency Created 4 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
Index: third_party/WebKit/Source/core/streams/ReadableStream.js
diff --git a/third_party/WebKit/Source/core/streams/ReadableStream.js b/third_party/WebKit/Source/core/streams/ReadableStream.js
index 0e745b865e631758514b4c423fd0d6a5a9262163..62522533c4b53b72374074307140a6d3230b6f9f 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStream.js
+++ b/third_party/WebKit/Source/core/streams/ReadableStream.js
@@ -27,6 +27,9 @@
const readableStreamReaderReadRequests =
v8.createPrivateSymbol('[[readRequests]]');
+ const createWithExternalControllerSentinel =
+ v8.createPrivateSymbol('flag for UA-created ReadableStream to pass');
+
const STATE_READABLE = 0;
const STATE_CLOSED = 1;
const STATE_ERRORED = 2;
@@ -119,11 +122,24 @@
this[readableStreamStrategySize] = normalizedStrategy.size;
this[readableStreamStrategyHWM] = normalizedStrategy.highWaterMark;
- const controller = new ReadableStreamController(this);
+ // Avoid allocating the controller if the stream is going to be controlled
+ // externally (i.e. from C++) anyway. All calls to underlyingSource
+ // methods will disregard their controller argument in such situations
+ // (but see below).
+
+ const isControlledExternally =
+ arguments[2] === createWithExternalControllerSentinel;
+ const controller =
+ isControlledExternally ? null : new ReadableStreamController(this);
this[readableStreamController] = controller;
+ // We need to pass ourself to the underlyingSource start method for
+ // externally-controlled streams. We use the now-useless controller
+ // argument to do so.
+ const argToStart = isControlledExternally ? this : controller;
+
const startResult = CallOrNoop(
- underlyingSource, 'start', controller, 'underlyingSource.start');
+ underlyingSource, 'start', argToStart, 'underlyingSource.start');
thenPromise(Promise_resolve(startResult),
() => {
this[readableStreamBits] |= STARTED;
@@ -330,8 +346,8 @@
v8.rejectPromise(this[readableStreamReaderClosedPromise],
new TypeError(errReleasedReaderClosedPromise));
} else {
- this[readableStreamReaderClosedPromise] = Promise_reject(new TypeError(
- errReleasedReaderClosedPromise));
+ this[readableStreamReaderClosedPromise] =
+ Promise_reject(new TypeError(errReleasedReaderClosedPromise));
}
this[readableStreamReaderOwnerReadableStream][readableStreamReader] =
@@ -771,4 +787,15 @@
binding.IsReadableStreamLocked = IsReadableStreamLocked;
binding.IsReadableStreamReader = IsReadableStreamReader;
binding.ReadFromReadableStreamReader = ReadFromReadableStreamReader;
+
+ binding.CloseReadableStream = CloseReadableStream;
+ binding.GetReadableStreamDesiredSize = GetReadableStreamDesiredSize;
+ binding.EnqueueInReadableStream = EnqueueInReadableStream;
+ binding.ErrorReadableStream = ErrorReadableStream;
+
+ binding.createReadableStreamWithExternalController =
+ (underlyingSource, strategy) => {
+ return new ReadableStream(
+ underlyingSource, strategy, createWithExternalControllerSentinel);
+ };
});

Powered by Google App Engine
This is Rietveld 408576698