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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp
diff --git a/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp b/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp
index e5b6ce557785ad9816bf866ffd45be9bc671477d..06413936f16919f388151d22050864cf399a0bfe 100644
--- a/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp
+++ b/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp
@@ -21,8 +21,7 @@ class FetchDataLoaderAsBlobHandle final : public FetchDataLoader,
USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsBlobHandle);
public:
- explicit FetchDataLoaderAsBlobHandle(const String& mimeType)
- : m_mimeType(mimeType) {}
+ 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
void start(BytesConsumer* consumer,
FetchDataLoader::Client* client) override {
@@ -305,6 +304,96 @@ class FetchDataLoaderAsStream final : public FetchDataLoader,
Member<Stream> m_outStream;
};
+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
+ public BytesConsumer::Client {
+ USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsWasmModule);
+
+ public:
+ FetchDataLoaderAsWasmModule(v8::Isolate* isolate,
+ ScriptPromiseResolver* resolver,
+ ScriptState* scriptState)
+ : m_resolver(resolver), m_builder(isolate), m_scriptState(scriptState) {}
+
+ void start(BytesConsumer* consumer,
+ FetchDataLoader::Client* client) override {
+ DCHECK(!m_consumer);
+ DCHECK(!m_client);
+ m_client = client;
+ m_consumer = consumer;
+ m_consumer->setClient(this);
+ onStateChange();
+ }
+
+ void onStateChange() override {
+ while (true) {
+ // buffer is allocated by beginRead and de-allocated by endRead.
+ const char* buffer = nullptr;
+ size_t available = 0;
+ BytesConsumer::Result result = m_consumer->beginRead(&buffer, &available);
+
+ switch (result) {
+ case BytesConsumer::Result::ShouldWait:
+ DCHECK_EQ(buffer, nullptr);
+ DCHECK_EQ(available, 0U);
+ return;
+ case BytesConsumer::Result::Ok: {
+ DCHECK_NE(buffer, nullptr);
+ 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
+ m_builder.OnBytesReceived(reinterpret_cast<const uint8_t*>(buffer),
+ available);
+ 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.
+ if (result == BytesConsumer::Result::Error) {
+ m_resolver->reject();
+ }
+ break;
+ }
+ case BytesConsumer::Result::Done: {
+ DCHECK_EQ(buffer, nullptr);
+ DCHECK_EQ(available, 0U);
+ v8::Isolate* isolate = m_resolver->getScriptState()->isolate();
+ ScriptState::Scope scope(m_scriptState.get());
+ v8::TryCatch trycatch(isolate);
+ v8::Local<v8::WasmCompiledModule> module;
+ if (m_builder.Finish().ToLocal(&module)) {
+ DCHECK(!trycatch.HasCaught());
+ ScriptValue scriptValue(m_scriptState.get(), module);
+ m_resolver->resolve(scriptValue);
+ } else {
+ DCHECK(trycatch.HasCaught());
+ m_resolver->reject(trycatch.Exception());
+ trycatch.Reset();
+ }
+ m_client->didFetchDataLoadedStream();
+ return;
+ }
+ case BytesConsumer::Result::Error: {
+ // TODO(mtrofin): do we need an abort on the wasm side?
+ // m_outStream->abort();
+ m_client->didFetchDataLoadFailed();
+ return;
+ }
+ }
+ }
+ }
+
+ 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.
+
+ DEFINE_INLINE_TRACE() {
+ visitor->trace(m_consumer);
+ visitor->trace(m_resolver);
+ visitor->trace(m_client);
+ FetchDataLoader::trace(visitor);
+ BytesConsumer::Client::trace(visitor);
+ }
+
+ private:
+ Member<BytesConsumer> m_consumer;
+ Member<ScriptPromiseResolver> m_resolver;
+ Member<FetchDataLoader::Client> m_client;
+ v8::WasmModuleObjectBuilder m_builder;
+ const RefPtr<ScriptState> m_scriptState;
+};
+
} // namespace
FetchDataLoader* FetchDataLoader::createLoaderAsBlobHandle(
@@ -324,4 +413,11 @@ FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) {
return new FetchDataLoaderAsStream(outStream);
}
+FetchDataLoader* FetchDataLoader::createLoaderAsWasmModule(
+ v8::Isolate* isolate,
+ ScriptPromiseResolver* resolver,
+ ScriptState* scriptState) {
+ return new FetchDataLoaderAsWasmModule(isolate, resolver, scriptState);
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698