Index: third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp |
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp |
index fa0f282ede9272ae7705ca5404e7a9049719ace5..2a3adfc50f946235595e0b1e888d7ce6329d3e65 100644 |
--- a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp |
+++ b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp |
@@ -8,34 +8,59 @@ |
#include "bindings/core/v8/ScriptState.h" |
#include "bindings/core/v8/ToV8.h" |
#include "bindings/core/v8/V8ScriptRunner.h" |
+#include "bindings/core/v8/WorkerOrWorkletScriptController.h" |
#include "core/streams/UnderlyingSourceBase.h" |
+#include "core/workers/WorkerGlobalScope.h" |
namespace blink { |
+namespace { |
+ |
+bool isTerminating(ScriptState* scriptState) |
+{ |
+ ExecutionContext* executionContext = scriptState->getExecutionContext(); |
+ if (!executionContext) |
+ return true; |
+ if (!executionContext->isWorkerGlobalScope()) |
+ return false; |
+ return toWorkerGlobalScope(executionContext)->scriptController()->isExecutionTerminating(); |
+} |
+ |
+} // namespace |
+ |
ScriptValue ReadableStreamOperations::createReadableStream(ScriptState* scriptState, UnderlyingSourceBase* underlyingSource, ScriptValue strategy) |
{ |
+ if (isTerminating(scriptState)) |
+ return ScriptValue(); |
ScriptState::Scope scope(scriptState); |
v8::Local<v8::Value> jsUnderlyingSource = toV8(underlyingSource, scriptState); |
v8::Local<v8::Value> jsStrategy = strategy.v8Value(); |
v8::Local<v8::Value> args[] = { jsUnderlyingSource, jsStrategy }; |
- v8::Local<v8::Value> jsStream = V8ScriptRunner::callExtraOrCrash(scriptState, "createReadableStreamWithExternalController", args); |
- |
- return ScriptValue(scriptState, jsStream); |
+ v8::MaybeLocal<v8::Value> jsStream = V8ScriptRunner::callExtra(scriptState, "createReadableStreamWithExternalController", args); |
+ if (isTerminating(scriptState)) |
+ return ScriptValue(); |
+ return ScriptValue(scriptState, v8CallOrCrash(jsStream)); |
} |
ScriptValue ReadableStreamOperations::createCountQueuingStrategy(ScriptState* scriptState, size_t highWaterMark) |
{ |
+ if (isTerminating(scriptState)) |
+ return ScriptValue(); |
ScriptState::Scope scope(scriptState); |
v8::Local<v8::Value> args[] = { v8::Number::New(scriptState->isolate(), highWaterMark) }; |
- v8::Local<v8::Value> jsStrategy = V8ScriptRunner::callExtraOrCrash(scriptState, "createBuiltInCountQueuingStrategy", args); |
+ v8::MaybeLocal<v8::Value> jsStrategy = V8ScriptRunner::callExtra(scriptState, "createBuiltInCountQueuingStrategy", args); |
+ if (isTerminating(scriptState)) |
+ return ScriptValue(); |
- return ScriptValue(scriptState, jsStrategy); |
+ return ScriptValue(scriptState, v8CallOrCrash(jsStrategy)); |
} |
ScriptValue ReadableStreamOperations::getReader(ScriptState* scriptState, ScriptValue stream, ExceptionState& es) |
{ |
+ if (isTerminating(scriptState)) |
+ return ScriptValue(); |
ASSERT(isReadableStream(scriptState, stream)); |
v8::TryCatch block(scriptState->isolate()); |
@@ -48,86 +73,140 @@ ScriptValue ReadableStreamOperations::getReader(ScriptState* scriptState, Script |
bool ReadableStreamOperations::isReadableStream(ScriptState* scriptState, ScriptValue value) |
{ |
+ if (isTerminating(scriptState)) |
+ return true; |
ASSERT(!value.isEmpty()); |
if (!value.isObject()) |
return false; |
v8::Local<v8::Value> args[] = { value.v8Value() }; |
- return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStream", args)->ToBoolean()->Value(); |
+ v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStream", args); |
+ if (isTerminating(scriptState)) |
+ return true; |
+ return v8CallOrCrash(result)->ToBoolean()->Value(); |
} |
bool ReadableStreamOperations::isDisturbed(ScriptState* scriptState, ScriptValue stream) |
{ |
+ if (isTerminating(scriptState)) |
+ return true; |
ASSERT(isReadableStream(scriptState, stream)); |
v8::Local<v8::Value> args[] = { stream.v8Value() }; |
- return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamDisturbed", args)->ToBoolean()->Value(); |
+ v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamDisturbed", args); |
+ if (isTerminating(scriptState)) |
+ return true; |
+ return v8CallOrCrash(result)->ToBoolean()->Value(); |
} |
bool ReadableStreamOperations::isLocked(ScriptState* scriptState, ScriptValue stream) |
{ |
+ if (isTerminating(scriptState)) |
+ return true; |
ASSERT(isReadableStream(scriptState, stream)); |
v8::Local<v8::Value> args[] = { stream.v8Value() }; |
- return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamLocked", args)->ToBoolean()->Value(); |
+ v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamLocked", args); |
+ if (isTerminating(scriptState)) |
+ return true; |
+ return v8CallOrCrash(result)->ToBoolean()->Value(); |
} |
bool ReadableStreamOperations::isReadable(ScriptState* scriptState, ScriptValue stream) |
{ |
+ if (isTerminating(scriptState)) |
+ return false; |
ASSERT(isReadableStream(scriptState, stream)); |
v8::Local<v8::Value> args[] = { stream.v8Value() }; |
- return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamReadable", args)->ToBoolean()->Value(); |
+ v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamReadable", args); |
+ if (isTerminating(scriptState)) |
+ return false; |
+ return v8CallOrCrash(result)->ToBoolean()->Value(); |
} |
bool ReadableStreamOperations::isClosed(ScriptState* scriptState, ScriptValue stream) |
{ |
+ if (isTerminating(scriptState)) |
+ return false; |
ASSERT(isReadableStream(scriptState, stream)); |
v8::Local<v8::Value> args[] = { stream.v8Value() }; |
- return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamClosed", args)->ToBoolean()->Value(); |
+ v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamClosed", args); |
+ if (isTerminating(scriptState)) |
+ return false; |
+ return v8CallOrCrash(result)->ToBoolean()->Value(); |
} |
bool ReadableStreamOperations::isErrored(ScriptState* scriptState, ScriptValue stream) |
{ |
+ if (isTerminating(scriptState)) |
+ return true; |
ASSERT(isReadableStream(scriptState, stream)); |
v8::Local<v8::Value> args[] = { stream.v8Value() }; |
- return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamErrored", args)->ToBoolean()->Value(); |
+ v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamErrored", args); |
+ if (isTerminating(scriptState)) |
+ return true; |
+ return v8CallOrCrash(result)->ToBoolean()->Value(); |
} |
bool ReadableStreamOperations::isReadableStreamDefaultReader(ScriptState* scriptState, ScriptValue value) |
{ |
+ if (isTerminating(scriptState)) |
+ return true; |
ASSERT(!value.isEmpty()); |
if (!value.isObject()) |
return false; |
v8::Local<v8::Value> args[] = { value.v8Value() }; |
- return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamDefaultReader", args)->ToBoolean()->Value(); |
+ v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamDefaultReader", args); |
+ if (isTerminating(scriptState)) |
+ return true; |
+ return v8CallOrCrash(result)->ToBoolean()->Value(); |
} |
ScriptPromise ReadableStreamOperations::defaultReaderRead(ScriptState* scriptState, ScriptValue reader) |
{ |
+ if (isTerminating(scriptState)) |
+ return ScriptPromise(); |
ASSERT(isReadableStreamDefaultReader(scriptState, reader)); |
v8::Local<v8::Value> args[] = { reader.v8Value() }; |
- return ScriptPromise::cast(scriptState, V8ScriptRunner::callExtraOrCrash(scriptState, "ReadableStreamDefaultReaderRead", args)); |
+ v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "ReadableStreamDefaultReaderRead", args); |
+ if (isTerminating(scriptState)) |
+ return ScriptPromise(); |
+ return ScriptPromise::cast(scriptState, v8CallOrCrash(result)); |
} |
void ReadableStreamOperations::tee(ScriptState* scriptState, ScriptValue stream, ScriptValue* newStream1, ScriptValue* newStream2) |
{ |
+ if (isTerminating(scriptState)) |
+ return; |
DCHECK(isReadableStream(scriptState, stream)); |
DCHECK(!isLocked(scriptState, stream)); |
v8::Local<v8::Value> args[] = { stream.v8Value() }; |
- ScriptValue result(scriptState, V8ScriptRunner::callExtraOrCrash(scriptState, "ReadableStreamTee", args)); |
+ |
+ v8::MaybeLocal<v8::Value> maybeResult = V8ScriptRunner::callExtra(scriptState, "ReadableStreamTee", args); |
+ if (isTerminating(scriptState)) |
+ return; |
+ ScriptValue result(scriptState, v8CallOrCrash(maybeResult)); |
DCHECK(result.v8Value()->IsArray()); |
v8::Local<v8::Array> branches = result.v8Value().As<v8::Array>(); |
DCHECK_EQ(2u, branches->Length()); |
- *newStream1 = ScriptValue(scriptState, v8CallOrCrash(branches->Get(scriptState->context(), 0))); |
- *newStream2 = ScriptValue(scriptState, v8CallOrCrash(branches->Get(scriptState->context(), 1))); |
+ |
+ v8::MaybeLocal<v8::Value> maybeStream1 = branches->Get(scriptState->context(), 0); |
+ if (isTerminating(scriptState)) |
+ return; |
+ v8::MaybeLocal<v8::Value> maybeStream2 = branches->Get(scriptState->context(), 1); |
+ if (isTerminating(scriptState)) |
+ return; |
+ |
+ *newStream1 = ScriptValue(scriptState, v8CallOrCrash(maybeStream1)); |
+ *newStream2 = ScriptValue(scriptState, v8CallOrCrash(maybeStream2)); |
DCHECK(isReadableStream(scriptState, *newStream1)); |
DCHECK(isReadableStream(scriptState, *newStream2)); |