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

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

Issue 2227403002: Remove blink::ReadableStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 4 years, 4 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 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"
11 #include "core/dom/DOMTypedArray.h" 11 #include "core/dom/DOMTypedArray.h"
12 #include "core/dom/ExceptionCode.h" 12 #include "core/dom/ExceptionCode.h"
13 #include "core/streams/ReadableStreamController.h" 13 #include "core/streams/ReadableStreamController.h"
14 #include "core/streams/ReadableStreamOperations.h" 14 #include "core/streams/ReadableStreamOperations.h"
15 #include "core/workers/WorkerGlobalScope.h" 15 #include "core/workers/WorkerGlobalScope.h"
16 #include "modules/fetch/Body.h" 16 #include "modules/fetch/Body.h"
17 #include "modules/fetch/DataConsumerHandleUtil.h" 17 #include "modules/fetch/DataConsumerHandleUtil.h"
18 #include "modules/fetch/DataConsumerTee.h" 18 #include "modules/fetch/DataConsumerTee.h"
19 #include "modules/fetch/ReadableStreamDataConsumerHandle.h" 19 #include "modules/fetch/ReadableStreamDataConsumerHandle.h"
20 #include "platform/RuntimeEnabledFeatures.h"
21 #include "platform/blob/BlobData.h" 20 #include "platform/blob/BlobData.h"
22 #include "platform/network/EncodedFormData.h" 21 #include "platform/network/EncodedFormData.h"
23 #include <memory> 22 #include <memory>
24 23
25 namespace blink { 24 namespace blink {
26 25
27 namespace { 26 namespace {
28 27
29 bool isTerminating(ScriptState* scriptState) 28 bool isTerminating(ScriptState* scriptState)
30 { 29 {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 Member<FetchDataLoader::Client> m_client; 97 Member<FetchDataLoader::Client> m_client;
99 }; 98 };
100 99
101 BodyStreamBuffer::BodyStreamBuffer(ScriptState* scriptState, std::unique_ptr<Fet chDataConsumerHandle> handle) 100 BodyStreamBuffer::BodyStreamBuffer(ScriptState* scriptState, std::unique_ptr<Fet chDataConsumerHandle> handle)
102 : UnderlyingSourceBase(scriptState) 101 : UnderlyingSourceBase(scriptState)
103 , m_scriptState(scriptState) 102 , m_scriptState(scriptState)
104 , m_handle(std::move(handle)) 103 , m_handle(std::move(handle))
105 , m_reader(m_handle->obtainFetchDataReader(this)) 104 , m_reader(m_handle->obtainFetchDataReader(this))
106 , m_madeFromReadableStream(false) 105 , m_madeFromReadableStream(false)
107 { 106 {
108 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 107 if (isTerminating(scriptState)) {
109 if (isTerminating(scriptState)) { 108 m_reader = nullptr;
110 m_reader = nullptr; 109 m_handle = nullptr;
111 m_handle = nullptr; 110 return;
112 return; 111 }
113 } 112 v8::Local<v8::Value> bodyValue = toV8(this, scriptState);
114 v8::Local<v8::Value> bodyValue = toV8(this, scriptState); 113 if (bodyValue.IsEmpty()) {
115 if (bodyValue.IsEmpty()) { 114 DCHECK(isTerminating(scriptState));
116 DCHECK(isTerminating(scriptState)); 115 m_reader = nullptr;
117 m_reader = nullptr; 116 m_handle = nullptr;
118 m_handle = nullptr; 117 return;
119 return; 118 }
120 } 119 DCHECK(bodyValue->IsObject());
121 ASSERT(bodyValue->IsObject()); 120 v8::Local<v8::Object> body = bodyValue.As<v8::Object>();
122 v8::Local<v8::Object> body = bodyValue.As<v8::Object>();
123 121
124 ScriptValue readableStream = ReadableStreamOperations::createReadableStr eam( 122 ScriptValue readableStream = ReadableStreamOperations::createReadableStream(
125 scriptState, this, ReadableStreamOperations::createCountQueuingStrat egy(scriptState, 0)); 123 scriptState, this, ReadableStreamOperations::createCountQueuingStrategy( scriptState, 0));
126 if (isTerminating(scriptState)) { 124 if (isTerminating(scriptState)) {
127 m_reader = nullptr; 125 m_reader = nullptr;
128 m_handle = nullptr; 126 m_handle = nullptr;
129 return; 127 return;
130 }
131 V8HiddenValue::setHiddenValue(scriptState, body, V8HiddenValue::internal BodyStream(scriptState->isolate()), readableStream.v8Value());
132 } else {
133 m_stream = new ReadableByteStream(this, new ReadableByteStream::StrictSt rategy);
134 m_stream->didSourceStart();
135 } 128 }
129 V8HiddenValue::setHiddenValue(scriptState, body, V8HiddenValue::internalBody Stream(scriptState->isolate()), readableStream.v8Value());
136 } 130 }
137 131
138 BodyStreamBuffer::BodyStreamBuffer(ScriptState* scriptState, ScriptValue stream) 132 BodyStreamBuffer::BodyStreamBuffer(ScriptState* scriptState, ScriptValue stream)
139 : UnderlyingSourceBase(scriptState) 133 : UnderlyingSourceBase(scriptState)
140 , m_scriptState(scriptState) 134 , m_scriptState(scriptState)
141 , m_madeFromReadableStream(true) 135 , m_madeFromReadableStream(true)
142 { 136 {
143 DCHECK(RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled());
144 DCHECK(ReadableStreamOperations::isReadableStream(scriptState, stream)); 137 DCHECK(ReadableStreamOperations::isReadableStream(scriptState, stream));
145 if (isTerminating(scriptState)) 138 if (isTerminating(scriptState))
146 return; 139 return;
147 v8::Local<v8::Value> bodyValue = toV8(this, scriptState); 140 v8::Local<v8::Value> bodyValue = toV8(this, scriptState);
148 if (bodyValue.IsEmpty()) { 141 if (bodyValue.IsEmpty()) {
149 DCHECK(isTerminating(scriptState)); 142 DCHECK(isTerminating(scriptState));
150 return; 143 return;
151 } 144 }
152 DCHECK(bodyValue->IsObject()); 145 DCHECK(bodyValue->IsObject());
153 v8::Local<v8::Object> body = bodyValue.As<v8::Object>(); 146 v8::Local<v8::Object> body = bodyValue.As<v8::Object>();
154 147
155 V8HiddenValue::setHiddenValue(scriptState, body, V8HiddenValue::internalBody Stream(scriptState->isolate()), stream.v8Value()); 148 V8HiddenValue::setHiddenValue(scriptState, body, V8HiddenValue::internalBody Stream(scriptState->isolate()), stream.v8Value());
156 } 149 }
157 150
158 ScriptValue BodyStreamBuffer::stream() 151 ScriptValue BodyStreamBuffer::stream()
159 { 152 {
160 ScriptState::Scope scope(m_scriptState.get()); 153 ScriptState::Scope scope(m_scriptState.get());
161 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 154 if (isTerminating(m_scriptState.get()))
162 if (isTerminating(m_scriptState.get())) 155 return ScriptValue();
163 return ScriptValue(); 156 v8::Local<v8::Value> bodyValue = toV8(this, m_scriptState.get());
164 v8::Local<v8::Value> bodyValue = toV8(this, m_scriptState.get()); 157 if (bodyValue.IsEmpty()) {
165 if (bodyValue.IsEmpty()) { 158 DCHECK(isTerminating(m_scriptState.get()));
166 DCHECK(isTerminating(m_scriptState.get())); 159 return ScriptValue();
167 return ScriptValue();
168 }
169 ASSERT(bodyValue->IsObject());
170 v8::Local<v8::Object> body = bodyValue.As<v8::Object>();
171 return ScriptValue(m_scriptState.get(), V8HiddenValue::getHiddenValue(m_ scriptState.get(), body, V8HiddenValue::internalBodyStream(m_scriptState->isolat e())));
172 } 160 }
173 return ScriptValue(m_scriptState.get(), toV8(m_stream, m_scriptState.get())) ; 161 DCHECK(bodyValue->IsObject());
162 v8::Local<v8::Object> body = bodyValue.As<v8::Object>();
163 return ScriptValue(m_scriptState.get(), V8HiddenValue::getHiddenValue(m_scri ptState.get(), body, V8HiddenValue::internalBodyStream(m_scriptState->isolate()) ));
174 } 164 }
175 165
176 PassRefPtr<BlobDataHandle> BodyStreamBuffer::drainAsBlobDataHandle(FetchDataCons umerHandle::Reader::BlobSizePolicy policy) 166 PassRefPtr<BlobDataHandle> BodyStreamBuffer::drainAsBlobDataHandle(FetchDataCons umerHandle::Reader::BlobSizePolicy policy)
177 { 167 {
178 ASSERT(!isStreamLocked()); 168 ASSERT(!isStreamLocked());
179 ASSERT(!isStreamDisturbed()); 169 ASSERT(!isStreamDisturbed());
180 if (isStreamClosed() || isStreamErrored()) 170 if (isStreamClosed() || isStreamErrored())
181 return nullptr; 171 return nullptr;
182 172
183 if (m_madeFromReadableStream) 173 if (m_madeFromReadableStream)
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 *branch2 = new BodyStreamBuffer(m_scriptState.get(), stream2); 222 *branch2 = new BodyStreamBuffer(m_scriptState.get(), stream2);
233 return; 223 return;
234 } 224 }
235 std::unique_ptr<FetchDataConsumerHandle> handle = releaseHandle(); 225 std::unique_ptr<FetchDataConsumerHandle> handle = releaseHandle();
236 std::unique_ptr<FetchDataConsumerHandle> handle1, handle2; 226 std::unique_ptr<FetchDataConsumerHandle> handle1, handle2;
237 DataConsumerTee::create(m_scriptState->getExecutionContext(), std::move(hand le), &handle1, &handle2); 227 DataConsumerTee::create(m_scriptState->getExecutionContext(), std::move(hand le), &handle1, &handle2);
238 *branch1 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle1)); 228 *branch1 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle1));
239 *branch2 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle2)); 229 *branch2 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle2));
240 } 230 }
241 231
242 void BodyStreamBuffer::pullSource()
243 {
244 ASSERT(!m_streamNeedsMore);
245 m_streamNeedsMore = true;
246 processData();
247 }
248
249 ScriptPromise BodyStreamBuffer::cancelSource(ScriptState* scriptState, ScriptVal ue)
250 {
251 ASSERT(scriptState == m_scriptState.get());
252 close();
253 return ScriptPromise::castUndefined(scriptState);
254 }
255
256 ScriptPromise BodyStreamBuffer::pull(ScriptState* scriptState) 232 ScriptPromise BodyStreamBuffer::pull(ScriptState* scriptState)
257 { 233 {
258 ASSERT(!m_streamNeedsMore); 234 ASSERT(!m_streamNeedsMore);
259 ASSERT(scriptState == m_scriptState.get()); 235 ASSERT(scriptState == m_scriptState.get());
260 m_streamNeedsMore = true; 236 m_streamNeedsMore = true;
261 processData(); 237 processData();
262 return ScriptPromise::castUndefined(scriptState); 238 return ScriptPromise::castUndefined(scriptState);
263 } 239 }
264 240
265 ScriptPromise BodyStreamBuffer::cancel(ScriptState* scriptState, ScriptValue rea son) 241 ScriptPromise BodyStreamBuffer::cancel(ScriptState* scriptState, ScriptValue rea son)
(...skipping 27 matching lines...) Expand all
293 } 269 }
294 return; 270 return;
295 } 271 }
296 processData(); 272 processData();
297 } 273 }
298 274
299 bool BodyStreamBuffer::hasPendingActivity() const 275 bool BodyStreamBuffer::hasPendingActivity() const
300 { 276 {
301 if (m_loader) 277 if (m_loader)
302 return true; 278 return true;
303 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) 279 return UnderlyingSourceBase::hasPendingActivity();
304 return UnderlyingSourceBase::hasPendingActivity();
305
306 return m_stream->stateInternal() == ReadableStream::Readable && m_stream->is Locked();
307 } 280 }
308 281
309 void BodyStreamBuffer::stop() 282 void BodyStreamBuffer::stop()
310 { 283 {
311 m_reader = nullptr; 284 m_reader = nullptr;
312 m_handle = nullptr; 285 m_handle = nullptr;
313 UnderlyingSourceBase::stop(); 286 UnderlyingSourceBase::stop();
314 } 287 }
315 288
316 bool BodyStreamBuffer::isStreamReadable() 289 bool BodyStreamBuffer::isStreamReadable()
317 { 290 {
318 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 291 ScriptState::Scope scope(m_scriptState.get());
319 ScriptState::Scope scope(m_scriptState.get()); 292 return ReadableStreamOperations::isReadable(m_scriptState.get(), stream());
320 return ReadableStreamOperations::isReadable(m_scriptState.get(), stream( ));
321 }
322 return m_stream->stateInternal() == ReadableStream::Readable;
323 } 293 }
324 294
325 bool BodyStreamBuffer::isStreamClosed() 295 bool BodyStreamBuffer::isStreamClosed()
326 { 296 {
327 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 297 ScriptState::Scope scope(m_scriptState.get());
328 ScriptState::Scope scope(m_scriptState.get()); 298 return ReadableStreamOperations::isClosed(m_scriptState.get(), stream());
329 return ReadableStreamOperations::isClosed(m_scriptState.get(), stream()) ;
330 }
331 return m_stream->stateInternal() == ReadableStream::Closed;
332 } 299 }
333 300
334 bool BodyStreamBuffer::isStreamErrored() 301 bool BodyStreamBuffer::isStreamErrored()
335 { 302 {
336 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 303 ScriptState::Scope scope(m_scriptState.get());
337 ScriptState::Scope scope(m_scriptState.get()); 304 return ReadableStreamOperations::isErrored(m_scriptState.get(), stream());
338 return ReadableStreamOperations::isErrored(m_scriptState.get(), stream() );
339 }
340 return m_stream->stateInternal() == ReadableStream::Errored;
341 } 305 }
342 306
343 bool BodyStreamBuffer::isStreamLocked() 307 bool BodyStreamBuffer::isStreamLocked()
344 { 308 {
345 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 309 ScriptState::Scope scope(m_scriptState.get());
346 ScriptState::Scope scope(m_scriptState.get()); 310 return ReadableStreamOperations::isLocked(m_scriptState.get(), stream());
347 return ReadableStreamOperations::isLocked(m_scriptState.get(), stream()) ;
348 }
349 return m_stream->isLocked();
350 } 311 }
351 312
352 bool BodyStreamBuffer::isStreamDisturbed() 313 bool BodyStreamBuffer::isStreamDisturbed()
353 { 314 {
354 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 315 ScriptState::Scope scope(m_scriptState.get());
355 ScriptState::Scope scope(m_scriptState.get()); 316 return ReadableStreamOperations::isDisturbed(m_scriptState.get(), stream());
356 return ReadableStreamOperations::isDisturbed(m_scriptState.get(), stream ());
357 }
358 return m_stream->isDisturbed();
359 } 317 }
360 318
361 void BodyStreamBuffer::closeAndLockAndDisturb() 319 void BodyStreamBuffer::closeAndLockAndDisturb()
362 { 320 {
363 if (isStreamReadable()) { 321 if (isStreamReadable()) {
364 // Note that the stream cannot be "draining", because it doesn't have 322 // Note that the stream cannot be "draining", because it doesn't have
365 // the internal buffer. 323 // the internal buffer.
366 close(); 324 close();
367 } 325 }
368 326
369 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 327 ScriptState::Scope scope(m_scriptState.get());
370 ScriptState::Scope scope(m_scriptState.get()); 328 NonThrowableExceptionState exceptionState;
371 NonThrowableExceptionState exceptionState; 329 ScriptValue reader = ReadableStreamOperations::getReader(m_scriptState.get() , stream(), exceptionState);
372 ScriptValue reader = ReadableStreamOperations::getReader(m_scriptState.g et(), stream(), exceptionState); 330 ReadableStreamOperations::defaultReaderRead(m_scriptState.get(), reader);
373 ReadableStreamOperations::defaultReaderRead(m_scriptState.get(), reader) ;
374 } else {
375 NonThrowableExceptionState exceptionState;
376 m_stream->getBytesReader(m_scriptState->getExecutionContext(), exception State);
377 m_stream->setIsDisturbed();
378 }
379 } 331 }
380 332
381 void BodyStreamBuffer::close() 333 void BodyStreamBuffer::close()
382 { 334 {
383 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) 335 controller()->close();
384 controller()->close();
385 else
386 m_stream->close();
387 m_reader = nullptr; 336 m_reader = nullptr;
388 m_handle = nullptr; 337 m_handle = nullptr;
389 } 338 }
390 339
391 void BodyStreamBuffer::error() 340 void BodyStreamBuffer::error()
392 { 341 {
393 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) 342 controller()->error(DOMException::create(NetworkError, "network error"));
394 controller()->error(DOMException::create(NetworkError, "network error")) ;
395 else
396 m_stream->error(DOMException::create(NetworkError, "network error"));
397 m_reader = nullptr; 343 m_reader = nullptr;
398 m_handle = nullptr; 344 m_handle = nullptr;
399 } 345 }
400 346
401 void BodyStreamBuffer::processData() 347 void BodyStreamBuffer::processData()
402 { 348 {
403 ASSERT(m_reader); 349 ASSERT(m_reader);
404 while (m_streamNeedsMore) { 350 while (m_streamNeedsMore) {
405 const void* buffer; 351 const void* buffer;
406 size_t available; 352 size_t available;
407 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebD ataConsumerHandle::FlagNone, &available); 353 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebD ataConsumerHandle::FlagNone, &available);
408 switch (result) { 354 switch (result) {
409 case WebDataConsumerHandle::Ok: { 355 case WebDataConsumerHandle::Ok: {
410 DOMUint8Array* array = DOMUint8Array::create(static_cast<const unsig ned char*>(buffer), available); 356 DOMUint8Array* array = DOMUint8Array::create(static_cast<const unsig ned char*>(buffer), available);
411 if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) { 357 controller()->enqueue(array);
412 controller()->enqueue(array); 358 m_streamNeedsMore = controller()->desiredSize() > 0;
413 m_streamNeedsMore = controller()->desiredSize() > 0;
414 } else {
415 m_streamNeedsMore = m_stream->enqueue(array);
416 }
417 m_reader->endRead(available); 359 m_reader->endRead(available);
418 break; 360 break;
419 } 361 }
420 case WebDataConsumerHandle::Done: 362 case WebDataConsumerHandle::Done:
421 close(); 363 close();
422 return; 364 return;
423 365
424 case WebDataConsumerHandle::ShouldWait: 366 case WebDataConsumerHandle::ShouldWait:
425 return; 367 return;
426 368
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer Handle()); 419 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer Handle());
478 } 420 }
479 if (isErrored) 421 if (isErrored)
480 return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorD ataConsumerHandle()); 422 return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorD ataConsumerHandle());
481 423
482 DCHECK(handle); 424 DCHECK(handle);
483 return handle; 425 return handle;
484 } 426 }
485 427
486 } // namespace blink 428 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698