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

Unified Diff: third_party/WebKit/Source/web/WebIsolatedWorkerImpl.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
« no previous file with comments | « third_party/WebKit/Source/web/WebIsolatedWorkerImpl.h ('k') | third_party/WebKit/Source/web/web.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/web/WebIsolatedWorkerImpl.cpp
diff --git a/third_party/WebKit/Source/web/WebIsolatedWorkerImpl.cpp b/third_party/WebKit/Source/web/WebIsolatedWorkerImpl.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3eab7360a76307425261985f008da733cd0aab68
--- /dev/null
+++ b/third_party/WebKit/Source/web/WebIsolatedWorkerImpl.cpp
@@ -0,0 +1,179 @@
+
+#include "web/WebIsolatedWorkerImpl.h"
+
+#include "base/debug/stack_trace.h"
+#include "base/logging.h"
+#include "bindings/core/v8/ScriptSourceCode.h"
+#include "core/fetch/CachedMetadata.h"
+#include "core/inspector/ConsoleMessage.h"
+#include "core/workers/WorkerBackingThread.h"
+#include "core/workers/WorkerReportingProxy.h"
+#include "core/workers/WorkerThread.h"
+#include "core/workers/WorkerThreadStartupData.h"
+#include "modules/EventTargetModulesNames.h"
+#include "modules/fetch/Request.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 "mojo/public/cpp/bindings/binding.h"
+#include "platform/TraceEvent.h"
+#include "platform/WebThreadSupportingGC.h"
+#include "public/platform/modules/serviceworker/service_worker.mojom-blink.h"
+#include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebThread.h"
+#include "public/web/modules/serviceworker/WebIsolatedWorkerContextClient.h"
+#include "public/web/WebSettings.h"
+#include "public/web/WebView.h"
+#include "web/WebLocalFrameImpl.h"
+#include "wtf/PtrUtil.h"
+#include "wtf/Threading.h"
+
+namespace blink {
+
+WebIsolatedWorkerImpl::MainThreadProxy::MainThreadProxy(WebIsolatedWorkerImpl* worker, KURL scopeURL)
+ : m_worker(worker)
+ , m_scopeURL(scopeURL)
+{
+ // Created in IO thread
+}
+
+WebIsolatedWorkerImpl::MainThreadProxy::~MainThreadProxy()
+{
+ // TODO: Must be deleted in Main thread
+ DCHECK(!m_worker);
+}
+
+void WebIsolatedWorkerImpl::MainThreadProxy::detach()
+{
+ MutexLocker locker(m_lock_for_worker);
+ m_worker = nullptr;
+}
+
+void WebIsolatedWorkerImpl::MainThreadProxy::initializeOnMainThread(KURL scopeURL)
+{
+ // Called in Main thread.
+ TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::initializeOnMainThread");
+ LOG(ERROR) << "WebIsolatedWorkerImpl::MainThreadProxy::initializeOnMainThread~=|~~~~~~~~~~~~~~~~~~";
+ CHECK(isMainThread());
+
+ WebView* webView = WebView::create(nullptr, WebPageVisibilityStateVisible);
+ WebSettings* settings = webView->settings();
+ settings->setAcceleratedCompositingEnabled(false);
+ settings->setStrictMixedContentChecking(true);
+ settings->setAllowDisplayOfInsecureContent(false);
+ settings->setAllowRunningOfInsecureContent(false);
+ settings->setDataSaverEnabled(false);
+ WebLocalFrameImpl* mainFrame = toWebLocalFrameImpl(WebLocalFrame::create(WebTreeScopeType::Document, this));
+ webView->setMainFrame(mainFrame);
+ {
+ TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::initializeOnMainThread lock");
+ MutexLocker locker(m_lock_for_document);
+ m_webView = webView;
+ m_mainFrame = mainFrame;
+ CString content("");
+ RefPtr<SharedBuffer> buffer(SharedBuffer::create(content.data(), content.length()));
+ m_mainFrame->frame()->loader().load(FrameLoadRequest(0, ResourceRequest(scopeURL), SubstituteData(buffer, "text/html", "UTF-8", KURL())));
+
+ // TODO: initialize shadow page
+ }
+}
+
+void WebIsolatedWorkerImpl::MainThreadProxy::postTaskToLoader(const WebTraceLocation& location, std::unique_ptr<ExecutionContextTask> task)
+{
+ TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::postTaskToLoader");
+ MutexLocker locker(m_lock_for_document);
+ LOG(ERROR) << "WebIsolatedWorkerImpl::MainThreadProxy::postTaskToLoader";
+ if (!m_shadowPageLoadStarted) {
+ m_shadowPageLoadStarted = true;
+ Platform::current()->mainThread()->getWebTaskRunner()->postTask(
+ BLINK_FROM_HERE,
+ crossThreadBind(
+ &MainThreadProxy::initializeOnMainThread,
+ wrapPassRefPtr(this), m_scopeURL));
+ m_pending_tasks.push_back(std::move(task));
+ return;
+ }
+
+ // Keep tasks if the shadow page is not created yet.
+ if (m_shadowPageLoaded)
+ m_mainFrame->frame()->document()->postTask(location, std::move(task));
+ else
+ m_pending_tasks.push_back(std::move(task));
+}
+
+void WebIsolatedWorkerImpl::MainThreadProxy::postTaskToWorkerGlobalScope(const WebTraceLocation& location, std::unique_ptr<ExecutionContextTask> task)
+{
+ TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::postTaskToWorkerGlobalScope");
+ LOG(ERROR) << "WebIsolatedWorkerImpl::postTaskToWorkerGlobalScope";
+ MutexLocker locker(m_lock_for_worker);
+
+ m_worker->thread()->postTask(location, std::move(task));
+}
+
+void WebIsolatedWorkerImpl::MainThreadProxy::willSendRequest(WebLocalFrame*, WebURLRequest& request)
+{
+ TRACE_EVENT1("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::willSendRequest",
+ "URL", request.url().string().utf8().data());
+ LOG(ERROR) << "WebIsolatedWorkerImpl::MainThreadProxy::willSendRequest ";
+ // TODO: set provider host id
+}
+
+void WebIsolatedWorkerImpl::MainThreadProxy::didFinishDocumentLoad(WebLocalFrame*)
+{
+ TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::didFinishDocumentLoad");
+ LOG(ERROR) << "WebIsolatedWorkerImpl::MainThreadProxy::didFinishDocumentLoad";
+ MutexLocker locker(m_lock_for_document);
+ m_shadowPageLoaded = true;
+ for (auto& task : m_pending_tasks)
+ m_mainFrame->frame()->document()->postTask(BLINK_FROM_HERE, std::move(task));
+ m_pending_tasks.clear();
+}
+
+WebIsolatedWorker* WebIsolatedWorker::create(WebIsolatedWorkerContextClient* client)
+{
+ // Called in IO thread.
+ return new WebIsolatedWorkerImpl(wrapUnique(client));
+}
+
+WebIsolatedWorkerImpl::WebIsolatedWorkerImpl(std::unique_ptr<WebIsolatedWorkerContextClient> client)
+ : m_workerGlobalScopeProxy(IsolatedWorkerReportingProxy::create(std::move(client)))
+{
+ // Called in IO thread.
+ TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::WebIsolatedWorkerImpl");
+}
+
+WebIsolatedWorkerImpl::~WebIsolatedWorkerImpl()
+{
+ // Called in IO thread.
+ TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::~WebIsolatedWorkerImpl");
+}
+
+void WebIsolatedWorkerImpl::startWorker(int64_t versionID, WebURL scopeURL, WebURL scriptURL)
+{
+ // Called in IO thread.
+ TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::startWorker");
+ m_mainThreadProxy = new MainThreadProxy(this, scopeURL);
+ m_loaderProxy = WorkerLoaderProxy::create(m_mainThreadProxy.get());
+ m_workerThread = IsolatedWorkerThread::create(m_loaderProxy, *m_workerGlobalScopeProxy);
+ m_workerGlobalScopeProxy->setVersionID(versionID);
+ m_workerGlobalScopeProxy->setThread(m_workerThread.get());
+ m_workerThread->start(WorkerThreadStartupData::create(
+ scriptURL,
+ "fake user agent",
+ "console.log('test1');importScripts(\"importScripts.js\");console.log('test2');",
+ nullptr,
+ DontPauseWorkerGlobalScopeOnStart,
+ nullptr,
+ "",
+ nullptr,
+ nullptr,
+ WebAddressSpaceLocal,
+ nullptr,
+ nullptr,
+ V8CacheOptionsDefault));
+}
+
+} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/web/WebIsolatedWorkerImpl.h ('k') | third_party/WebKit/Source/web/web.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698