Index: content/child/service_worker/web_service_worker_provider_impl.cc |
diff --git a/content/child/service_worker/web_service_worker_provider_impl.cc b/content/child/service_worker/web_service_worker_provider_impl.cc |
index 99f9738be7af2197237ce89ca02e28f4f594e220..b76ca5b99d239979a58fa1e04ef038793b6169cf 100644 |
--- a/content/child/service_worker/web_service_worker_provider_impl.cc |
+++ b/content/child/service_worker/web_service_worker_provider_impl.cc |
@@ -7,19 +7,34 @@ |
#include "base/atomic_sequence_num.h" |
#include "base/logging.h" |
#include "content/child/child_thread.h" |
+#include "content/child/service_worker/scoped_service_worker_reference.h" |
#include "content/child/service_worker/service_worker_dispatcher.h" |
+#include "content/child/service_worker/service_worker_provider_context.h" |
+#include "content/child/service_worker/web_service_worker_impl.h" |
#include "content/child/thread_safe_sender.h" |
+#include "content/child/worker_task_runner.h" |
+#include "content/common/service_worker/service_worker_messages.h" |
+#include "third_party/WebKit/public/platform/WebServiceWorkerProviderClient.h" |
#include "third_party/WebKit/public/platform/WebURL.h" |
using blink::WebURL; |
namespace content { |
+namespace { |
+ |
+int CurrentWorkerId() { |
+ return WorkerTaskRunner::Instance()->CurrentWorkerId(); |
+} |
+ |
+} // namespace |
+ |
WebServiceWorkerProviderImpl::WebServiceWorkerProviderImpl( |
ThreadSafeSender* thread_safe_sender, |
- int provider_id) |
+ ServiceWorkerProviderContext* context) |
: thread_safe_sender_(thread_safe_sender), |
- provider_id_(provider_id) { |
+ context_(context), |
+ provider_id_(context->provider_id()) { |
} |
WebServiceWorkerProviderImpl::~WebServiceWorkerProviderImpl() { |
@@ -29,10 +44,24 @@ WebServiceWorkerProviderImpl::~WebServiceWorkerProviderImpl() { |
void WebServiceWorkerProviderImpl::setClient( |
blink::WebServiceWorkerProviderClient* client) { |
- if (client) |
- GetDispatcher()->AddScriptClient(provider_id_, client); |
- else |
+ if (!client) { |
RemoveScriptClient(); |
+ return; |
+ } |
+ |
+ scoped_ptr<ScopedServiceWorkerReference> current; |
+ context_->AddProviderThreadAndGetInitializationInfo( |
+ CurrentWorkerId(), ¤t); |
+ GetDispatcher()->AddScriptClient(provider_id_, client); |
+ if (!current) |
+ return; |
+ |
+ int handle_id = current->info().handle_id; |
+ if (handle_id != kInvalidServiceWorkerHandleId) { |
+ scoped_ptr<WebServiceWorkerImpl> worker( |
+ new WebServiceWorkerImpl(current.Pass(), thread_safe_sender_)); |
+ client->setCurrentServiceWorker(worker.release()); |
+ } |
} |
void WebServiceWorkerProviderImpl::registerServiceWorker( |
@@ -57,6 +86,7 @@ void WebServiceWorkerProviderImpl::RemoveScriptClient() { |
ServiceWorkerDispatcher::GetThreadSpecificInstance(); |
if (dispatcher) |
dispatcher->RemoveScriptClient(provider_id_); |
+ context_->RemoveProviderThread(CurrentWorkerId()); |
} |
ServiceWorkerDispatcher* WebServiceWorkerProviderImpl::GetDispatcher() { |