diff options
author | phoglund <phoglund@chromium.org> | 2015-02-25 08:28:20 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-25 16:29:50 +0000 |
commit | bdf542901eb439619dfc221fda500d4876fad3f4 (patch) | |
tree | db2a654f4fa9854e4f428166e47f9d7db085a40e | |
parent | 051001f2edf52d64239f5afc3ac68d9153ec2470 (diff) | |
download | chromium_src-bdf542901eb439619dfc221fda500d4876fad3f4.zip chromium_src-bdf542901eb439619dfc221fda500d4876fad3f4.tar.gz chromium_src-bdf542901eb439619dfc221fda500d4876fad3f4.tar.bz2 |
Revert of Revert of ServiceWorker: Use scheduler's default task queue for posting tasks on main thread (patchset #1 id:1 of https://codereview.chromium.org/954993002/)
Reason for revert:
Test is still flaky, even after reverting this one. For instance
http://build.chromium.org/p/chromium.win/builders/Vista%20Tests%20%281%29/builds/53768
Original issue's description:
> Revert of ServiceWorker: Use scheduler's default task queue for posting tasks on main thread (patchset #1 id:1 of https://codereview.chromium.org/958523002/)
>
> Reason for revert:
> Highly speculative revert after views_unittests broke on win7:
>
> http://build.chromium.org/p/chromium.win/builders/Win7%20Tests%20%28dbg%29%281%29/builds/35660
>
> c:\b\build\slave\win_builder__dbg_\build\src\ui\views\accessibility\native_view_accessibility_win_unittest.cc(190): error: Value of: infobar_accessible.IsSameObject(targets[0])
>
> This patch does change task queuing, which makes it seem slightly more likely to break stuff than the others in the blamelist.
>
> Original issue's description:
> > ServiceWorker: Use scheduler's default task queue for posting tasks on main thread
> >
> > This fixes a task ordering bug between WebMessagePortChannelImpl and
> > ServiceWorkerScriptContext. The former posts tasks via the Blink
> > scheduler's default task queue, and the latter was using the MessageLoop
> > directly. This patch makes tasks from service worker to the main thread
> > go through the scheduler.
> >
> > BUG=460833
> > TEST=http/tests/serviceworker/postmessage-msgport-to-client.html
> >
> > Committed: https://crrev.com/a7fe515e3ca07e260b58ebf460f842601266ed87
> > Cr-Commit-Position: refs/heads/master@{#318022}
>
> TBR=kinuko@chromium.org,skyostil@chromium.org,ksakamoto@chromium.org
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=460833
>
> Committed: https://crrev.com/64250e71c15dfe3576d8e4077e4dfb04f9382482
> Cr-Commit-Position: refs/heads/master@{#318040}
TBR=kinuko@chromium.org,skyostil@chromium.org,ksakamoto@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=460833
Review URL: https://codereview.chromium.org/957583003
Cr-Commit-Position: refs/heads/master@{#318058}
3 files changed, 17 insertions, 15 deletions
diff --git a/content/renderer/service_worker/embedded_worker_context_client.cc b/content/renderer/service_worker/embedded_worker_context_client.cc index 2173ced..b84340b 100644 --- a/content/renderer/service_worker/embedded_worker_context_client.cc +++ b/content/renderer/service_worker/embedded_worker_context_client.cc @@ -106,7 +106,7 @@ EmbeddedWorkerContextClient::EmbeddedWorkerContextClient( script_url_(script_url), worker_devtools_agent_route_id_(worker_devtools_agent_route_id), sender_(ChildThreadImpl::current()->thread_safe_sender()), - main_thread_proxy_(base::MessageLoopProxy::current()), + main_thread_task_runner_(RenderThreadImpl::current()->GetTaskRunner()), weak_factory_(this) { TRACE_EVENT_ASYNC_BEGIN0("ServiceWorker", "EmbeddedWorkerContextClient::StartingWorkerContext", @@ -180,7 +180,7 @@ void EmbeddedWorkerContextClient::workerReadyForInspection() { } void EmbeddedWorkerContextClient::workerContextFailedToStart() { - DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); + DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); DCHECK(!script_context_); Send(new EmbeddedWorkerHostMsg_WorkerScriptLoadFailed(embedded_worker_id_)); @@ -243,7 +243,7 @@ void EmbeddedWorkerContextClient::workerContextDestroyed() { // Now we should be able to free the WebEmbeddedWorker container on the // main thread. - main_thread_proxy_->PostTask( + main_thread_task_runner_->PostTask( FROM_HERE, base::Bind(&CallWorkerContextDestroyedOnMainThread, embedded_worker_id_)); @@ -355,7 +355,7 @@ void EmbeddedWorkerContextClient::didHandleCrossOriginConnectEvent( blink::WebServiceWorkerNetworkProvider* EmbeddedWorkerContextClient::createServiceWorkerNetworkProvider( blink::WebDataSource* data_source) { - DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); + DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); // Create a content::ServiceWorkerNetworkProvider for this data source so // we can observe its requests. @@ -380,7 +380,7 @@ EmbeddedWorkerContextClient::createServiceWorkerNetworkProvider( blink::WebServiceWorkerProvider* EmbeddedWorkerContextClient::createServiceWorkerProvider() { - DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); + DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); DCHECK(provider_context_); // Blink is responsible for deleting the returned object. diff --git a/content/renderer/service_worker/embedded_worker_context_client.h b/content/renderer/service_worker/embedded_worker_context_client.h index 1f7ac8d..89000a7 100644 --- a/content/renderer/service_worker/embedded_worker_context_client.h +++ b/content/renderer/service_worker/embedded_worker_context_client.h @@ -14,7 +14,7 @@ #include "url/gurl.h" namespace base { -class MessageLoopProxy; +class SingleThreadTaskRunner; class TaskRunner; } @@ -130,8 +130,8 @@ class EmbeddedWorkerContextClient // TODO: Implement DevTools related method overrides. int embedded_worker_id() const { return embedded_worker_id_; } - base::MessageLoopProxy* main_thread_proxy() const { - return main_thread_proxy_.get(); + base::SingleThreadTaskRunner* main_thread_task_runner() const { + return main_thread_task_runner_.get(); } ThreadSafeSender* thread_safe_sender() { return sender_.get(); } @@ -148,7 +148,7 @@ class EmbeddedWorkerContextClient const GURL script_url_; const int worker_devtools_agent_route_id_; scoped_refptr<ThreadSafeSender> sender_; - scoped_refptr<base::MessageLoopProxy> main_thread_proxy_; + scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_; scoped_refptr<base::TaskRunner> worker_task_runner_; scoped_ptr<ServiceWorkerScriptContext> script_context_; diff --git a/content/renderer/service_worker/service_worker_script_context.cc b/content/renderer/service_worker/service_worker_script_context.cc index 61c83be..74df548 100644 --- a/content/renderer/service_worker/service_worker_script_context.cc +++ b/content/renderer/service_worker/service_worker_script_context.cc @@ -253,7 +253,7 @@ void ServiceWorkerScriptContext::PostMessageToDocument( // messages for MessagePort (e.g. QueueMessages) are sent from main thread // (with thread hopping), so we need to do the same thread hopping here not // to overtake those messages. - embedded_context_->main_thread_proxy()->PostTask( + embedded_context_->main_thread_task_runner()->PostTask( FROM_HERE, base::Bind(&SendPostMessageToDocumentOnMainThread, make_scoped_refptr(embedded_context_->thread_safe_sender()), @@ -268,7 +268,7 @@ void ServiceWorkerScriptContext::PostCrossOriginMessageToClient( // messages for MessagePort (e.g. QueueMessages) are sent from main thread // (with thread hopping), so we need to do the same thread hopping here not // to overtake those messages. - embedded_context_->main_thread_proxy()->PostTask( + embedded_context_->main_thread_task_runner()->PostTask( FROM_HERE, base::Bind(&SendCrossOriginMessageToClientOnMainThread, make_scoped_refptr(embedded_context_->thread_safe_sender()), @@ -412,11 +412,12 @@ void ServiceWorkerScriptContext::OnPostMessage( "ServiceWorkerScriptContext::OnPostEvent"); std::vector<WebMessagePortChannelImpl*> ports; if (!sent_message_port_ids.empty()) { - base::MessageLoopProxy* loop_proxy = embedded_context_->main_thread_proxy(); + base::SingleThreadTaskRunner* task_runner = + embedded_context_->main_thread_task_runner(); ports.resize(sent_message_port_ids.size()); for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { ports[i] = new WebMessagePortChannelImpl( - new_routing_ids[i], sent_message_port_ids[i], loop_proxy); + new_routing_ids[i], sent_message_port_ids[i], task_runner); } } @@ -438,11 +439,12 @@ void ServiceWorkerScriptContext::OnCrossOriginMessageToWorker( "ServiceWorkerScriptContext::OnCrossOriginMessageToWorker"); std::vector<WebMessagePortChannelImpl*> ports; if (!sent_message_port_ids.empty()) { - base::MessageLoopProxy* loop_proxy = embedded_context_->main_thread_proxy(); + base::SingleThreadTaskRunner* task_runner = + embedded_context_->main_thread_task_runner(); ports.resize(sent_message_port_ids.size()); for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { ports[i] = new WebMessagePortChannelImpl( - new_routing_ids[i], sent_message_port_ids[i], loop_proxy); + new_routing_ids[i], sent_message_port_ids[i], task_runner); } } |