| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "modules/fetch/BodyStreamBuffer.h" | 5 #include "modules/fetch/BodyStreamBuffer.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ScriptState.h" | 7 #include "bindings/core/v8/ScriptState.h" |
| 8 #include "bindings/core/v8/V8HiddenValue.h" | 8 #include "bindings/core/v8/V8HiddenValue.h" |
| 9 #include "bindings/core/v8/WorkerOrWorkletScriptController.h" | 9 #include "bindings/core/v8/WorkerOrWorkletScriptController.h" |
| 10 #include "core/dom/DOMArrayBuffer.h" | 10 #include "core/dom/DOMArrayBuffer.h" |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 } | 225 } |
| 226 std::unique_ptr<FetchDataConsumerHandle> handle = releaseHandle(); | 226 std::unique_ptr<FetchDataConsumerHandle> handle = releaseHandle(); |
| 227 std::unique_ptr<FetchDataConsumerHandle> handle1, handle2; | 227 std::unique_ptr<FetchDataConsumerHandle> handle1, handle2; |
| 228 DataConsumerTee::create(m_scriptState->getExecutionContext(), std::move(hand
le), &handle1, &handle2); | 228 DataConsumerTee::create(m_scriptState->getExecutionContext(), std::move(hand
le), &handle1, &handle2); |
| 229 *branch1 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle1)); | 229 *branch1 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle1)); |
| 230 *branch2 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle2)); | 230 *branch2 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle2)); |
| 231 } | 231 } |
| 232 | 232 |
| 233 ScriptPromise BodyStreamBuffer::pull(ScriptState* scriptState) | 233 ScriptPromise BodyStreamBuffer::pull(ScriptState* scriptState) |
| 234 { | 234 { |
| 235 ASSERT(!m_streamNeedsMore); | |
| 236 ASSERT(scriptState == m_scriptState.get()); | 235 ASSERT(scriptState == m_scriptState.get()); |
| 236 if (m_streamNeedsMore) |
| 237 return ScriptPromise::castUndefined(scriptState); |
| 237 m_streamNeedsMore = true; | 238 m_streamNeedsMore = true; |
| 238 processData(); | 239 processData(); |
| 239 return ScriptPromise::castUndefined(scriptState); | 240 return ScriptPromise::castUndefined(scriptState); |
| 240 } | 241 } |
| 241 | 242 |
| 242 ScriptPromise BodyStreamBuffer::cancel(ScriptState* scriptState, ScriptValue rea
son) | 243 ScriptPromise BodyStreamBuffer::cancel(ScriptState* scriptState, ScriptValue rea
son) |
| 243 { | 244 { |
| 244 ASSERT(scriptState == m_scriptState.get()); | 245 ASSERT(scriptState == m_scriptState.get()); |
| 245 close(); | 246 close(); |
| 246 return ScriptPromise::castUndefined(scriptState); | 247 return ScriptPromise::castUndefined(scriptState); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 void BodyStreamBuffer::processData() | 349 void BodyStreamBuffer::processData() |
| 349 { | 350 { |
| 350 ASSERT(m_reader); | 351 ASSERT(m_reader); |
| 351 while (m_streamNeedsMore) { | 352 while (m_streamNeedsMore) { |
| 352 const void* buffer; | 353 const void* buffer; |
| 353 size_t available; | 354 size_t available; |
| 354 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebD
ataConsumerHandle::FlagNone, &available); | 355 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebD
ataConsumerHandle::FlagNone, &available); |
| 355 switch (result) { | 356 switch (result) { |
| 356 case WebDataConsumerHandle::Ok: { | 357 case WebDataConsumerHandle::Ok: { |
| 357 DOMUint8Array* array = DOMUint8Array::create(static_cast<const unsig
ned char*>(buffer), available); | 358 DOMUint8Array* array = DOMUint8Array::create(static_cast<const unsig
ned char*>(buffer), available); |
| 359 m_reader->endRead(available); |
| 360 // Clear m_streamNeedsMore in order to detect a pull call. |
| 361 m_streamNeedsMore = false; |
| 358 controller()->enqueue(array); | 362 controller()->enqueue(array); |
| 359 m_streamNeedsMore = controller()->desiredSize() > 0; | 363 // If m_streamNeedsMore is true, it means that pull is called and |
| 360 m_reader->endRead(available); | 364 // the stream needs more data even if the desired size is not |
| 365 // positive. |
| 366 if (!m_streamNeedsMore) |
| 367 m_streamNeedsMore = controller()->desiredSize() > 0; |
| 361 break; | 368 break; |
| 362 } | 369 } |
| 363 case WebDataConsumerHandle::Done: | 370 case WebDataConsumerHandle::Done: |
| 364 close(); | 371 close(); |
| 365 return; | 372 return; |
| 366 | 373 |
| 367 case WebDataConsumerHandle::ShouldWait: | 374 case WebDataConsumerHandle::ShouldWait: |
| 368 return; | 375 return; |
| 369 | 376 |
| 370 case WebDataConsumerHandle::Busy: | 377 case WebDataConsumerHandle::Busy: |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer
Handle()); | 427 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer
Handle()); |
| 421 } | 428 } |
| 422 if (isErrored) | 429 if (isErrored) |
| 423 return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorD
ataConsumerHandle()); | 430 return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorD
ataConsumerHandle()); |
| 424 | 431 |
| 425 DCHECK(handle); | 432 DCHECK(handle); |
| 426 return handle; | 433 return handle; |
| 427 } | 434 } |
| 428 | 435 |
| 429 } // namespace blink | 436 } // namespace blink |
| OLD | NEW |