Index: third_party/WebKit/Source/core/streams/ReadableStreamController.h |
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamController.h b/third_party/WebKit/Source/core/streams/ReadableStreamController.h |
index 02425e2fdf3f1c56223f47e9731b598caf1026ff..c25b1d95061337a4d56d83bdcbb297f630b30731 100644 |
--- a/third_party/WebKit/Source/core/streams/ReadableStreamController.h |
+++ b/third_party/WebKit/Source/core/streams/ReadableStreamController.h |
@@ -9,7 +9,9 @@ |
#include "bindings/core/v8/ScriptValue.h" |
#include "bindings/core/v8/ToV8.h" |
#include "bindings/core/v8/V8ScriptRunner.h" |
+#include "bindings/core/v8/WorkerOrWorkletScriptController.h" |
#include "core/CoreExport.h" |
+#include "core/workers/WorkerGlobalScope.h" |
#include "platform/heap/Handle.h" |
#include "wtf/RefPtr.h" |
#include <v8.h> |
@@ -43,6 +45,10 @@ |
void close() |
{ |
+ if (isTerminating(m_scriptState.get())) { |
+ m_jsController.clear(); |
+ return; |
+ } |
ScriptState* scriptState = m_scriptState.get(); |
ScriptState::Scope scope(scriptState); // will assert context is valid; do not call this method when the context is invalidated |
v8::Isolate* isolate = scriptState->isolate(); |
@@ -54,11 +60,15 @@ |
v8::Local<v8::Value> args[] = { controller }; |
v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "ReadableStreamDefaultControllerClose", args); |
m_jsController.clear(); |
+ if (isTerminating(m_scriptState.get())) |
+ return; |
result.ToLocalChecked(); |
} |
double desiredSize() const |
{ |
+ if (isTerminating(m_scriptState.get())) |
+ return 0; |
ScriptState* scriptState = m_scriptState.get(); |
ScriptState::Scope scope(scriptState); // will assert context is valid; do not call this method when the context is invalidated |
v8::Isolate* isolate = scriptState->isolate(); |
@@ -69,12 +79,17 @@ |
v8::Local<v8::Value> args[] = { controller }; |
v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "ReadableStreamDefaultControllerGetDesiredSize", args); |
+ if (isTerminating(m_scriptState.get())) |
+ return 0; |
+ |
return result.ToLocalChecked().As<v8::Number>()->Value(); |
} |
template <typename ChunkType> |
void enqueue(ChunkType chunk) const |
{ |
+ if (isTerminating(m_scriptState.get())) |
+ return; |
ScriptState* scriptState = m_scriptState.get(); |
ScriptState::Scope scope(scriptState); // will assert context is valid; do not call this method when the context is invalidated |
v8::Isolate* isolate = scriptState->isolate(); |
@@ -86,12 +101,18 @@ |
v8::Local<v8::Value> jsChunk = toV8(chunk, scriptState); |
v8::Local<v8::Value> args[] = { controller, jsChunk }; |
v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "ReadableStreamDefaultControllerEnqueue", args); |
+ if (isTerminating(m_scriptState.get())) |
+ return; |
result.ToLocalChecked(); |
} |
template <typename ErrorType> |
void error(ErrorType error) |
{ |
+ if (isTerminating(m_scriptState.get())) { |
+ m_jsController.clear(); |
+ return; |
+ } |
ScriptState* scriptState = m_scriptState.get(); |
ScriptState::Scope scope(scriptState); // will assert context is valid; do not call this method when the context is invalidated |
v8::Isolate* isolate = scriptState->isolate(); |
@@ -104,10 +125,22 @@ |
v8::Local<v8::Value> args[] = { controller, jsError }; |
v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "ReadableStreamDefaultControllerError", args); |
m_jsController.clear(); |
+ if (isTerminating(m_scriptState.get())) |
+ return; |
result.ToLocalChecked(); |
} |
private: |
+ static bool isTerminating(ScriptState* scriptState) |
+ { |
+ ExecutionContext* executionContext = scriptState->getExecutionContext(); |
+ if (!executionContext) |
+ return true; |
+ if (!executionContext->isWorkerGlobalScope()) |
+ return false; |
+ return toWorkerGlobalScope(executionContext)->scriptController()->isExecutionTerminating(); |
+ } |
+ |
RefPtr<ScriptState> m_scriptState; |
ScopedPersistent<v8::Value> m_jsController; |
}; |