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

Side by Side 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, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/streams/ReadableStreamOperations.h" 5 #include "core/streams/ReadableStreamOperations.h"
6 6
7 #include "bindings/core/v8/ExceptionState.h" 7 #include "bindings/core/v8/ExceptionState.h"
8 #include "bindings/core/v8/ScriptState.h" 8 #include "bindings/core/v8/ScriptState.h"
9 #include "bindings/core/v8/ToV8.h" 9 #include "bindings/core/v8/ToV8.h"
10 #include "bindings/core/v8/V8ScriptRunner.h" 10 #include "bindings/core/v8/V8ScriptRunner.h"
11 #include "bindings/core/v8/WorkerOrWorkletScriptController.h"
11 #include "core/streams/UnderlyingSourceBase.h" 12 #include "core/streams/UnderlyingSourceBase.h"
13 #include "core/workers/WorkerGlobalScope.h"
12 14
13 namespace blink { 15 namespace blink {
14 16
17 namespace {
18
19 bool isTerminating(ScriptState* scriptState)
20 {
21 ExecutionContext* executionContext = scriptState->getExecutionContext();
22 if (!executionContext)
23 return true;
24 if (!executionContext->isWorkerGlobalScope())
25 return false;
26 return toWorkerGlobalScope(executionContext)->scriptController()->isExecutio nTerminating();
27 }
28
29 } // namespace
30
15 ScriptValue ReadableStreamOperations::createReadableStream(ScriptState* scriptSt ate, UnderlyingSourceBase* underlyingSource, ScriptValue strategy) 31 ScriptValue ReadableStreamOperations::createReadableStream(ScriptState* scriptSt ate, UnderlyingSourceBase* underlyingSource, ScriptValue strategy)
16 { 32 {
33 if (isTerminating(scriptState))
34 return ScriptValue();
17 ScriptState::Scope scope(scriptState); 35 ScriptState::Scope scope(scriptState);
18 36
19 v8::Local<v8::Value> jsUnderlyingSource = toV8(underlyingSource, scriptState ); 37 v8::Local<v8::Value> jsUnderlyingSource = toV8(underlyingSource, scriptState );
20 v8::Local<v8::Value> jsStrategy = strategy.v8Value(); 38 v8::Local<v8::Value> jsStrategy = strategy.v8Value();
21 v8::Local<v8::Value> args[] = { jsUnderlyingSource, jsStrategy }; 39 v8::Local<v8::Value> args[] = { jsUnderlyingSource, jsStrategy };
22 v8::Local<v8::Value> jsStream = V8ScriptRunner::callExtraOrCrash(scriptState , "createReadableStreamWithExternalController", args); 40 v8::MaybeLocal<v8::Value> jsStream = V8ScriptRunner::callExtra(scriptState, "createReadableStreamWithExternalController", args);
23 41 if (isTerminating(scriptState))
24 return ScriptValue(scriptState, jsStream); 42 return ScriptValue();
43 return ScriptValue(scriptState, v8CallOrCrash(jsStream));
25 } 44 }
26 45
27 ScriptValue ReadableStreamOperations::createCountQueuingStrategy(ScriptState* sc riptState, size_t highWaterMark) 46 ScriptValue ReadableStreamOperations::createCountQueuingStrategy(ScriptState* sc riptState, size_t highWaterMark)
28 { 47 {
48 if (isTerminating(scriptState))
49 return ScriptValue();
29 ScriptState::Scope scope(scriptState); 50 ScriptState::Scope scope(scriptState);
30 51
31 v8::Local<v8::Value> args[] = { v8::Number::New(scriptState->isolate(), high WaterMark) }; 52 v8::Local<v8::Value> args[] = { v8::Number::New(scriptState->isolate(), high WaterMark) };
32 v8::Local<v8::Value> jsStrategy = V8ScriptRunner::callExtraOrCrash(scriptSta te, "createBuiltInCountQueuingStrategy", args); 53 v8::MaybeLocal<v8::Value> jsStrategy = V8ScriptRunner::callExtra(scriptState , "createBuiltInCountQueuingStrategy", args);
54 if (isTerminating(scriptState))
55 return ScriptValue();
33 56
34 return ScriptValue(scriptState, jsStrategy); 57 return ScriptValue(scriptState, v8CallOrCrash(jsStrategy));
35 } 58 }
36 59
37 ScriptValue ReadableStreamOperations::getReader(ScriptState* scriptState, Script Value stream, ExceptionState& es) 60 ScriptValue ReadableStreamOperations::getReader(ScriptState* scriptState, Script Value stream, ExceptionState& es)
38 { 61 {
62 if (isTerminating(scriptState))
63 return ScriptValue();
39 ASSERT(isReadableStream(scriptState, stream)); 64 ASSERT(isReadableStream(scriptState, stream));
40 65
41 v8::TryCatch block(scriptState->isolate()); 66 v8::TryCatch block(scriptState->isolate());
42 v8::Local<v8::Value> args[] = { stream.v8Value() }; 67 v8::Local<v8::Value> args[] = { stream.v8Value() };
43 ScriptValue result(scriptState, V8ScriptRunner::callExtra(scriptState, "Acqu ireReadableStreamDefaultReader", args)); 68 ScriptValue result(scriptState, V8ScriptRunner::callExtra(scriptState, "Acqu ireReadableStreamDefaultReader", args));
44 if (block.HasCaught()) 69 if (block.HasCaught())
45 es.rethrowV8Exception(block.Exception()); 70 es.rethrowV8Exception(block.Exception());
46 return result; 71 return result;
47 } 72 }
48 73
49 bool ReadableStreamOperations::isReadableStream(ScriptState* scriptState, Script Value value) 74 bool ReadableStreamOperations::isReadableStream(ScriptState* scriptState, Script Value value)
50 { 75 {
76 if (isTerminating(scriptState))
77 return true;
51 ASSERT(!value.isEmpty()); 78 ASSERT(!value.isEmpty());
52 79
53 if (!value.isObject()) 80 if (!value.isObject())
54 return false; 81 return false;
55 82
56 v8::Local<v8::Value> args[] = { value.v8Value() }; 83 v8::Local<v8::Value> args[] = { value.v8Value() };
57 return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStream", arg s)->ToBoolean()->Value(); 84 v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "I sReadableStream", args);
85 if (isTerminating(scriptState))
86 return true;
87 return v8CallOrCrash(result)->ToBoolean()->Value();
58 } 88 }
59 89
60 bool ReadableStreamOperations::isDisturbed(ScriptState* scriptState, ScriptValue stream) 90 bool ReadableStreamOperations::isDisturbed(ScriptState* scriptState, ScriptValue stream)
61 { 91 {
92 if (isTerminating(scriptState))
93 return true;
62 ASSERT(isReadableStream(scriptState, stream)); 94 ASSERT(isReadableStream(scriptState, stream));
63 95
64 v8::Local<v8::Value> args[] = { stream.v8Value() }; 96 v8::Local<v8::Value> args[] = { stream.v8Value() };
65 return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamDistur bed", args)->ToBoolean()->Value(); 97 v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "I sReadableStreamDisturbed", args);
98 if (isTerminating(scriptState))
99 return true;
100 return v8CallOrCrash(result)->ToBoolean()->Value();
66 } 101 }
67 102
68 bool ReadableStreamOperations::isLocked(ScriptState* scriptState, ScriptValue st ream) 103 bool ReadableStreamOperations::isLocked(ScriptState* scriptState, ScriptValue st ream)
69 { 104 {
105 if (isTerminating(scriptState))
106 return true;
70 ASSERT(isReadableStream(scriptState, stream)); 107 ASSERT(isReadableStream(scriptState, stream));
71 108
72 v8::Local<v8::Value> args[] = { stream.v8Value() }; 109 v8::Local<v8::Value> args[] = { stream.v8Value() };
73 return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamLocked ", args)->ToBoolean()->Value(); 110 v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "I sReadableStreamLocked", args);
111 if (isTerminating(scriptState))
112 return true;
113 return v8CallOrCrash(result)->ToBoolean()->Value();
74 } 114 }
75 115
76 bool ReadableStreamOperations::isReadable(ScriptState* scriptState, ScriptValue stream) 116 bool ReadableStreamOperations::isReadable(ScriptState* scriptState, ScriptValue stream)
77 { 117 {
118 if (isTerminating(scriptState))
119 return false;
78 ASSERT(isReadableStream(scriptState, stream)); 120 ASSERT(isReadableStream(scriptState, stream));
79 121
80 v8::Local<v8::Value> args[] = { stream.v8Value() }; 122 v8::Local<v8::Value> args[] = { stream.v8Value() };
81 return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamReadab le", args)->ToBoolean()->Value(); 123 v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtraOrCrash(scriptSt ate, "IsReadableStreamReadable", args);
124 if (isTerminating(scriptState))
125 return false;
126 return v8CallOrCrash(result)->ToBoolean()->Value();
82 } 127 }
83 128
84 bool ReadableStreamOperations::isClosed(ScriptState* scriptState, ScriptValue st ream) 129 bool ReadableStreamOperations::isClosed(ScriptState* scriptState, ScriptValue st ream)
85 { 130 {
131 if (isTerminating(scriptState))
132 return false;
86 ASSERT(isReadableStream(scriptState, stream)); 133 ASSERT(isReadableStream(scriptState, stream));
87 134
88 v8::Local<v8::Value> args[] = { stream.v8Value() }; 135 v8::Local<v8::Value> args[] = { stream.v8Value() };
89 return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamClosed ", args)->ToBoolean()->Value(); 136 v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "I sReadableStreamClosed", args);
137 if (isTerminating(scriptState))
138 return false;
139 return v8CallOrCrash(result)->ToBoolean()->Value();
90 } 140 }
91 141
92 bool ReadableStreamOperations::isErrored(ScriptState* scriptState, ScriptValue s tream) 142 bool ReadableStreamOperations::isErrored(ScriptState* scriptState, ScriptValue s tream)
93 { 143 {
144 if (isTerminating(scriptState))
145 return true;
94 ASSERT(isReadableStream(scriptState, stream)); 146 ASSERT(isReadableStream(scriptState, stream));
95 147
96 v8::Local<v8::Value> args[] = { stream.v8Value() }; 148 v8::Local<v8::Value> args[] = { stream.v8Value() };
97 return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamErrore d", args)->ToBoolean()->Value(); 149 v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "I sReadableStreamErrored", args);
150 if (isTerminating(scriptState))
151 return true;
152 return v8CallOrCrash(result)->ToBoolean()->Value();
98 } 153 }
99 154
100 bool ReadableStreamOperations::isReadableStreamDefaultReader(ScriptState* script State, ScriptValue value) 155 bool ReadableStreamOperations::isReadableStreamDefaultReader(ScriptState* script State, ScriptValue value)
101 { 156 {
157 if (isTerminating(scriptState))
158 return true;
102 ASSERT(!value.isEmpty()); 159 ASSERT(!value.isEmpty());
103 160
104 if (!value.isObject()) 161 if (!value.isObject())
105 return false; 162 return false;
106 163
107 v8::Local<v8::Value> args[] = { value.v8Value() }; 164 v8::Local<v8::Value> args[] = { value.v8Value() };
108 return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamDefaul tReader", args)->ToBoolean()->Value(); 165 v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "I sReadableStreamDefaultReader", args);
166 if (isTerminating(scriptState))
167 return true;
168 return v8CallOrCrash(result)->ToBoolean()->Value();
109 } 169 }
110 170
111 ScriptPromise ReadableStreamOperations::defaultReaderRead(ScriptState* scriptSta te, ScriptValue reader) 171 ScriptPromise ReadableStreamOperations::defaultReaderRead(ScriptState* scriptSta te, ScriptValue reader)
112 { 172 {
173 if (isTerminating(scriptState))
174 return ScriptPromise();
113 ASSERT(isReadableStreamDefaultReader(scriptState, reader)); 175 ASSERT(isReadableStreamDefaultReader(scriptState, reader));
114 176
115 v8::Local<v8::Value> args[] = { reader.v8Value() }; 177 v8::Local<v8::Value> args[] = { reader.v8Value() };
116 return ScriptPromise::cast(scriptState, V8ScriptRunner::callExtraOrCrash(scr iptState, "ReadableStreamDefaultReaderRead", args)); 178 v8::MaybeLocal<v8::Value> result = V8ScriptRunner::callExtra(scriptState, "R eadableStreamDefaultReaderRead", args);
179 if (isTerminating(scriptState))
180 return ScriptPromise();
181 return ScriptPromise::cast(scriptState, v8CallOrCrash(result));
117 } 182 }
118 183
119 void ReadableStreamOperations::tee(ScriptState* scriptState, ScriptValue stream, ScriptValue* newStream1, ScriptValue* newStream2) 184 void ReadableStreamOperations::tee(ScriptState* scriptState, ScriptValue stream, ScriptValue* newStream1, ScriptValue* newStream2)
120 { 185 {
186 if (isTerminating(scriptState))
187 return;
121 DCHECK(isReadableStream(scriptState, stream)); 188 DCHECK(isReadableStream(scriptState, stream));
122 DCHECK(!isLocked(scriptState, stream)); 189 DCHECK(!isLocked(scriptState, stream));
123 190
124 v8::Local<v8::Value> args[] = { stream.v8Value() }; 191 v8::Local<v8::Value> args[] = { stream.v8Value() };
125 ScriptValue result(scriptState, V8ScriptRunner::callExtraOrCrash(scriptState , "ReadableStreamTee", args)); 192
193 v8::MaybeLocal<v8::Value> maybeResult = V8ScriptRunner::callExtra(scriptStat e, "ReadableStreamTee", args);
194 if (isTerminating(scriptState))
195 return;
196 ScriptValue result(scriptState, v8CallOrCrash(maybeResult));
126 DCHECK(result.v8Value()->IsArray()); 197 DCHECK(result.v8Value()->IsArray());
127 v8::Local<v8::Array> branches = result.v8Value().As<v8::Array>(); 198 v8::Local<v8::Array> branches = result.v8Value().As<v8::Array>();
128 DCHECK_EQ(2u, branches->Length()); 199 DCHECK_EQ(2u, branches->Length());
129 *newStream1 = ScriptValue(scriptState, v8CallOrCrash(branches->Get(scriptSta te->context(), 0))); 200
130 *newStream2 = ScriptValue(scriptState, v8CallOrCrash(branches->Get(scriptSta te->context(), 1))); 201 v8::MaybeLocal<v8::Value> maybeStream1 = branches->Get(scriptState->context( ), 0);
202 if (isTerminating(scriptState))
203 return;
204 v8::MaybeLocal<v8::Value> maybeStream2 = branches->Get(scriptState->context( ), 1);
205 if (isTerminating(scriptState))
206 return;
207
208 *newStream1 = ScriptValue(scriptState, v8CallOrCrash(maybeStream1));
209 *newStream2 = ScriptValue(scriptState, v8CallOrCrash(maybeStream2));
131 210
132 DCHECK(isReadableStream(scriptState, *newStream1)); 211 DCHECK(isReadableStream(scriptState, *newStream1));
133 DCHECK(isReadableStream(scriptState, *newStream2)); 212 DCHECK(isReadableStream(scriptState, *newStream2));
134 } 213 }
135 214
136 } // namespace blink 215 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698