diff options
author | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-28 06:45:02 +0000 |
---|---|---|
committer | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-28 06:45:02 +0000 |
commit | 693b6d1d7e4773cdad079dbaebe1863078a9d894 (patch) | |
tree | d833725af945e84418aea42f19241c9182a4e60d /content | |
parent | c2f0e4f7809a578ef6e8b2131705b58d87174cd2 (diff) | |
download | chromium_src-693b6d1d7e4773cdad079dbaebe1863078a9d894.zip chromium_src-693b6d1d7e4773cdad079dbaebe1863078a9d894.tar.gz chromium_src-693b6d1d7e4773cdad079dbaebe1863078a9d894.tar.bz2 |
Fix the timing when EmbeddedWorker sends back WorkerStarted
So that when the browser process receives the msg it can be
sure the worker script has been evaluated and worker run loop
has started.
BUG=313530
Review URL: https://codereview.chromium.org/142373003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@247429 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/renderer/service_worker/embedded_worker_context_client.cc | 27 | ||||
-rw-r--r-- | content/renderer/service_worker/embedded_worker_context_client.h | 6 |
2 files changed, 28 insertions, 5 deletions
diff --git a/content/renderer/service_worker/embedded_worker_context_client.cc b/content/renderer/service_worker/embedded_worker_context_client.cc index aa97b9c..8f13c5d 100644 --- a/content/renderer/service_worker/embedded_worker_context_client.cc +++ b/content/renderer/service_worker/embedded_worker_context_client.cc @@ -9,6 +9,7 @@ #include "base/pickle.h" #include "base/threading/thread_local.h" #include "content/child/thread_safe_sender.h" +#include "content/child/worker_thread_task_runner.h" #include "content/common/service_worker/embedded_worker_messages.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/service_worker/embedded_worker_dispatcher.h" @@ -52,7 +53,8 @@ EmbeddedWorkerContextClient::EmbeddedWorkerContextClient( service_worker_version_id_(service_worker_version_id), script_url_(script_url), sender_(ChildThread::current()->thread_safe_sender()), - main_thread_proxy_(base::MessageLoopProxy::current()) { + main_thread_proxy_(base::MessageLoopProxy::current()), + weak_factory_(this) { g_worker_client_tls.Pointer()->Set(this); } @@ -88,20 +90,28 @@ void EmbeddedWorkerContextClient::workerContextFailedToStart() { void EmbeddedWorkerContextClient::workerContextStarted( blink::WebServiceWorkerContextProxy* proxy) { + DCHECK(!worker_task_runner_); + worker_task_runner_ = new WorkerThreadTaskRunner( + WorkerTaskRunner::Instance()->CurrentWorkerId()); DCHECK_NE(0, WorkerTaskRunner::Instance()->CurrentWorkerId()); DCHECK(g_worker_client_tls.Pointer()->Get() == NULL); DCHECK(!script_context_); g_worker_client_tls.Pointer()->Set(this); script_context_.reset(new ServiceWorkerScriptContext(this, proxy)); - sender_->Send(new EmbeddedWorkerHostMsg_WorkerStarted( - WorkerTaskRunner::Instance()->CurrentWorkerId(), - embedded_worker_id_)); + // Schedule a task to send back WorkerStarted asynchronously, + // so that at the time we send it we can be sure that the worker + // script has been evaluated and worker run loop has been started. + worker_task_runner_->PostTask( + FROM_HERE, + base::Bind(&EmbeddedWorkerContextClient::SendWorkerStarted, + weak_factory_.GetWeakPtr())); } void EmbeddedWorkerContextClient::workerContextDestroyed() { // At this point OnWorkerRunLoopStopped is already called, so - // CurrentWorkerId() returns 0 (while we're still on the worker thread). + // worker_task_runner_->RunsTasksOnCurrentThread() returns false + // (while we're still on the worker thread). script_context_.reset(); main_thread_proxy_->PostTask( FROM_HERE, @@ -119,4 +129,11 @@ void EmbeddedWorkerContextClient::OnSendMessageToWorker( script_context_->OnMessageReceived(message); } +void EmbeddedWorkerContextClient::SendWorkerStarted() { + DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); + sender_->Send(new EmbeddedWorkerHostMsg_WorkerStarted( + WorkerTaskRunner::Instance()->CurrentWorkerId(), + embedded_worker_id_)); +} + } // namespace content diff --git a/content/renderer/service_worker/embedded_worker_context_client.h b/content/renderer/service_worker/embedded_worker_context_client.h index 68e1aad..59e9cba 100644 --- a/content/renderer/service_worker/embedded_worker_context_client.h +++ b/content/renderer/service_worker/embedded_worker_context_client.h @@ -6,6 +6,7 @@ #define CONTENT_CHILD_SERVICE_WORKER_EMBEDDED_WORKER_CLIENT_H_ #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "ipc/ipc_listener.h" #include "third_party/WebKit/public/web/WebServiceWorkerContextClient.h" @@ -13,6 +14,7 @@ namespace base { class MessageLoopProxy; +class TaskRunner; } namespace content { @@ -60,15 +62,19 @@ class EmbeddedWorkerContextClient void OnSendMessageToWorker(int thread_id, int embedded_worker_id, const IPC::Message& message); + void SendWorkerStarted(); const int embedded_worker_id_; const int64 service_worker_version_id_; const GURL script_url_; scoped_refptr<ThreadSafeSender> sender_; scoped_refptr<base::MessageLoopProxy> main_thread_proxy_; + scoped_refptr<base::TaskRunner> worker_task_runner_; scoped_ptr<ServiceWorkerScriptContext> script_context_; + base::WeakPtrFactory<EmbeddedWorkerContextClient> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerContextClient); }; |