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

Unified Diff: third_party/WebKit/Source/modules/serviceworkers/IsolatedWorkerReportingProxy.cpp

Issue 2118243002: [proof-of-concept] SW thread independent of the main thread Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 4 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/serviceworkers/IsolatedWorkerReportingProxy.cpp
diff --git a/third_party/WebKit/Source/modules/serviceworkers/IsolatedWorkerReportingProxy.cpp b/third_party/WebKit/Source/modules/serviceworkers/IsolatedWorkerReportingProxy.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d968819a488d05b93fdd03a5cf0932e6c1733317
--- /dev/null
+++ b/third_party/WebKit/Source/modules/serviceworkers/IsolatedWorkerReportingProxy.cpp
@@ -0,0 +1,306 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "modules/serviceworkers/IsolatedWorkerReportingProxy.h"
+
+#include "mojo/public/cpp/bindings/binding.h"
+#include "platform/TraceEvent.h"
+#include "core/inspector/ConsoleMessage.h"
+#include "modules/serviceworkers/IsolatedWorkerThread.h"
+#include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h"
+#include "modules/serviceworkers/WaitUntilObserver.h"
+#include "modules/serviceworkers/FetchEvent.h"
+#include "modules/serviceworkers/FetchEventInit.h"
+#include "modules/serviceworkers/IsolatedWorkerReportingProxy.h"
+#include "modules/serviceworkers/IsolatedWorkerThread.h"
+#include "modules/serviceworkers/RespondWithObserver.h"
+#include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h"
+#include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
+#include "web/ServiceWorkerGlobalScopeClientImpl.h"
+#include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h"
+#include "modules/serviceworkers/ServiceWorkerGlobalScope.h"
+
+namespace blink {
+class IsolatedWorkerReportingProxy::IsolatedServiceWorkerContextClient
+ : public WebServiceWorkerContextClient {
+public:
+ IsolatedServiceWorkerContextClient(IsolatedWorkerReportingProxy* proxy)
+ : m_proxy(proxy)
+ {
+ }
+ ~IsolatedServiceWorkerContextClient() {}
+
+private:
+ void respondToFetchEvent(int responseID, double) override
+ {
+ m_proxy->respondToFetchEvent(responseID);
+ }
+ void respondToFetchEvent(int responseID, const WebServiceWorkerResponse& response, double) override
+ {
+ m_proxy->respondToFetchEvent(responseID, response);
+ }
+ void didHandleFetchEvent(int eventFinishID, WebServiceWorkerEventResult result, double) override
+ {
+ LOG(ERROR) << "didHandleFetchEvent " << eventFinishID;
+ }
+ void getClient(const WebString&, WebServiceWorkerClientCallbacks*) override {}
+ void getClients(const WebServiceWorkerClientQueryOptions&, WebServiceWorkerClientsCallbacks*) override {}
+ void openWindow(const WebURL&, WebServiceWorkerClientCallbacks*) override {}
+ void setCachedMetadata(const WebURL& url, const char* data, size_t size) {}
+ void clearCachedMetadata(const WebURL& url) {}
+ void postMessageToClient(const WebString& uuid, const WebString&, WebMessagePortChannelArray*) override {}
+ void postMessageToCrossOriginClient(const WebCrossOriginServiceWorkerClient&, const WebString&, WebMessagePortChannelArray*) override {}
+ void skipWaiting(WebServiceWorkerSkipWaitingCallbacks*) override {}
+ void claim(WebServiceWorkerClientsClaimCallbacks*) override {}
+ void focus(const WebString& uuid, WebServiceWorkerClientCallbacks*) override {}
+ void navigate(const WebString& uuid, const WebURL&, WebServiceWorkerClientCallbacks*) override {}
+ void registerForeignFetchScopes(const WebVector<WebURL>& subScopes, const WebVector<WebSecurityOrigin>& origins) override {}
+ IsolatedWorkerReportingProxy* m_proxy;
+};
+
+class IsolatedWorkerReportingProxy::IsolatedWorkerClientImpl : public mojom::blink::IsolatedWorkerClient {
+public:
+ explicit IsolatedWorkerClientImpl(IsolatedWorkerReportingProxy* workerReportingProxy)
+ : m_binding(this)
+ , m_workerReportingProxy(workerReportingProxy)
+ {
+ TRACE_EVENT0(
+ "ServiceWorker",
+ "IsolatedWorkerClientImpl::IsolatedWorkerClientImpl");
+ LOG(ERROR) << "IsolatedWorkerClientImpl" << this;
+ }
+ ~IsolatedWorkerClientImpl() override
+ {
+ LOG(ERROR) << "~IsolatedWorkerClientImpl" << this;
+ }
+ void Bind(mojom::blink::IsolatedWorkerClientRequest local_interfaces_request)
+ {
+ DCHECK(!m_binding.is_bound());
+ m_binding.Bind(std::move(local_interfaces_request));
+ }
+
+ void OnFetchEvent(int32_t responseID, int32_t eventFinishID, const String& url, bool is_navigate, const OnFetchEventCallback& callback) override
+ {
+ TRACE_EVENT0(
+ "ServiceWorker",
+ "IsolatedWorkerClientImpl::OnFetchEvent");
+ LOG(ERROR) << "responseID: " << responseID << " eventFinishID: " << eventFinishID;
+ m_workerReportingProxy->OnFetchEvent(responseID, eventFinishID, url, is_navigate, callback);
+ //callback.Run(1000);
+ }
+
+private:
+ mojo::Binding<mojom::blink::IsolatedWorkerClient> m_binding;
+ IsolatedWorkerReportingProxy* m_workerReportingProxy;
+};
+
+std::unique_ptr<IsolatedWorkerReportingProxy> IsolatedWorkerReportingProxy::create(std::unique_ptr<WebIsolatedWorkerContextClient> workerContextClient)
+{
+
+ return wrapUnique(new IsolatedWorkerReportingProxy(std::move(workerContextClient)));
+}
+IsolatedWorkerReportingProxy::~IsolatedWorkerReportingProxy()
+{
+ LOG(ERROR) << "~IsolatedWorkerReportingProxy";
+}
+void IsolatedWorkerReportingProxy::setVersionID(int64_t versionID)
+{
+ m_versionID = versionID;
+}
+void IsolatedWorkerReportingProxy::setThread(IsolatedWorkerThread* thread)
+{
+ m_thread = thread;
+}
+
+void IsolatedWorkerReportingProxy::reportException(const String& errorMessage, std::unique_ptr<SourceLocation>, int exceptionId)
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::reportException");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::reportException: \"" << errorMessage.utf8().data() << "\"";
+}
+void IsolatedWorkerReportingProxy::reportConsoleMessage(MessageSource, MessageLevel, const String& message, SourceLocation*)
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::reportConsoleMessage");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::reportConsoleMessage: \"" << message.utf8().data() << "\"";
+}
+void IsolatedWorkerReportingProxy::postMessageToPageInspector(const String&)
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::postMessageToPageInspector");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::postMessageToPageInspector";
+}
+
+// Invoked when the worker script is evaluated. |success| is true if the
+// evaluation completed with no uncaught exception.
+void IsolatedWorkerReportingProxy::didEvaluateWorkerScript(bool success)
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::didEvaluateWorkerScript");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::didEvaluateWorkerScript";
+
+ // m_isolated_worker_host_service->WorkerScriptEvaluated();
+ m_isolated_worker_host_service->OnScriptEvaluated();
+ m_thread->postTask(
+ BLINK_FROM_HERE, createSameThreadTask(
+ &IsolatedWorkerReportingProxy::sendWorkerStarted, WTF::unretained(this)));
+}
+
+// Invoked when the thread creates a worker script context.
+void IsolatedWorkerReportingProxy::didInitializeWorkerContext()
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::didInitializeWorkerContext");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::didInitializeWorkerContext";
+ m_scriptList = m_workerContextClient->takeWorkerScriptList();
+ for (const auto& script : *m_scriptList) {
+ LOG(ERROR) << "script: " << script->url;
+ }
+}
+
+// Invoked when the new WorkerGlobalScope is started.
+void IsolatedWorkerReportingProxy::workerGlobalScopeStarted(WorkerOrWorkletGlobalScope* workerGlobalScope)
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::workerGlobalScopeStarted");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::workerGlobalScopeStarted";
+ CHECK(workerGlobalScope == m_thread->globalScope());
+
+ std::unique_ptr<WebServiceWorkerRegistration::Handle> registrationHandle(m_workerContextClient->takeAssociatedRegistration());
+ static_cast<ServiceWorkerGlobalScope*>(workerGlobalScope)->setRegistration(std::move(registrationHandle));
+
+ m_seriveWorkerContextClient.reset(new IsolatedServiceWorkerContextClient(this));
+ provideServiceWorkerGlobalScopeClientToWorker(static_cast<WorkerGlobalScope*>(workerGlobalScope)->clients(), ServiceWorkerGlobalScopeClientImpl::create(*m_seriveWorkerContextClient));
+}
+
+// Invoked when close() is invoked on the worker context.
+void IsolatedWorkerReportingProxy::workerGlobalScopeClosed()
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::workerGlobalScopeClosed");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::workerGlobalScopeClosed";
+}
+
+// Invoked when the thread is stopped and WorkerGlobalScope is being
+// destructed. (This is be the last method that is called on this
+// interface)
+void IsolatedWorkerReportingProxy::workerThreadTerminated()
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::workerThreadTerminated");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::workerThreadTerminated";
+}
+
+// Invoked when the thread is about to be stopped and WorkerGlobalScope
+// is to be destructed. (When this is called it is guaranteed that
+// WorkerGlobalScope is still alive)
+void IsolatedWorkerReportingProxy::willDestroyWorkerGlobalScope()
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::willDestroyWorkerGlobalScope");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::willDestroyWorkerGlobalScope";
+}
+
+void IsolatedWorkerReportingProxy::initializeOnWorkerThread()
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::initializeOnWorkerThread");
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::initializeOnWorkerThread";
+ m_workerContextClient->initializeOnWorkerThread();
+ m_workerContextClient->connectToRemoteService(mojo::GetProxy(&m_isolated_worker_host_service));
+ mojom::blink::IsolatedWorkerClientPtr client_ptr;
+ m_isolatedWorkerClient.reset(new IsolatedWorkerClientImpl(this));
+ m_isolatedWorkerClient->Bind(GetProxy(&client_ptr));
+ m_isolated_worker_host_service->OnThreadStarted(m_versionID, std::move(client_ptr));
+}
+
+std::unique_ptr<String> IsolatedWorkerReportingProxy::takeAlternativeCode(const KURL& url)
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::takeAlternativeCode");
+ LOG(ERROR) << url.getString().utf8().data();
+ const String urlString(url.getString());
+ for (const auto& script : *m_scriptList) {
+ if (String::fromUTF8(script->url.data(), script->url.length()) != urlString)
+ continue;
+ std::unique_ptr<String> scriptString(new String);
+ for (const auto& dataItem : *script->data) {
+ scriptString->append(String::fromUTF8(dataItem->data(), dataItem->size()));
+ }
+ return scriptString;
+ }
+ return nullptr;
+}
+
+std::unique_ptr<WTF::Vector<char>> IsolatedWorkerReportingProxy::takeAlternativeCachedMetadata(const KURL& url)
+{
+ TRACE_EVENT0("ServiceWorker", "IsolatedWorkerReportingProxy::takeAlternativeCode");
+ LOG(ERROR) << url.getString().utf8().data();
+ const String urlString(url.getString());
+ for (const auto& script : *m_scriptList) {
+ if (String::fromUTF8(script->url.data(), script->url.length()) != urlString)
+ continue;
+ std::unique_ptr<WTF::Vector<char>> data(new WTF::Vector<char>);
+ // TODO: reserve
+
+ for (const auto& dataItem : *script->meta_data) {
+ data->append(dataItem->data(), dataItem->size());
+ }
+ return data;
+ }
+ return nullptr;
+}
+
+IsolatedWorkerReportingProxy::IsolatedWorkerReportingProxy(std::unique_ptr<WebIsolatedWorkerContextClient> workerContextClient)
+ : m_workerContextClient(std::move(workerContextClient))
+ , m_weakFactory(this)
+{
+ LOG(ERROR) << "IsolatedWorkerReportingProxy";
+}
+void IsolatedWorkerReportingProxy::sendWorkerStarted()
+{
+ LOG(ERROR) << "sendWorkerStarted";
+ m_isolated_worker_host_service->OnWorkerStarted();
+}
+void IsolatedWorkerReportingProxy::OnFetchEvent(int32_t responseID, int32_t eventFinishID, const String& url, bool is_navigate, const mojom::blink::IsolatedWorkerClient::OnFetchEventCallback& callback)
+{
+ LOG(ERROR) << "IsolatedWorkerReportingProxy::OnFetchEvent " << url.utf8().data();
+ m_onFetchCallbacks.set(responseID, callback);
+ blink::WebServiceWorkerRequest webRequest;
+ webRequest.setURL(blink::WebURL(KURL(ParsedURLString, url)));
+ if (is_navigate)
+ webRequest.setMode(WebURLRequest::FetchRequestModeNavigate);
+ WorkerGlobalScope* workerGlobalScope = static_cast<WorkerGlobalScope*>(m_thread->globalScope());
+ ScriptState::Scope scope(workerGlobalScope->scriptController()->getScriptState());
+ WaitUntilObserver* waitUntilObserver = WaitUntilObserver::create(workerGlobalScope, WaitUntilObserver::Fetch, eventFinishID);
+ RespondWithObserver* respondWithObserver = RespondWithObserver::create(workerGlobalScope, responseID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext(), waitUntilObserver);
+ Request* request = Request::create(workerGlobalScope->scriptController()->getScriptState(), webRequest);
+ request->getHeaders()->setGuard(Headers::ImmutableGuard);
+ FetchEventInit eventInit;
+ eventInit.setCancelable(true);
+ eventInit.setRequest(request);
+ eventInit.setClientId(webRequest.isMainResourceLoad() ? WebString() : webRequest.clientId());
+ eventInit.setIsReload(webRequest.isReload());
+ FetchEvent* fetchEvent = FetchEvent::create(workerGlobalScope->scriptController()->getScriptState(), EventTypeNames::fetch, eventInit, respondWithObserver, waitUntilObserver);
+ waitUntilObserver->willDispatchEvent();
+ DispatchEventResult dispatchResult = workerGlobalScope->dispatchEvent(fetchEvent);
+ respondWithObserver->didDispatchEvent(dispatchResult);
+ // false is okay because waitUntil for fetch event doesn't care about the
+ // promise rejection or an uncaught runtime script error.
+ waitUntilObserver->didDispatchEvent(false /*
+ errorOccurred */);
+}
+
+void IsolatedWorkerReportingProxy::respondToFetchEvent(int responseID)
+{
+ LOG(ERROR) << "respondToFetchEvent " << responseID;
+ mojom::blink::IsolatedWorkerClient::OnFetchEventCallback callback = m_onFetchCallbacks.take(responseID);
+ callback.Run(false, nullptr);
+}
+void IsolatedWorkerReportingProxy::respondToFetchEvent(int responseID, const WebServiceWorkerResponse& response)
+{
+ LOG(ERROR) << "respondToFetchEvent " << responseID;
+ LOG(ERROR) << "response blobid " << response.blobUUID().utf8().data();
+ LOG(ERROR) << "response blobid " << response.blobSize();
+ mojom::blink::ServiceWorkerResponsePtr res(mojom::blink::ServiceWorkerResponse::New());
+ res->url = response.url().string();
+ res->status_code = response.status();
+ res->status_text = response.statusText();
+ res->blob_uuid = response.blobUUID();
+ res->blob_size = response.blobSize();
+ res->stream_url = response.streamURL().string();
+ mojom::blink::IsolatedWorkerClient::OnFetchEventCallback callback = m_onFetchCallbacks.take(responseID);
+ callback.Run(true, std::move(res));
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698