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" |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
298 visitor->trace(m_outStream); | 298 visitor->trace(m_outStream); |
299 FetchDataLoader::trace(visitor); | 299 FetchDataLoader::trace(visitor); |
300 BytesConsumer::Client::trace(visitor); | 300 BytesConsumer::Client::trace(visitor); |
301 } | 301 } |
302 | 302 |
303 Member<BytesConsumer> m_consumer; | 303 Member<BytesConsumer> m_consumer; |
304 Member<FetchDataLoader::Client> m_client; | 304 Member<FetchDataLoader::Client> m_client; |
305 Member<Stream> m_outStream; | 305 Member<Stream> m_outStream; |
306 }; | 306 }; |
307 | 307 |
308 class FetchDataLoaderAsWasmModule final : public FetchDataLoader, | |
309 public BytesConsumer::Client { | |
310 USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsWasmModule); | |
311 | |
312 public: | |
313 FetchDataLoaderAsWasmModule(v8::Isolate* isolate, | |
314 ScriptPromiseResolver* resolver, | |
315 ScriptState* scriptState) | |
316 : m_resolver(resolver), m_builder(isolate), m_scriptState(scriptState) {} | |
317 | |
318 void start(BytesConsumer* consumer, | |
319 FetchDataLoader::Client* client) override { | |
320 DCHECK(!m_consumer); | |
321 DCHECK(!m_client); | |
322 m_client = client; | |
323 m_consumer = consumer; | |
324 m_consumer->setClient(this); | |
325 onStateChange(); | |
326 } | |
327 | |
328 void onStateChange() override { | |
329 while (true) { | |
330 // buffer is allocated by beginRead and de-allocated by endRead. | |
331 const char* buffer = nullptr; | |
332 size_t available = 0; | |
333 BytesConsumer::Result result = m_consumer->beginRead(&buffer, &available); | |
334 | |
335 if (result == BytesConsumer::Result::ShouldWait) | |
336 return; | |
337 if (result == BytesConsumer::Result::Ok) { | |
338 if (available > 0) { | |
339 DCHECK_NE(buffer, nullptr); | |
340 m_builder.OnBytesReceived(reinterpret_cast<const uint8_t*>(buffer), | |
341 available); | |
342 } | |
343 result = m_consumer->endRead(available); | |
344 } | |
345 switch (result) { | |
346 case BytesConsumer::Result::ShouldWait: | |
347 NOTREACHED(); | |
348 return; | |
349 case BytesConsumer::Result::Ok: { | |
350 break; | |
351 } | |
352 case BytesConsumer::Result::Done: { | |
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->didFetchDataLoadedWasmModule(); | |
367 return; | |
368 } | |
369 case BytesConsumer::Result::Error: { | |
370 // TODO(mtrofin): do we need an abort on the wasm side? | |
371 // m_outStream->abort(); | |
yhirano
2017/04/05 12:02:50
What does this line mean?
Mircea Trofin
2017/04/05 17:17:49
It's part of the TODO, I added more text around to
| |
372 return ThrowTypeError(); | |
373 } | |
374 } | |
375 } | |
376 } | |
377 | |
378 void cancel() override { | |
379 m_consumer->cancel(); | |
380 return ThrowTypeError(); | |
381 } | |
382 | |
383 DEFINE_INLINE_TRACE() { | |
384 visitor->trace(m_consumer); | |
385 visitor->trace(m_resolver); | |
386 visitor->trace(m_client); | |
387 FetchDataLoader::trace(visitor); | |
388 BytesConsumer::Client::trace(visitor); | |
389 } | |
390 | |
391 private: | |
392 // TODO(mtrofin): replace with spec-ed error types, once spec clarifies | |
393 // what they are. | |
394 void ThrowTypeError() { | |
395 m_resolver->reject(V8ThrowException::createTypeError( | |
396 m_scriptState->isolate(), "Could not download wasm module")); | |
397 } | |
398 Member<BytesConsumer> m_consumer; | |
399 Member<ScriptPromiseResolver> m_resolver; | |
400 Member<FetchDataLoader::Client> m_client; | |
401 v8::WasmModuleObjectBuilder m_builder; | |
402 const RefPtr<ScriptState> m_scriptState; | |
403 }; | |
404 | |
308 } // namespace | 405 } // namespace |
309 | 406 |
310 FetchDataLoader* FetchDataLoader::createLoaderAsBlobHandle( | 407 FetchDataLoader* FetchDataLoader::createLoaderAsBlobHandle( |
311 const String& mimeType) { | 408 const String& mimeType) { |
312 return new FetchDataLoaderAsBlobHandle(mimeType); | 409 return new FetchDataLoaderAsBlobHandle(mimeType); |
313 } | 410 } |
314 | 411 |
315 FetchDataLoader* FetchDataLoader::createLoaderAsArrayBuffer() { | 412 FetchDataLoader* FetchDataLoader::createLoaderAsArrayBuffer() { |
316 return new FetchDataLoaderAsArrayBuffer(); | 413 return new FetchDataLoaderAsArrayBuffer(); |
317 } | 414 } |
318 | 415 |
319 FetchDataLoader* FetchDataLoader::createLoaderAsString() { | 416 FetchDataLoader* FetchDataLoader::createLoaderAsString() { |
320 return new FetchDataLoaderAsString(); | 417 return new FetchDataLoaderAsString(); |
321 } | 418 } |
322 | 419 |
323 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) { | 420 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) { |
324 return new FetchDataLoaderAsStream(outStream); | 421 return new FetchDataLoaderAsStream(outStream); |
325 } | 422 } |
326 | 423 |
424 FetchDataLoader* FetchDataLoader::createLoaderAsWasmModule( | |
425 v8::Isolate* isolate, | |
426 ScriptPromiseResolver* resolver, | |
427 ScriptState* scriptState) { | |
428 return new FetchDataLoaderAsWasmModule(isolate, resolver, scriptState); | |
429 } | |
430 | |
327 } // namespace blink | 431 } // namespace blink |
OLD | NEW |