| 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" |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |