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

Side by Side Diff: third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp

Issue 2325543002: [Fetch API] Call endRead sooner to avoid recursive invocation (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/stream-reader.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/stream-reader.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698