Chromium Code Reviews| 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 "modules/fetch/FetchDataLoader.h" | 5 #include "modules/fetch/FetchDataLoader.h" |
| 6 | 6 |
| 7 #include "core/html/parser/TextResourceDecoder.h" | 7 #include "core/html/parser/TextResourceDecoder.h" |
| 8 #include "modules/fetch/BytesConsumer.h" | 8 #include "modules/fetch/BytesConsumer.h" |
| 9 #include "wtf/PtrUtil.h" | 9 #include "wtf/PtrUtil.h" |
| 10 #include "wtf/text/StringBuilder.h" | 10 #include "wtf/text/StringBuilder.h" |
| 11 #include "wtf/text/WTFString.h" | 11 #include "wtf/text/WTFString.h" |
| 12 #include "wtf/typed_arrays/ArrayBufferBuilder.h" | 12 #include "wtf/typed_arrays/ArrayBufferBuilder.h" |
| 13 #include <memory> | 13 #include <memory> |
| 14 | 14 |
| 15 namespace blink { | 15 namespace blink { |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 class FetchDataLoaderAsBlobHandle final : public FetchDataLoader, | 19 class FetchDataLoaderAsBlobHandle final : public FetchDataLoader, |
| 20 public BytesConsumer::Client { | 20 public BytesConsumer::Client { |
| 21 USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsBlobHandle); | 21 USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsBlobHandle); |
| 22 | 22 |
| 23 public: | 23 public: |
| 24 explicit FetchDataLoaderAsBlobHandle(const String& mimeType) | 24 FetchDataLoaderAsBlobHandle(const String& mimeType) : m_mimeType(mimeType) {} |
|
yhirano
2017/04/05 03:48:03
Why did you change this line?
Mircea Trofin
2017/04/05 05:12:21
Hmm... weird. I think I misread a previous comment
| |
| 25 : m_mimeType(mimeType) {} | |
| 26 | 25 |
| 27 void start(BytesConsumer* consumer, | 26 void start(BytesConsumer* consumer, |
| 28 FetchDataLoader::Client* client) override { | 27 FetchDataLoader::Client* client) override { |
| 29 DCHECK(!m_client); | 28 DCHECK(!m_client); |
| 30 DCHECK(!m_consumer); | 29 DCHECK(!m_consumer); |
| 31 | 30 |
| 32 m_client = client; | 31 m_client = client; |
| 33 m_consumer = consumer; | 32 m_consumer = consumer; |
| 34 | 33 |
| 35 RefPtr<BlobDataHandle> blobHandle = m_consumer->drainAsBlobDataHandle(); | 34 RefPtr<BlobDataHandle> blobHandle = m_consumer->drainAsBlobDataHandle(); |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 298 visitor->trace(m_outStream); | 297 visitor->trace(m_outStream); |
| 299 FetchDataLoader::trace(visitor); | 298 FetchDataLoader::trace(visitor); |
| 300 BytesConsumer::Client::trace(visitor); | 299 BytesConsumer::Client::trace(visitor); |
| 301 } | 300 } |
| 302 | 301 |
| 303 Member<BytesConsumer> m_consumer; | 302 Member<BytesConsumer> m_consumer; |
| 304 Member<FetchDataLoader::Client> m_client; | 303 Member<FetchDataLoader::Client> m_client; |
| 305 Member<Stream> m_outStream; | 304 Member<Stream> m_outStream; |
| 306 }; | 305 }; |
| 307 | 306 |
| 307 class FetchDataLoaderAsWasmModule final : public FetchDataLoader, | |
|
yhirano
2017/04/05 03:48:03
This FechDataLoader calls m_resolver->reject with
Mircea Trofin
2017/04/05 05:12:21
Makes sense. Also noticed the wasm spec doesn't se
| |
| 308 public BytesConsumer::Client { | |
| 309 USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsWasmModule); | |
| 310 | |
| 311 public: | |
| 312 FetchDataLoaderAsWasmModule(v8::Isolate* isolate, | |
| 313 ScriptPromiseResolver* resolver, | |
| 314 ScriptState* scriptState) | |
| 315 : m_resolver(resolver), m_builder(isolate), m_scriptState(scriptState) {} | |
| 316 | |
| 317 void start(BytesConsumer* consumer, | |
| 318 FetchDataLoader::Client* client) override { | |
| 319 DCHECK(!m_consumer); | |
| 320 DCHECK(!m_client); | |
| 321 m_client = client; | |
| 322 m_consumer = consumer; | |
| 323 m_consumer->setClient(this); | |
| 324 onStateChange(); | |
| 325 } | |
| 326 | |
| 327 void onStateChange() override { | |
| 328 while (true) { | |
| 329 // buffer is allocated by beginRead and de-allocated by endRead. | |
| 330 const char* buffer = nullptr; | |
| 331 size_t available = 0; | |
| 332 BytesConsumer::Result result = m_consumer->beginRead(&buffer, &available); | |
| 333 | |
| 334 switch (result) { | |
| 335 case BytesConsumer::Result::ShouldWait: | |
| 336 DCHECK_EQ(buffer, nullptr); | |
| 337 DCHECK_EQ(available, 0U); | |
| 338 return; | |
| 339 case BytesConsumer::Result::Ok: { | |
| 340 DCHECK_NE(buffer, nullptr); | |
| 341 DCHECK_GT(available, 0U); | |
|
yhirano
2017/04/05 03:48:03
|available| can be zero. See comments in BytesCons
Mircea Trofin
2017/04/05 05:12:21
Hmm... I'm looking at these 2 lines:
// Returns O
| |
| 342 m_builder.OnBytesReceived(reinterpret_cast<const uint8_t*>(buffer), | |
| 343 available); | |
| 344 result = m_consumer->endRead(available); | |
|
yhirano
2017/04/05 03:48:03
|result| can be |Done|. See comments in BytesConsu
Mircea Trofin
2017/04/05 05:12:21
Acknowledged.
| |
| 345 if (result == BytesConsumer::Result::Error) { | |
| 346 m_resolver->reject(); | |
| 347 } | |
| 348 break; | |
| 349 } | |
| 350 case BytesConsumer::Result::Done: { | |
| 351 DCHECK_EQ(buffer, nullptr); | |
| 352 DCHECK_EQ(available, 0U); | |
| 353 v8::Isolate* isolate = m_resolver->getScriptState()->isolate(); | |
| 354 ScriptState::Scope scope(m_scriptState.get()); | |
| 355 v8::TryCatch trycatch(isolate); | |
| 356 v8::Local<v8::WasmCompiledModule> module; | |
| 357 if (m_builder.Finish().ToLocal(&module)) { | |
| 358 DCHECK(!trycatch.HasCaught()); | |
| 359 ScriptValue scriptValue(m_scriptState.get(), module); | |
| 360 m_resolver->resolve(scriptValue); | |
| 361 } else { | |
| 362 DCHECK(trycatch.HasCaught()); | |
| 363 m_resolver->reject(trycatch.Exception()); | |
| 364 trycatch.Reset(); | |
| 365 } | |
| 366 m_client->didFetchDataLoadedStream(); | |
| 367 return; | |
| 368 } | |
| 369 case BytesConsumer::Result::Error: { | |
| 370 // TODO(mtrofin): do we need an abort on the wasm side? | |
| 371 // m_outStream->abort(); | |
| 372 m_client->didFetchDataLoadFailed(); | |
| 373 return; | |
| 374 } | |
| 375 } | |
| 376 } | |
| 377 } | |
| 378 | |
| 379 void cancel() override { m_consumer->cancel(); } | |
|
yhirano
2017/04/05 03:48:03
I think you need to do something with m_resolver.
Mircea Trofin
2017/04/05 05:12:21
Acknowledged.
| |
| 380 | |
| 381 DEFINE_INLINE_TRACE() { | |
| 382 visitor->trace(m_consumer); | |
| 383 visitor->trace(m_resolver); | |
| 384 visitor->trace(m_client); | |
| 385 FetchDataLoader::trace(visitor); | |
| 386 BytesConsumer::Client::trace(visitor); | |
| 387 } | |
| 388 | |
| 389 private: | |
| 390 Member<BytesConsumer> m_consumer; | |
| 391 Member<ScriptPromiseResolver> m_resolver; | |
| 392 Member<FetchDataLoader::Client> m_client; | |
| 393 v8::WasmModuleObjectBuilder m_builder; | |
| 394 const RefPtr<ScriptState> m_scriptState; | |
| 395 }; | |
| 396 | |
| 308 } // namespace | 397 } // namespace |
| 309 | 398 |
| 310 FetchDataLoader* FetchDataLoader::createLoaderAsBlobHandle( | 399 FetchDataLoader* FetchDataLoader::createLoaderAsBlobHandle( |
| 311 const String& mimeType) { | 400 const String& mimeType) { |
| 312 return new FetchDataLoaderAsBlobHandle(mimeType); | 401 return new FetchDataLoaderAsBlobHandle(mimeType); |
| 313 } | 402 } |
| 314 | 403 |
| 315 FetchDataLoader* FetchDataLoader::createLoaderAsArrayBuffer() { | 404 FetchDataLoader* FetchDataLoader::createLoaderAsArrayBuffer() { |
| 316 return new FetchDataLoaderAsArrayBuffer(); | 405 return new FetchDataLoaderAsArrayBuffer(); |
| 317 } | 406 } |
| 318 | 407 |
| 319 FetchDataLoader* FetchDataLoader::createLoaderAsString() { | 408 FetchDataLoader* FetchDataLoader::createLoaderAsString() { |
| 320 return new FetchDataLoaderAsString(); | 409 return new FetchDataLoaderAsString(); |
| 321 } | 410 } |
| 322 | 411 |
| 323 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) { | 412 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) { |
| 324 return new FetchDataLoaderAsStream(outStream); | 413 return new FetchDataLoaderAsStream(outStream); |
| 325 } | 414 } |
| 326 | 415 |
| 416 FetchDataLoader* FetchDataLoader::createLoaderAsWasmModule( | |
| 417 v8::Isolate* isolate, | |
| 418 ScriptPromiseResolver* resolver, | |
| 419 ScriptState* scriptState) { | |
| 420 return new FetchDataLoaderAsWasmModule(isolate, resolver, scriptState); | |
| 421 } | |
| 422 | |
| 327 } // namespace blink | 423 } // namespace blink |
| OLD | NEW |