Commit 200baa21 authored by tzik's avatar tzik Committed by Commit bot

Use ParentFrameTaskRunners in WorkerLoaderProxyProvider::postTaskToLoader impls

Implementations of WorkerLoaderProxyProvider::postTaskToLoader have used
ExecutionContext::postTask to post tasks to the main thread. However,
the posted tasks are unexpectedly throttled, and that delays the startup
time of service workers.
This CL replaces ExecutionContext::postTask there with ParentFrameTaskRunners
and WebTaskRunner::postTask, so that the posted task is routed to suitable
task runners.

BUG=667310, 671084

Review-Url: https://codereview.chromium.org/2574703002
Cr-Commit-Position: refs/heads/master@{#438146}
parent a1b7b922
...@@ -48,6 +48,11 @@ class CORE_EXPORT ExecutionContextTask { ...@@ -48,6 +48,11 @@ class CORE_EXPORT ExecutionContextTask {
ExecutionContextTask() {} ExecutionContextTask() {}
virtual ~ExecutionContextTask() {} virtual ~ExecutionContextTask() {}
virtual void performTask(ExecutionContext*) = 0; virtual void performTask(ExecutionContext*) = 0;
void performTaskIfContextIsValid(ExecutionContext* context) {
if (context)
performTask(context);
}
}; };
namespace internal { namespace internal {
......
...@@ -240,6 +240,8 @@ class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper, ...@@ -240,6 +240,8 @@ class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper,
void onSetUp() override { void onSetUp() override {
m_mockWorkerReportingProxy = WTF::makeUnique<MockWorkerReportingProxy>(); m_mockWorkerReportingProxy = WTF::makeUnique<MockWorkerReportingProxy>();
m_securityOrigin = document().getSecurityOrigin(); m_securityOrigin = document().getSecurityOrigin();
m_parentFrameTaskRunners =
ParentFrameTaskRunners::create(&m_dummyPageHolder->frame());
m_workerThread = WTF::wrapUnique(new WorkerThreadForTest( m_workerThread = WTF::wrapUnique(new WorkerThreadForTest(
this, *m_mockWorkerReportingProxy, m_threadHeapMode)); this, *m_mockWorkerReportingProxy, m_threadHeapMode));
...@@ -329,7 +331,12 @@ class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper, ...@@ -329,7 +331,12 @@ class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper,
std::unique_ptr<ExecutionContextTask> task) override { std::unique_ptr<ExecutionContextTask> task) override {
DCHECK(m_workerThread); DCHECK(m_workerThread);
DCHECK(m_workerThread->isCurrentThread()); DCHECK(m_workerThread->isCurrentThread());
document().postTask(location, std::move(task)); m_parentFrameTaskRunners->get(TaskType::Networking)
->postTask(
BLINK_FROM_HERE,
crossThreadBind(&ExecutionContextTask::performTaskIfContextIsValid,
WTF::passed(std::move(task)),
wrapCrossThreadWeakPersistent(&document())));
} }
void postTaskToWorkerGlobalScope( void postTaskToWorkerGlobalScope(
...@@ -344,6 +351,7 @@ class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper, ...@@ -344,6 +351,7 @@ class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper,
std::unique_ptr<WorkerThreadForTest> m_workerThread; std::unique_ptr<WorkerThreadForTest> m_workerThread;
std::unique_ptr<DummyPageHolder> m_dummyPageHolder; std::unique_ptr<DummyPageHolder> m_dummyPageHolder;
Persistent<ParentFrameTaskRunners> m_parentFrameTaskRunners;
Checkpoint m_checkpoint; Checkpoint m_checkpoint;
// |m_loader| must be touched only from the worker thread only. // |m_loader| must be touched only from the worker thread only.
CrossThreadPersistent<ThreadableLoader> m_loader; CrossThreadPersistent<ThreadableLoader> m_loader;
......
...@@ -74,9 +74,12 @@ void ThreadedMessagingProxyBase::postTaskToLoader( ...@@ -74,9 +74,12 @@ void ThreadedMessagingProxyBase::postTaskToLoader(
const WebTraceLocation& location, const WebTraceLocation& location,
std::unique_ptr<ExecutionContextTask> task) { std::unique_ptr<ExecutionContextTask> task) {
DCHECK(getExecutionContext()->isDocument()); DCHECK(getExecutionContext()->isDocument());
// TODO(hiroshige,yuryu): Make this not use ExecutionContextTask and use m_parentFrameTaskRunners->get(TaskType::Networking)
// m_parentFrameTaskRunners->get(TaskType::Networking) instead. ->postTask(BLINK_FROM_HERE,
getExecutionContext()->postTask(location, std::move(task)); crossThreadBind(
&ExecutionContextTask::performTaskIfContextIsValid,
WTF::passed(std::move(task)),
wrapCrossThreadWeakPersistent(getExecutionContext())));
} }
void ThreadedMessagingProxyBase::countFeature(UseCounter::Feature feature) { void ThreadedMessagingProxyBase::countFeature(UseCounter::Feature feature) {
......
...@@ -263,10 +263,13 @@ void WebEmbeddedWorkerImpl::postMessageToPageInspector(const String& message) { ...@@ -263,10 +263,13 @@ void WebEmbeddedWorkerImpl::postMessageToPageInspector(const String& message) {
void WebEmbeddedWorkerImpl::postTaskToLoader( void WebEmbeddedWorkerImpl::postTaskToLoader(
const WebTraceLocation& location, const WebTraceLocation& location,
std::unique_ptr<ExecutionContextTask> task) { std::unique_ptr<ExecutionContextTask> task) {
// TODO(hiroshige,yuryu): Make this not use ExecutionContextTask and m_mainThreadTaskRunners->get(TaskType::Networking)
// consider using m_mainThreadTaskRunners->get(TaskType::Networking) ->postTask(
// instead. BLINK_FROM_HERE,
m_mainFrame->frame()->document()->postTask(location, std::move(task)); crossThreadBind(
&ExecutionContextTask::performTaskIfContextIsValid,
WTF::passed(std::move(task)),
wrapCrossThreadWeakPersistent(m_mainFrame->frame()->document())));
} }
void WebEmbeddedWorkerImpl::postTaskToWorkerGlobalScope( void WebEmbeddedWorkerImpl::postTaskToWorkerGlobalScope(
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
#include "platform/CrossThreadFunctional.h" #include "platform/CrossThreadFunctional.h"
#include "platform/RuntimeEnabledFeatures.h" #include "platform/RuntimeEnabledFeatures.h"
#include "platform/heap/Handle.h" #include "platform/heap/Handle.h"
#include "platform/heap/Persistent.h"
#include "platform/network/ContentSecurityPolicyParsers.h" #include "platform/network/ContentSecurityPolicyParsers.h"
#include "platform/network/ResourceResponse.h" #include "platform/network/ResourceResponse.h"
#include "platform/weborigin/KURL.h" #include "platform/weborigin/KURL.h"
...@@ -306,10 +307,12 @@ void WebSharedWorkerImpl::didTerminateWorkerThreadOnMainThread() { ...@@ -306,10 +307,12 @@ void WebSharedWorkerImpl::didTerminateWorkerThreadOnMainThread() {
void WebSharedWorkerImpl::postTaskToLoader( void WebSharedWorkerImpl::postTaskToLoader(
const WebTraceLocation& location, const WebTraceLocation& location,
std::unique_ptr<ExecutionContextTask> task) { std::unique_ptr<ExecutionContextTask> task) {
// TODO(hiroshige,yuryu): Make this not use ExecutionContextTask and m_parentFrameTaskRunners->get(TaskType::Networking)
// consider using m_parentFrameTaskRunners->get(TaskType::Networking) ->postTask(FROM_HERE,
// instead. crossThreadBind(
m_mainFrame->frame()->document()->postTask(location, std::move(task)); &ExecutionContextTask::performTaskIfContextIsValid,
WTF::passed(std::move(task)),
wrapCrossThreadWeakPersistent(m_loadingDocument.get())));
} }
void WebSharedWorkerImpl::postTaskToWorkerGlobalScope( void WebSharedWorkerImpl::postTaskToWorkerGlobalScope(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment