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

Unified Diff: third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp

Issue 2006803006: [Fetch API] Do not call v8 Extra script when the worker is terminating (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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/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));

Powered by Google App Engine
This is Rietveld 408576698