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

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

Issue 2780693003: [wasm] response-based compile APIs (Closed)
Patch Set: feedback, more comments, tracking bug 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"
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698