OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/child/background_sync/background_sync_provider.h" | 5 #include "content/child/background_sync/background_sync_provider.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/lazy_instance.h" |
8 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/single_thread_task_runner.h" |
| 11 #include "base/threading/thread_local.h" |
9 #include "content/child/background_sync/background_sync_type_converters.h" | 12 #include "content/child/background_sync/background_sync_type_converters.h" |
| 13 #include "content/child/child_thread_impl.h" |
10 #include "content/child/service_worker/web_service_worker_registration_impl.h" | 14 #include "content/child/service_worker/web_service_worker_registration_impl.h" |
11 #include "content/child/worker_task_runner.h" | |
12 #include "content/public/common/background_sync.mojom.h" | 15 #include "content/public/common/background_sync.mojom.h" |
13 #include "content/public/common/permission_status.mojom.h" | 16 #include "content/public/common/permission_status.mojom.h" |
14 #include "content/public/common/service_registry.h" | |
15 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncErro
r.h" | 17 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncErro
r.h" |
16 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncRegi
stration.h" | 18 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncRegi
stration.h" |
17 | 19 |
| 20 using base::LazyInstance; |
| 21 using base::ThreadLocalPointer; |
| 22 |
18 namespace content { | 23 namespace content { |
19 namespace { | 24 namespace { |
20 | 25 |
21 // Returns the id of the given |service_worker_registration|, which | 26 // Returns the id of the given |service_worker_registration|, which |
22 // is only available on the implementation of the interface. | 27 // is only available on the implementation of the interface. |
23 int64 GetServiceWorkerRegistrationId( | 28 int64 GetServiceWorkerRegistrationId( |
24 blink::WebServiceWorkerRegistration* service_worker_registration) { | 29 blink::WebServiceWorkerRegistration* service_worker_registration) { |
25 return static_cast<WebServiceWorkerRegistrationImpl*>( | 30 return static_cast<WebServiceWorkerRegistrationImpl*>( |
26 service_worker_registration)->registration_id(); | 31 service_worker_registration)->registration_id(); |
27 } | 32 } |
28 | 33 |
| 34 void ConnectToServiceOnMainThread( |
| 35 mojo::InterfaceRequest<BackgroundSyncService> request) { |
| 36 DCHECK(ChildThreadImpl::current()); |
| 37 ChildThreadImpl::current()->service_registry()->ConnectToRemoteService( |
| 38 request.Pass()); |
| 39 } |
| 40 |
| 41 LazyInstance<ThreadLocalPointer<BackgroundSyncProvider>>::Leaky |
| 42 g_sync_provider_tls = LAZY_INSTANCE_INITIALIZER; |
| 43 |
29 } // namespace | 44 } // namespace |
30 | 45 |
31 BackgroundSyncProvider::BackgroundSyncProvider( | 46 BackgroundSyncProvider::~BackgroundSyncProvider() { |
32 ServiceRegistry* service_registry) | 47 g_sync_provider_tls.Pointer()->Set(nullptr); |
33 : service_registry_(service_registry), background_sync_service_(14) { | |
34 DCHECK(service_registry); | |
35 } | 48 } |
36 | 49 |
37 BackgroundSyncProvider::~BackgroundSyncProvider() { | 50 // static |
| 51 BackgroundSyncProvider* |
| 52 BackgroundSyncProvider::GetOrCreateThreadSpecificInstance( |
| 53 base::SingleThreadTaskRunner* main_thread_task_runner) { |
| 54 DCHECK(main_thread_task_runner); |
| 55 if (g_sync_provider_tls.Pointer()->Get()) |
| 56 return g_sync_provider_tls.Pointer()->Get(); |
| 57 |
| 58 bool have_worker_id = (WorkerThread::GetCurrentId() > 0); |
| 59 if (!main_thread_task_runner->BelongsToCurrentThread() && !have_worker_id) { |
| 60 // On a worker thread, this could happen if this method is called |
| 61 // very late (say by a garbage collected SyncRegistration). |
| 62 return nullptr; |
| 63 } |
| 64 |
| 65 BackgroundSyncProvider* instance = |
| 66 new BackgroundSyncProvider(main_thread_task_runner); |
| 67 |
| 68 if (have_worker_id) { |
| 69 // For worker threads, use the observer interface to clean up when workers |
| 70 // are stopped. |
| 71 WorkerThread::AddObserver(instance); |
| 72 } |
| 73 |
| 74 return instance; |
38 } | 75 } |
39 | 76 |
40 void BackgroundSyncProvider::registerBackgroundSync( | 77 void BackgroundSyncProvider::registerBackgroundSync( |
41 const blink::WebSyncRegistration* options, | 78 const blink::WebSyncRegistration* options, |
42 blink::WebServiceWorkerRegistration* service_worker_registration, | 79 blink::WebServiceWorkerRegistration* service_worker_registration, |
43 bool requested_from_service_worker, | 80 bool requested_from_service_worker, |
44 blink::WebSyncRegistrationCallbacks* callbacks) { | 81 blink::WebSyncRegistrationCallbacks* callbacks) { |
45 DCHECK(options); | 82 DCHECK(options); |
46 DCHECK(service_worker_registration); | 83 DCHECK(service_worker_registration); |
47 DCHECK(callbacks); | 84 DCHECK(callbacks); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } | 193 } |
157 | 194 |
158 void BackgroundSyncProvider::DuplicateRegistrationHandle( | 195 void BackgroundSyncProvider::DuplicateRegistrationHandle( |
159 int64_t handle_id, | 196 int64_t handle_id, |
160 const BackgroundSyncService::DuplicateRegistrationHandleCallback& | 197 const BackgroundSyncService::DuplicateRegistrationHandleCallback& |
161 callback) { | 198 callback) { |
162 GetBackgroundSyncServicePtr()->DuplicateRegistrationHandle(handle_id, | 199 GetBackgroundSyncServicePtr()->DuplicateRegistrationHandle(handle_id, |
163 callback); | 200 callback); |
164 } | 201 } |
165 | 202 |
| 203 void BackgroundSyncProvider::WillStopCurrentWorkerThread() { |
| 204 delete this; |
| 205 } |
| 206 |
| 207 BackgroundSyncProvider::BackgroundSyncProvider( |
| 208 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) |
| 209 : main_thread_task_runner_(main_task_runner) { |
| 210 DCHECK(main_task_runner); |
| 211 g_sync_provider_tls.Pointer()->Set(this); |
| 212 } |
| 213 |
166 void BackgroundSyncProvider::RegisterCallback( | 214 void BackgroundSyncProvider::RegisterCallback( |
167 scoped_ptr<blink::WebSyncRegistrationCallbacks> callbacks, | 215 scoped_ptr<blink::WebSyncRegistrationCallbacks> callbacks, |
168 BackgroundSyncError error, | 216 BackgroundSyncError error, |
169 const SyncRegistrationPtr& options) { | 217 const SyncRegistrationPtr& options) { |
170 // TODO(iclelland): Determine the correct error message to return in each case | 218 // TODO(iclelland): Determine the correct error message to return in each case |
171 scoped_ptr<blink::WebSyncRegistration> result; | 219 scoped_ptr<blink::WebSyncRegistration> result; |
172 switch (error) { | 220 switch (error) { |
173 case BACKGROUND_SYNC_ERROR_NONE: | 221 case BACKGROUND_SYNC_ERROR_NONE: |
174 if (!options.is_null()) | 222 if (!options.is_null()) |
175 result = | 223 result = |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 callbacks->onError( | 417 callbacks->onError( |
370 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, | 418 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, |
371 "No service worker is active.")); | 419 "No service worker is active.")); |
372 break; | 420 break; |
373 } | 421 } |
374 } | 422 } |
375 | 423 |
376 BackgroundSyncServicePtr& | 424 BackgroundSyncServicePtr& |
377 BackgroundSyncProvider::GetBackgroundSyncServicePtr() { | 425 BackgroundSyncProvider::GetBackgroundSyncServicePtr() { |
378 if (!background_sync_service_.get()) { | 426 if (!background_sync_service_.get()) { |
379 service_registry_->ConnectToRemoteService( | 427 mojo::InterfaceRequest<BackgroundSyncService> request = |
380 mojo::GetProxy(&background_sync_service_)); | 428 mojo::GetProxy(&background_sync_service_); |
| 429 main_thread_task_runner_->PostTask( |
| 430 FROM_HERE, |
| 431 base::Bind(&ConnectToServiceOnMainThread, base::Passed(&request))); |
381 } | 432 } |
382 return background_sync_service_; | 433 return background_sync_service_; |
383 } | 434 } |
384 | 435 |
385 } // namespace content | 436 } // namespace content |
OLD | NEW |