Index: content/child/service_worker/service_worker_provider_context.h |
diff --git a/content/child/service_worker/service_worker_provider_context.h b/content/child/service_worker/service_worker_provider_context.h |
index 03a1d289c42eb2992cbaacbffa77a7b7faf58df2..e858ea9e743e843e544d1913fa2b11e0312fcb9c 100644 |
--- a/content/child/service_worker/service_worker_provider_context.h |
+++ b/content/child/service_worker/service_worker_provider_context.h |
@@ -28,13 +28,12 @@ class ServiceWorkerRegistrationHandleReference; |
struct ServiceWorkerProviderContextDeleter; |
class ThreadSafeSender; |
-// An instance of this class holds document-related information (e.g. |
-// .controller). Created and destructed on the main thread. |
-// TODO(kinuko): To support navigator.serviceWorker in dedicated workers |
-// this needs to be RefCountedThreadSafe and .controller info needs to be |
-// handled in a thread-safe manner (e.g. by a lock etc). |
+// An instance of this class holds information related to Document/Worker. |
+// Created and destructed on the main thread. Some functions can be called |
+// on the worker thread (eg. GetVersionAttributes). |
class ServiceWorkerProviderContext |
- : public base::RefCounted<ServiceWorkerProviderContext> { |
+ : public base::RefCountedThreadSafe<ServiceWorkerProviderContext, |
+ ServiceWorkerProviderContextDeleter> { |
public: |
explicit ServiceWorkerProviderContext(int provider_id); |
@@ -81,21 +80,39 @@ class ServiceWorkerProviderContext |
int registration_handle_id() const; |
private: |
- friend class base::RefCounted<ServiceWorkerProviderContext>; |
+ friend class base::DeleteHelper<ServiceWorkerProviderContext>; |
+ friend class base::RefCountedThreadSafe<ServiceWorkerProviderContext, |
+ ServiceWorkerProviderContextDeleter>; |
+ friend struct ServiceWorkerProviderContextDeleter; |
+ |
~ServiceWorkerProviderContext(); |
+ void DestructOnMainThread() const; |
const int provider_id_; |
scoped_refptr<base::MessageLoopProxy> main_thread_loop_proxy_; |
scoped_refptr<ThreadSafeSender> thread_safe_sender_; |
+ |
+ // Protects (installing, waiting, active) worker and registration references. |
+ base::Lock lock_; |
+ |
+ // Used on both the main thread and the worker thread. |
scoped_ptr<ServiceWorkerHandleReference> installing_; |
scoped_ptr<ServiceWorkerHandleReference> waiting_; |
scoped_ptr<ServiceWorkerHandleReference> active_; |
- scoped_ptr<ServiceWorkerHandleReference> controller_; |
scoped_ptr<ServiceWorkerRegistrationHandleReference> registration_; |
+ // Used only on the main thread. |
+ scoped_ptr<ServiceWorkerHandleReference> controller_; |
+ |
DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProviderContext); |
}; |
+struct ServiceWorkerProviderContextDeleter { |
+ static void Destruct(const ServiceWorkerProviderContext* context) { |
+ context->DestructOnMainThread(); |
+ } |
+}; |
+ |
} // namespace content |
#endif // CONTENT_CHILD_SERVICE_WORKER_SERVICE_WORKER_PROVIDER_CONTEXT_H_ |