summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-28 06:45:02 +0000
committerkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-28 06:45:02 +0000
commit693b6d1d7e4773cdad079dbaebe1863078a9d894 (patch)
treed833725af945e84418aea42f19241c9182a4e60d /content
parentc2f0e4f7809a578ef6e8b2131705b58d87174cd2 (diff)
downloadchromium_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.cc27
-rw-r--r--content/renderer/service_worker/embedded_worker_context_client.h6
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);
};