| 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 a3408ddcf05115d6280d9d1b766ae6b8f83956c1..3cc883fa8c2311d6607183005ded319e7b8ac988 100644
 | 
| --- a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp
 | 
| +++ b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp
 | 
| @@ -8,32 +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::MaybeLocal<v8::Value> jsStream = V8ScriptRunner::callExtra(scriptState, "createReadableStreamWithExternalController", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return ScriptValue();
 | 
|      return ScriptValue(scriptState, jsStream.ToLocalChecked());
 | 
|  }
 | 
|  
 | 
|  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::MaybeLocal<v8::Value> jsStrategy = V8ScriptRunner::callExtra(scriptState, "createBuiltInCountQueuingStrategy", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return ScriptValue();
 | 
| +
 | 
|      return ScriptValue(scriptState, jsStrategy.ToLocalChecked());
 | 
|  }
 | 
|  
 | 
|  ScriptValue ReadableStreamOperations::getReader(ScriptState* scriptState, ScriptValue stream, ExceptionState& es)
 | 
|  {
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return ScriptValue();
 | 
|      ASSERT(isReadableStream(scriptState, stream));
 | 
|  
 | 
|      v8::TryCatch block(scriptState->isolate());
 | 
| @@ -46,6 +73,8 @@
 | 
|  
 | 
|  bool ReadableStreamOperations::isReadableStream(ScriptState* scriptState, ScriptValue value)
 | 
|  {
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return true;
 | 
|      ASSERT(!value.isEmpty());
 | 
|  
 | 
|      if (!value.isObject())
 | 
| @@ -53,56 +82,80 @@
 | 
|  
 | 
|      v8::Local<v8::Value> args[] = { value.v8Value() };
 | 
|      v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStream", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return true;
 | 
|      return result.ToLocalChecked()->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() };
 | 
|      v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamDisturbed", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return true;
 | 
|      return result.ToLocalChecked()->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() };
 | 
|      v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamLocked", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return true;
 | 
|      return result.ToLocalChecked()->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() };
 | 
|      v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamReadable", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return false;
 | 
|      return result.ToLocalChecked()->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() };
 | 
|      v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamClosed", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return false;
 | 
|      return result.ToLocalChecked()->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() };
 | 
|      v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamErrored", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return true;
 | 
|      return result.ToLocalChecked()->ToBoolean()->Value();
 | 
|  }
 | 
|  
 | 
|  bool ReadableStreamOperations::isReadableStreamDefaultReader(ScriptState* scriptState, ScriptValue value)
 | 
|  {
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return true;
 | 
|      ASSERT(!value.isEmpty());
 | 
|  
 | 
|      if (!value.isObject())
 | 
| @@ -110,33 +163,47 @@
 | 
|  
 | 
|      v8::Local<v8::Value> args[] = { value.v8Value() };
 | 
|      v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "IsReadableStreamDefaultReader", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return true;
 | 
|      return result.ToLocalChecked()->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() };
 | 
|      v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "ReadableStreamDefaultReaderRead", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return ScriptPromise();
 | 
|      return ScriptPromise::cast(scriptState, result.ToLocalChecked());
 | 
|  }
 | 
|  
 | 
|  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() };
 | 
|  
 | 
|      v8::MaybeLocal<v8::Value> maybeResult = V8ScriptRunner::callExtra(scriptState, "ReadableStreamTee", args);
 | 
| +    if (isTerminating(scriptState))
 | 
| +        return;
 | 
|      ScriptValue result(scriptState, maybeResult.ToLocalChecked());
 | 
|      DCHECK(result.v8Value()->IsArray());
 | 
|      v8::Local<v8::Array> branches = result.v8Value().As<v8::Array>();
 | 
|      DCHECK_EQ(2u, branches->Length());
 | 
|  
 | 
|      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, maybeStream1.ToLocalChecked());
 | 
|      *newStream2 = ScriptValue(scriptState, maybeStream2.ToLocalChecked());
 | 
| 
 |