| OLD | NEW |
| 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 "config.h" | 5 #include "config.h" |
| 6 #include "core/streams/ReadableStreamReader.h" | 6 #include "core/streams/ReadableStreamReader.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
| 9 #include "bindings/core/v8/ScriptState.h" | 9 #include "bindings/core/v8/ScriptState.h" |
| 10 #include "bindings/core/v8/ToV8.h" | 10 #include "bindings/core/v8/ToV8.h" |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 | 118 |
| 119 class PermissiveStrategy final : public StringStream::Strategy { | 119 class PermissiveStrategy final : public StringStream::Strategy { |
| 120 public: | 120 public: |
| 121 bool shouldApplyBackpressure(size_t, ReadableStream*) override { return fals
e; } | 121 bool shouldApplyBackpressure(size_t, ReadableStream*) override { return fals
e; } |
| 122 }; | 122 }; |
| 123 | 123 |
| 124 class ReadableStreamReaderTest : public ::testing::Test { | 124 class ReadableStreamReaderTest : public ::testing::Test { |
| 125 public: | 125 public: |
| 126 ReadableStreamReaderTest() | 126 ReadableStreamReaderTest() |
| 127 : m_page(DummyPageHolder::create(IntSize(1, 1))) | 127 : m_page(DummyPageHolder::create(IntSize(1, 1))) |
| 128 , m_scope(scriptState()) | |
| 129 , m_exceptionState(ExceptionState::ConstructionContext, "property", "int
erface", scriptState()->context()->Global(), isolate()) | |
| 130 , m_stream(new StringStream(new NoopUnderlyingSource, new PermissiveStra
tegy)) | 128 , m_stream(new StringStream(new NoopUnderlyingSource, new PermissiveStra
tegy)) |
| 131 { | 129 { |
| 132 m_stream->didSourceStart(); | 130 m_stream->didSourceStart(); |
| 133 } | 131 } |
| 134 | 132 |
| 135 ~ReadableStreamReaderTest() override | 133 ~ReadableStreamReaderTest() override |
| 136 { | 134 { |
| 137 EXPECT_FALSE(m_exceptionState.hadException()); | |
| 138 | |
| 139 // We need to call |error| in order to make | 135 // We need to call |error| in order to make |
| 140 // ActiveDOMObject::hasPendingActivity return false. | 136 // ActiveDOMObject::hasPendingActivity return false. |
| 141 m_stream->error(DOMException::create(AbortError, "done")); | 137 m_stream->error(DOMException::create(AbortError, "done")); |
| 142 } | 138 } |
| 143 | 139 |
| 144 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume
nt().frame()); } | 140 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume
nt().frame()); } |
| 145 v8::Isolate* isolate() { return scriptState()->isolate(); } | 141 v8::Isolate* isolate() { return scriptState()->isolate(); } |
| 146 ExecutionContext* executionContext() { return scriptState()->executionContex
t(); } | 142 ExecutionContext* executionContext() { return scriptState()->executionContex
t(); } |
| 147 | 143 |
| 148 v8::Local<v8::Function> createCaptor(String* value) | 144 v8::Local<v8::Function> createCaptor(String* value) |
| 149 { | 145 { |
| 150 return StringCapturingFunction::createFunction(scriptState(), value); | 146 return StringCapturingFunction::createFunction(scriptState(), value); |
| 151 } | 147 } |
| 152 | 148 |
| 153 v8::Local<v8::Function> createResultCaptor(ReadResult* value) | 149 v8::Local<v8::Function> createResultCaptor(ReadResult* value) |
| 154 { | 150 { |
| 155 return ReadResultCapturingFunction::createFunction(scriptState(), value)
; | 151 return ReadResultCapturingFunction::createFunction(scriptState(), value)
; |
| 156 } | 152 } |
| 157 | 153 |
| 158 OwnPtr<DummyPageHolder> m_page; | 154 OwnPtr<DummyPageHolder> m_page; |
| 159 ScriptState::Scope m_scope; | |
| 160 ExceptionState m_exceptionState; | |
| 161 Persistent<StringStream> m_stream; | 155 Persistent<StringStream> m_stream; |
| 162 }; | 156 }; |
| 163 | 157 |
| 164 TEST_F(ReadableStreamReaderTest, Construct) | 158 TEST_F(ReadableStreamReaderTest, Construct) |
| 165 { | 159 { |
| 160 ScriptState::Scope scope(scriptState()); |
| 161 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 166 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 162 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 167 EXPECT_TRUE(reader->isActive()); | 163 EXPECT_TRUE(reader->isActive()); |
| 164 EXPECT_FALSE(exceptionState.hadException()); |
| 168 } | 165 } |
| 169 | 166 |
| 170 TEST_F(ReadableStreamReaderTest, Release) | 167 TEST_F(ReadableStreamReaderTest, Release) |
| 171 { | 168 { |
| 169 ScriptState::Scope scope(scriptState()); |
| 170 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 172 String onFulfilled, onRejected; | 171 String onFulfilled, onRejected; |
| 173 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 172 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 174 EXPECT_TRUE(reader->isActive()); | 173 EXPECT_TRUE(reader->isActive()); |
| 175 | 174 |
| 176 reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(
&onRejected)); | 175 reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(
&onRejected)); |
| 177 reader->releaseLock(m_exceptionState); | 176 reader->releaseLock(exceptionState); |
| 178 EXPECT_FALSE(reader->isActive()); | 177 EXPECT_FALSE(reader->isActive()); |
| 179 EXPECT_FALSE(m_exceptionState.hadException()); | 178 EXPECT_FALSE(exceptionState.hadException()); |
| 180 | 179 |
| 181 EXPECT_TRUE(onFulfilled.isNull()); | 180 EXPECT_TRUE(onFulfilled.isNull()); |
| 182 EXPECT_TRUE(onRejected.isNull()); | 181 EXPECT_TRUE(onRejected.isNull()); |
| 183 | 182 |
| 184 isolate()->RunMicrotasks(); | 183 isolate()->RunMicrotasks(); |
| 185 EXPECT_EQ("undefined", onFulfilled); | 184 EXPECT_EQ("undefined", onFulfilled); |
| 186 EXPECT_TRUE(onRejected.isNull()); | 185 EXPECT_TRUE(onRejected.isNull()); |
| 187 | 186 |
| 188 ReadableStreamReader* another = new ReadableStreamReader(executionContext(),
m_stream); | 187 ReadableStreamReader* another = new ReadableStreamReader(executionContext(),
m_stream); |
| 189 EXPECT_TRUE(another->isActive()); | 188 EXPECT_TRUE(another->isActive()); |
| 190 EXPECT_FALSE(reader->isActive()); | 189 EXPECT_FALSE(reader->isActive()); |
| 191 reader->releaseLock(m_exceptionState); | 190 reader->releaseLock(exceptionState); |
| 192 EXPECT_TRUE(another->isActive()); | 191 EXPECT_TRUE(another->isActive()); |
| 193 EXPECT_FALSE(reader->isActive()); | 192 EXPECT_FALSE(reader->isActive()); |
| 194 EXPECT_FALSE(m_exceptionState.hadException()); | 193 EXPECT_FALSE(exceptionState.hadException()); |
| 195 } | 194 } |
| 196 | 195 |
| 197 TEST_F(ReadableStreamReaderTest, ReadAfterRelease) | 196 TEST_F(ReadableStreamReaderTest, ReadAfterRelease) |
| 198 { | 197 { |
| 198 ScriptState::Scope scope(scriptState()); |
| 199 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 199 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 200 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 200 EXPECT_TRUE(reader->isActive()); | 201 EXPECT_TRUE(reader->isActive()); |
| 201 reader->releaseLock(m_exceptionState); | 202 reader->releaseLock(exceptionState); |
| 202 EXPECT_FALSE(m_exceptionState.hadException()); | 203 EXPECT_FALSE(exceptionState.hadException()); |
| 203 EXPECT_FALSE(reader->isActive()); | 204 EXPECT_FALSE(reader->isActive()); |
| 204 | 205 |
| 205 ReadResult result; | 206 ReadResult result; |
| 206 String onRejected; | 207 String onRejected; |
| 207 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); | 208 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); |
| 208 | 209 |
| 209 EXPECT_FALSE(result.isSet); | 210 EXPECT_FALSE(result.isSet); |
| 210 EXPECT_TRUE(onRejected.isNull()); | 211 EXPECT_TRUE(onRejected.isNull()); |
| 211 isolate()->RunMicrotasks(); | 212 isolate()->RunMicrotasks(); |
| 212 | 213 |
| 213 EXPECT_TRUE(result.isSet); | 214 EXPECT_TRUE(result.isSet); |
| 214 EXPECT_TRUE(result.isDone); | 215 EXPECT_TRUE(result.isDone); |
| 215 EXPECT_EQ("undefined", result.valueString); | 216 EXPECT_EQ("undefined", result.valueString); |
| 216 EXPECT_TRUE(onRejected.isNull()); | 217 EXPECT_TRUE(onRejected.isNull()); |
| 218 EXPECT_FALSE(exceptionState.hadException()); |
| 217 } | 219 } |
| 218 | 220 |
| 219 TEST_F(ReadableStreamReaderTest, ReleaseShouldFailWhenCalledWhileReading) | 221 TEST_F(ReadableStreamReaderTest, ReleaseShouldFailWhenCalledWhileReading) |
| 220 { | 222 { |
| 223 ScriptState::Scope scope(scriptState()); |
| 224 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 221 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 225 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 222 EXPECT_TRUE(reader->isActive()); | 226 EXPECT_TRUE(reader->isActive()); |
| 223 reader->read(scriptState()); | 227 reader->read(scriptState()); |
| 224 | 228 |
| 225 reader->releaseLock(m_exceptionState); | 229 reader->releaseLock(exceptionState); |
| 226 EXPECT_TRUE(reader->isActive()); | 230 EXPECT_TRUE(reader->isActive()); |
| 227 EXPECT_TRUE(m_exceptionState.hadException()); | 231 EXPECT_TRUE(exceptionState.hadException()); |
| 228 m_exceptionState.clearException(); | 232 exceptionState.clearException(); |
| 229 | 233 |
| 230 m_stream->enqueue("hello"); | 234 m_stream->enqueue("hello"); |
| 231 reader->releaseLock(m_exceptionState); | 235 reader->releaseLock(exceptionState); |
| 232 EXPECT_FALSE(reader->isActive()); | 236 EXPECT_FALSE(reader->isActive()); |
| 233 EXPECT_FALSE(m_exceptionState.hadException()); | 237 EXPECT_FALSE(exceptionState.hadException()); |
| 234 } | 238 } |
| 235 | 239 |
| 236 TEST_F(ReadableStreamReaderTest, EnqueueThenRead) | 240 TEST_F(ReadableStreamReaderTest, EnqueueThenRead) |
| 237 { | 241 { |
| 242 ScriptState::Scope scope(scriptState()); |
| 243 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 238 m_stream->enqueue("hello"); | 244 m_stream->enqueue("hello"); |
| 239 m_stream->enqueue("world"); | 245 m_stream->enqueue("world"); |
| 240 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 246 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 241 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 247 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 242 | 248 |
| 243 ReadResult result; | 249 ReadResult result; |
| 244 String onRejected; | 250 String onRejected; |
| 245 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); | 251 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); |
| 246 | 252 |
| 247 EXPECT_FALSE(result.isSet); | 253 EXPECT_FALSE(result.isSet); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 260 | 266 |
| 261 EXPECT_FALSE(result2.isSet); | 267 EXPECT_FALSE(result2.isSet); |
| 262 EXPECT_TRUE(onRejected2.isNull()); | 268 EXPECT_TRUE(onRejected2.isNull()); |
| 263 | 269 |
| 264 isolate()->RunMicrotasks(); | 270 isolate()->RunMicrotasks(); |
| 265 | 271 |
| 266 EXPECT_TRUE(result2.isSet); | 272 EXPECT_TRUE(result2.isSet); |
| 267 EXPECT_FALSE(result2.isDone); | 273 EXPECT_FALSE(result2.isDone); |
| 268 EXPECT_EQ("world", result2.valueString); | 274 EXPECT_EQ("world", result2.valueString); |
| 269 EXPECT_TRUE(onRejected2.isNull()); | 275 EXPECT_TRUE(onRejected2.isNull()); |
| 276 EXPECT_FALSE(exceptionState.hadException()); |
| 270 } | 277 } |
| 271 | 278 |
| 272 TEST_F(ReadableStreamReaderTest, ReadThenEnqueue) | 279 TEST_F(ReadableStreamReaderTest, ReadThenEnqueue) |
| 273 { | 280 { |
| 281 ScriptState::Scope scope(scriptState()); |
| 282 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 274 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 283 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 275 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 284 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 276 | 285 |
| 277 ReadResult result, result2; | 286 ReadResult result, result2; |
| 278 String onRejected, onRejected2; | 287 String onRejected, onRejected2; |
| 279 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); | 288 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); |
| 280 reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(
&onRejected2)); | 289 reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(
&onRejected2)); |
| 281 | 290 |
| 282 EXPECT_FALSE(result.isSet); | 291 EXPECT_FALSE(result.isSet); |
| 283 EXPECT_TRUE(onRejected.isNull()); | 292 EXPECT_TRUE(onRejected.isNull()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 301 EXPECT_FALSE(result2.isSet); | 310 EXPECT_FALSE(result2.isSet); |
| 302 EXPECT_TRUE(onRejected2.isNull()); | 311 EXPECT_TRUE(onRejected2.isNull()); |
| 303 | 312 |
| 304 m_stream->enqueue("world"); | 313 m_stream->enqueue("world"); |
| 305 isolate()->RunMicrotasks(); | 314 isolate()->RunMicrotasks(); |
| 306 | 315 |
| 307 EXPECT_TRUE(result2.isSet); | 316 EXPECT_TRUE(result2.isSet); |
| 308 EXPECT_FALSE(result2.isDone); | 317 EXPECT_FALSE(result2.isDone); |
| 309 EXPECT_EQ("world", result2.valueString); | 318 EXPECT_EQ("world", result2.valueString); |
| 310 EXPECT_TRUE(onRejected2.isNull()); | 319 EXPECT_TRUE(onRejected2.isNull()); |
| 320 EXPECT_FALSE(exceptionState.hadException()); |
| 311 } | 321 } |
| 312 | 322 |
| 313 TEST_F(ReadableStreamReaderTest, ClosedReader) | 323 TEST_F(ReadableStreamReaderTest, ClosedReader) |
| 314 { | 324 { |
| 325 ScriptState::Scope scope(scriptState()); |
| 326 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 315 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 327 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 316 | 328 |
| 317 m_stream->close(); | 329 m_stream->close(); |
| 318 | 330 |
| 319 EXPECT_FALSE(reader->isActive()); | 331 EXPECT_FALSE(reader->isActive()); |
| 320 | 332 |
| 321 String onClosedFulfilled, onClosedRejected; | 333 String onClosedFulfilled, onClosedRejected; |
| 322 ReadResult result; | 334 ReadResult result; |
| 323 String onReadRejected; | 335 String onReadRejected; |
| 324 isolate()->RunMicrotasks(); | 336 isolate()->RunMicrotasks(); |
| 325 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); | 337 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); |
| 326 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onReadRejected)); | 338 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onReadRejected)); |
| 327 EXPECT_TRUE(onClosedFulfilled.isNull()); | 339 EXPECT_TRUE(onClosedFulfilled.isNull()); |
| 328 EXPECT_TRUE(onClosedRejected.isNull()); | 340 EXPECT_TRUE(onClosedRejected.isNull()); |
| 329 EXPECT_FALSE(result.isSet); | 341 EXPECT_FALSE(result.isSet); |
| 330 EXPECT_TRUE(onReadRejected.isNull()); | 342 EXPECT_TRUE(onReadRejected.isNull()); |
| 331 | 343 |
| 332 isolate()->RunMicrotasks(); | 344 isolate()->RunMicrotasks(); |
| 333 EXPECT_EQ("undefined", onClosedFulfilled); | 345 EXPECT_EQ("undefined", onClosedFulfilled); |
| 334 EXPECT_TRUE(onClosedRejected.isNull()); | 346 EXPECT_TRUE(onClosedRejected.isNull()); |
| 335 EXPECT_TRUE(result.isSet); | 347 EXPECT_TRUE(result.isSet); |
| 336 EXPECT_TRUE(result.isDone); | 348 EXPECT_TRUE(result.isDone); |
| 337 EXPECT_EQ("undefined", result.valueString); | 349 EXPECT_EQ("undefined", result.valueString); |
| 338 EXPECT_TRUE(onReadRejected.isNull()); | 350 EXPECT_TRUE(onReadRejected.isNull()); |
| 351 EXPECT_FALSE(exceptionState.hadException()); |
| 339 } | 352 } |
| 340 | 353 |
| 341 TEST_F(ReadableStreamReaderTest, ErroredReader) | 354 TEST_F(ReadableStreamReaderTest, ErroredReader) |
| 342 { | 355 { |
| 356 ScriptState::Scope scope(scriptState()); |
| 357 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 343 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 358 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 344 | 359 |
| 345 m_stream->error(DOMException::create(SyntaxError, "some error")); | 360 m_stream->error(DOMException::create(SyntaxError, "some error")); |
| 346 | 361 |
| 347 EXPECT_EQ(ReadableStream::Errored, m_stream->stateInternal()); | 362 EXPECT_EQ(ReadableStream::Errored, m_stream->stateInternal()); |
| 348 EXPECT_FALSE(reader->isActive()); | 363 EXPECT_FALSE(reader->isActive()); |
| 349 | 364 |
| 350 String onClosedFulfilled, onClosedRejected; | 365 String onClosedFulfilled, onClosedRejected; |
| 351 String onReadFulfilled, onReadRejected; | 366 String onReadFulfilled, onReadRejected; |
| 352 isolate()->RunMicrotasks(); | 367 isolate()->RunMicrotasks(); |
| 353 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); | 368 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); |
| 354 reader->read(scriptState()).then(createCaptor(&onReadFulfilled), createCapto
r(&onReadRejected)); | 369 reader->read(scriptState()).then(createCaptor(&onReadFulfilled), createCapto
r(&onReadRejected)); |
| 355 EXPECT_TRUE(onClosedFulfilled.isNull()); | 370 EXPECT_TRUE(onClosedFulfilled.isNull()); |
| 356 EXPECT_TRUE(onClosedRejected.isNull()); | 371 EXPECT_TRUE(onClosedRejected.isNull()); |
| 357 EXPECT_TRUE(onReadFulfilled.isNull()); | 372 EXPECT_TRUE(onReadFulfilled.isNull()); |
| 358 EXPECT_TRUE(onReadRejected.isNull()); | 373 EXPECT_TRUE(onReadRejected.isNull()); |
| 359 | 374 |
| 360 isolate()->RunMicrotasks(); | 375 isolate()->RunMicrotasks(); |
| 361 EXPECT_TRUE(onClosedFulfilled.isNull()); | 376 EXPECT_TRUE(onClosedFulfilled.isNull()); |
| 362 EXPECT_EQ("SyntaxError: some error", onClosedRejected); | 377 EXPECT_EQ("SyntaxError: some error", onClosedRejected); |
| 363 EXPECT_TRUE(onReadFulfilled.isNull()); | 378 EXPECT_TRUE(onReadFulfilled.isNull()); |
| 364 EXPECT_EQ("SyntaxError: some error", onReadRejected); | 379 EXPECT_EQ("SyntaxError: some error", onReadRejected); |
| 380 EXPECT_FALSE(exceptionState.hadException()); |
| 365 } | 381 } |
| 366 | 382 |
| 367 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenClosed) | 383 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenClosed) |
| 368 { | 384 { |
| 385 ScriptState::Scope scope(scriptState()); |
| 386 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 369 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 387 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 370 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 388 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 371 | 389 |
| 372 ReadResult result, result2; | 390 ReadResult result, result2; |
| 373 String onRejected, onRejected2; | 391 String onRejected, onRejected2; |
| 374 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); | 392 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); |
| 375 reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(
&onRejected2)); | 393 reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(
&onRejected2)); |
| 376 | 394 |
| 377 isolate()->RunMicrotasks(); | 395 isolate()->RunMicrotasks(); |
| 378 EXPECT_FALSE(result.isSet); | 396 EXPECT_FALSE(result.isSet); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 390 | 408 |
| 391 EXPECT_TRUE(result.isSet); | 409 EXPECT_TRUE(result.isSet); |
| 392 EXPECT_TRUE(result.isDone); | 410 EXPECT_TRUE(result.isDone); |
| 393 EXPECT_EQ("undefined", result.valueString); | 411 EXPECT_EQ("undefined", result.valueString); |
| 394 EXPECT_TRUE(onRejected.isNull()); | 412 EXPECT_TRUE(onRejected.isNull()); |
| 395 | 413 |
| 396 EXPECT_TRUE(result2.isSet); | 414 EXPECT_TRUE(result2.isSet); |
| 397 EXPECT_TRUE(result2.isDone); | 415 EXPECT_TRUE(result2.isDone); |
| 398 EXPECT_EQ("undefined", result2.valueString); | 416 EXPECT_EQ("undefined", result2.valueString); |
| 399 EXPECT_TRUE(onRejected2.isNull()); | 417 EXPECT_TRUE(onRejected2.isNull()); |
| 418 EXPECT_FALSE(exceptionState.hadException()); |
| 400 } | 419 } |
| 401 | 420 |
| 402 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeRejectedWhenErrored) | 421 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeRejectedWhenErrored) |
| 403 { | 422 { |
| 423 ScriptState::Scope scope(scriptState()); |
| 424 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 404 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 425 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 405 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 426 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 406 | 427 |
| 407 String onFulfilled, onFulfilled2; | 428 String onFulfilled, onFulfilled2; |
| 408 String onRejected, onRejected2; | 429 String onRejected, onRejected2; |
| 409 reader->read(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&o
nRejected)); | 430 reader->read(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&o
nRejected)); |
| 410 reader->read(scriptState()).then(createCaptor(&onFulfilled2), createCaptor(&
onRejected2)); | 431 reader->read(scriptState()).then(createCaptor(&onFulfilled2), createCaptor(&
onRejected2)); |
| 411 | 432 |
| 412 isolate()->RunMicrotasks(); | 433 isolate()->RunMicrotasks(); |
| 413 EXPECT_TRUE(onFulfilled.isNull()); | 434 EXPECT_TRUE(onFulfilled.isNull()); |
| 414 EXPECT_TRUE(onRejected.isNull()); | 435 EXPECT_TRUE(onRejected.isNull()); |
| 415 EXPECT_TRUE(onFulfilled2.isNull()); | 436 EXPECT_TRUE(onFulfilled2.isNull()); |
| 416 EXPECT_TRUE(onRejected2.isNull()); | 437 EXPECT_TRUE(onRejected2.isNull()); |
| 417 | 438 |
| 418 m_stream->error(DOMException::create(SyntaxError, "some error")); | 439 m_stream->error(DOMException::create(SyntaxError, "some error")); |
| 419 EXPECT_TRUE(onFulfilled.isNull()); | 440 EXPECT_TRUE(onFulfilled.isNull()); |
| 420 EXPECT_TRUE(onRejected.isNull()); | 441 EXPECT_TRUE(onRejected.isNull()); |
| 421 EXPECT_TRUE(onFulfilled2.isNull()); | 442 EXPECT_TRUE(onFulfilled2.isNull()); |
| 422 EXPECT_TRUE(onRejected2.isNull()); | 443 EXPECT_TRUE(onRejected2.isNull()); |
| 423 | 444 |
| 424 isolate()->RunMicrotasks(); | 445 isolate()->RunMicrotasks(); |
| 425 | 446 |
| 426 EXPECT_TRUE(onFulfilled.isNull()); | 447 EXPECT_TRUE(onFulfilled.isNull()); |
| 427 EXPECT_EQ(onRejected, "SyntaxError: some error"); | 448 EXPECT_EQ(onRejected, "SyntaxError: some error"); |
| 428 EXPECT_TRUE(onFulfilled2.isNull()); | 449 EXPECT_TRUE(onFulfilled2.isNull()); |
| 429 EXPECT_EQ(onRejected2, "SyntaxError: some error"); | 450 EXPECT_EQ(onRejected2, "SyntaxError: some error"); |
| 451 EXPECT_FALSE(exceptionState.hadException()); |
| 430 } | 452 } |
| 431 | 453 |
| 432 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenCanceled) | 454 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenCanceled) |
| 433 { | 455 { |
| 456 ScriptState::Scope scope(scriptState()); |
| 457 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 434 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 458 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 435 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 459 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 436 | 460 |
| 437 ReadResult result, result2; | 461 ReadResult result, result2; |
| 438 String onRejected, onRejected2; | 462 String onRejected, onRejected2; |
| 439 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); | 463 reader->read(scriptState()).then(createResultCaptor(&result), createCaptor(&
onRejected)); |
| 440 reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(
&onRejected2)); | 464 reader->read(scriptState()).then(createResultCaptor(&result2), createCaptor(
&onRejected2)); |
| 441 | 465 |
| 442 isolate()->RunMicrotasks(); | 466 isolate()->RunMicrotasks(); |
| 443 EXPECT_FALSE(result.isSet); | 467 EXPECT_FALSE(result.isSet); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 456 | 480 |
| 457 EXPECT_TRUE(result.isSet); | 481 EXPECT_TRUE(result.isSet); |
| 458 EXPECT_TRUE(result.isDone); | 482 EXPECT_TRUE(result.isDone); |
| 459 EXPECT_EQ("undefined", result.valueString); | 483 EXPECT_EQ("undefined", result.valueString); |
| 460 EXPECT_TRUE(onRejected.isNull()); | 484 EXPECT_TRUE(onRejected.isNull()); |
| 461 | 485 |
| 462 EXPECT_TRUE(result2.isSet); | 486 EXPECT_TRUE(result2.isSet); |
| 463 EXPECT_TRUE(result2.isDone); | 487 EXPECT_TRUE(result2.isDone); |
| 464 EXPECT_EQ("undefined", result2.valueString); | 488 EXPECT_EQ("undefined", result2.valueString); |
| 465 EXPECT_TRUE(onRejected2.isNull()); | 489 EXPECT_TRUE(onRejected2.isNull()); |
| 490 EXPECT_FALSE(exceptionState.hadException()); |
| 466 } | 491 } |
| 467 | 492 |
| 468 TEST_F(ReadableStreamReaderTest, CancelShouldNotWorkWhenNotActive) | 493 TEST_F(ReadableStreamReaderTest, CancelShouldNotWorkWhenNotActive) |
| 469 { | 494 { |
| 495 ScriptState::Scope scope(scriptState()); |
| 496 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 470 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 497 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 471 reader->releaseLock(m_exceptionState); | 498 reader->releaseLock(exceptionState); |
| 472 EXPECT_FALSE(reader->isActive()); | 499 EXPECT_FALSE(reader->isActive()); |
| 473 | 500 |
| 474 String onFulfilled, onRejected; | 501 String onFulfilled, onRejected; |
| 475 reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isola
te()))).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); | 502 reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isola
te()))).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
| 476 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 503 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 477 | 504 |
| 478 EXPECT_TRUE(onFulfilled.isNull()); | 505 EXPECT_TRUE(onFulfilled.isNull()); |
| 479 EXPECT_TRUE(onRejected.isNull()); | 506 EXPECT_TRUE(onRejected.isNull()); |
| 480 | 507 |
| 481 isolate()->RunMicrotasks(); | 508 isolate()->RunMicrotasks(); |
| 482 | 509 |
| 483 EXPECT_EQ("undefined", onFulfilled); | 510 EXPECT_EQ("undefined", onFulfilled); |
| 484 EXPECT_TRUE(onRejected.isNull()); | 511 EXPECT_TRUE(onRejected.isNull()); |
| 485 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 512 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 513 EXPECT_FALSE(exceptionState.hadException()); |
| 486 } | 514 } |
| 487 | 515 |
| 488 TEST_F(ReadableStreamReaderTest, Cancel) | 516 TEST_F(ReadableStreamReaderTest, Cancel) |
| 489 { | 517 { |
| 518 ScriptState::Scope scope(scriptState()); |
| 519 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 490 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 520 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 491 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 521 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 492 | 522 |
| 493 String onClosedFulfilled, onClosedRejected; | 523 String onClosedFulfilled, onClosedRejected; |
| 494 String onCancelFulfilled, onCancelRejected; | 524 String onCancelFulfilled, onCancelRejected; |
| 495 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); | 525 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); |
| 496 reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isola
te()))).then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRejected)); | 526 reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isola
te()))).then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRejected)); |
| 497 | 527 |
| 498 EXPECT_EQ(ReadableStream::Closed, m_stream->stateInternal()); | 528 EXPECT_EQ(ReadableStream::Closed, m_stream->stateInternal()); |
| 499 EXPECT_TRUE(onClosedFulfilled.isNull()); | 529 EXPECT_TRUE(onClosedFulfilled.isNull()); |
| 500 EXPECT_TRUE(onClosedRejected.isNull()); | 530 EXPECT_TRUE(onClosedRejected.isNull()); |
| 501 EXPECT_TRUE(onCancelFulfilled.isNull()); | 531 EXPECT_TRUE(onCancelFulfilled.isNull()); |
| 502 EXPECT_TRUE(onCancelRejected.isNull()); | 532 EXPECT_TRUE(onCancelRejected.isNull()); |
| 503 | 533 |
| 504 isolate()->RunMicrotasks(); | 534 isolate()->RunMicrotasks(); |
| 505 EXPECT_EQ("undefined", onClosedFulfilled); | 535 EXPECT_EQ("undefined", onClosedFulfilled); |
| 506 EXPECT_TRUE(onClosedRejected.isNull()); | 536 EXPECT_TRUE(onClosedRejected.isNull()); |
| 507 EXPECT_EQ("undefined", onCancelFulfilled); | 537 EXPECT_EQ("undefined", onCancelFulfilled); |
| 508 EXPECT_TRUE(onCancelRejected.isNull()); | 538 EXPECT_TRUE(onCancelRejected.isNull()); |
| 539 EXPECT_FALSE(exceptionState.hadException()); |
| 509 } | 540 } |
| 510 | 541 |
| 511 TEST_F(ReadableStreamReaderTest, Close) | 542 TEST_F(ReadableStreamReaderTest, Close) |
| 512 { | 543 { |
| 544 ScriptState::Scope scope(scriptState()); |
| 545 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 513 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 546 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 514 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 547 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 515 | 548 |
| 516 String onFulfilled, onRejected; | 549 String onFulfilled, onRejected; |
| 517 reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(
&onRejected)); | 550 reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(
&onRejected)); |
| 518 | 551 |
| 519 m_stream->close(); | 552 m_stream->close(); |
| 520 | 553 |
| 521 EXPECT_EQ(ReadableStream::Closed, m_stream->stateInternal()); | 554 EXPECT_EQ(ReadableStream::Closed, m_stream->stateInternal()); |
| 522 EXPECT_TRUE(onFulfilled.isNull()); | 555 EXPECT_TRUE(onFulfilled.isNull()); |
| 523 EXPECT_TRUE(onRejected.isNull()); | 556 EXPECT_TRUE(onRejected.isNull()); |
| 524 | 557 |
| 525 isolate()->RunMicrotasks(); | 558 isolate()->RunMicrotasks(); |
| 526 EXPECT_EQ("undefined", onFulfilled); | 559 EXPECT_EQ("undefined", onFulfilled); |
| 527 EXPECT_TRUE(onRejected.isNull()); | 560 EXPECT_TRUE(onRejected.isNull()); |
| 561 EXPECT_FALSE(exceptionState.hadException()); |
| 528 } | 562 } |
| 529 | 563 |
| 530 TEST_F(ReadableStreamReaderTest, Error) | 564 TEST_F(ReadableStreamReaderTest, Error) |
| 531 { | 565 { |
| 566 ScriptState::Scope scope(scriptState()); |
| 567 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property
", "interface", scriptState()->context()->Global(), isolate()); |
| 532 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); | 568 ReadableStreamReader* reader = new ReadableStreamReader(executionContext(),
m_stream); |
| 533 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 569 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
| 534 | 570 |
| 535 String onFulfilled, onRejected; | 571 String onFulfilled, onRejected; |
| 536 reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(
&onRejected)); | 572 reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(
&onRejected)); |
| 537 | 573 |
| 538 m_stream->error(DOMException::create(SyntaxError, "some error")); | 574 m_stream->error(DOMException::create(SyntaxError, "some error")); |
| 539 | 575 |
| 540 EXPECT_EQ(ReadableStream::Errored, m_stream->stateInternal()); | 576 EXPECT_EQ(ReadableStream::Errored, m_stream->stateInternal()); |
| 541 EXPECT_TRUE(onFulfilled.isNull()); | 577 EXPECT_TRUE(onFulfilled.isNull()); |
| 542 EXPECT_TRUE(onRejected.isNull()); | 578 EXPECT_TRUE(onRejected.isNull()); |
| 543 | 579 |
| 544 isolate()->RunMicrotasks(); | 580 isolate()->RunMicrotasks(); |
| 545 EXPECT_TRUE(onFulfilled.isNull()); | 581 EXPECT_TRUE(onFulfilled.isNull()); |
| 546 EXPECT_EQ("SyntaxError: some error", onRejected); | 582 EXPECT_EQ("SyntaxError: some error", onRejected); |
| 583 EXPECT_FALSE(exceptionState.hadException()); |
| 547 } | 584 } |
| 548 | 585 |
| 549 } // namespace | 586 } // namespace |
| 550 | 587 |
| 551 } // namespace blink | 588 } // namespace blink |
| OLD | NEW |