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

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

Issue 2780693003: [wasm] response-based compile APIs (Closed)
Patch Set: feedback Created 3 years, 8 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 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698