| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/lazy_instance.h" | 13 #include "base/lazy_instance.h" |
| 14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
| 15 #include "base/threading/thread_local.h" | 15 #include "base/threading/thread_local.h" |
| 16 #include "content/child/background_sync/background_sync_type_converters.h" | 16 #include "content/child/background_sync/background_sync_type_converters.h" |
| 17 #include "content/child/child_thread_impl.h" | 17 #include "content/child/child_thread_impl.h" |
| 18 #include "content/child/service_worker/web_service_worker_registration_impl.h" | 18 #include "content/child/service_worker/web_service_worker_registration_impl.h" |
| 19 #include "content/public/common/background_sync.mojom.h" | |
| 20 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncErro
r.h" | 19 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncErro
r.h" |
| 21 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncRegi
stration.h" | 20 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncRegi
stration.h" |
| 22 | 21 |
| 23 using base::LazyInstance; | 22 using base::LazyInstance; |
| 24 using base::ThreadLocalPointer; | 23 using base::ThreadLocalPointer; |
| 25 | 24 |
| 26 namespace content { | 25 namespace content { |
| 27 namespace { | 26 namespace { |
| 28 | 27 |
| 29 // Returns the id of the given |service_worker_registration|, which | 28 // Returns the id of the given |service_worker_registration|, which |
| 30 // is only available on the implementation of the interface. | 29 // is only available on the implementation of the interface. |
| 31 int64_t GetServiceWorkerRegistrationId( | 30 int64_t GetServiceWorkerRegistrationId( |
| 32 blink::WebServiceWorkerRegistration* service_worker_registration) { | 31 blink::WebServiceWorkerRegistration* service_worker_registration) { |
| 33 return static_cast<WebServiceWorkerRegistrationImpl*>( | 32 return static_cast<WebServiceWorkerRegistrationImpl*>( |
| 34 service_worker_registration)->registration_id(); | 33 service_worker_registration)->registration_id(); |
| 35 } | 34 } |
| 36 | 35 |
| 37 void ConnectToServiceOnMainThread( | 36 void ConnectToServiceOnMainThread( |
| 38 mojo::InterfaceRequest<mojom::BackgroundSyncService> request) { | 37 mojo::InterfaceRequest<blink::mojom::BackgroundSyncService> request) { |
| 39 DCHECK(ChildThreadImpl::current()); | 38 DCHECK(ChildThreadImpl::current()); |
| 40 ChildThreadImpl::current()->service_registry()->ConnectToRemoteService( | 39 ChildThreadImpl::current()->service_registry()->ConnectToRemoteService( |
| 41 std::move(request)); | 40 std::move(request)); |
| 42 } | 41 } |
| 43 | 42 |
| 44 LazyInstance<ThreadLocalPointer<BackgroundSyncProvider>>::Leaky | 43 LazyInstance<ThreadLocalPointer<BackgroundSyncProvider>>::Leaky |
| 45 g_sync_provider_tls = LAZY_INSTANCE_INITIALIZER; | 44 g_sync_provider_tls = LAZY_INSTANCE_INITIALIZER; |
| 46 | 45 |
| 47 } // namespace | 46 } // namespace |
| 48 | 47 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 61 BackgroundSyncProvider* | 60 BackgroundSyncProvider* |
| 62 BackgroundSyncProvider::GetOrCreateThreadSpecificInstance( | 61 BackgroundSyncProvider::GetOrCreateThreadSpecificInstance( |
| 63 base::SingleThreadTaskRunner* main_thread_task_runner) { | 62 base::SingleThreadTaskRunner* main_thread_task_runner) { |
| 64 DCHECK(main_thread_task_runner); | 63 DCHECK(main_thread_task_runner); |
| 65 if (g_sync_provider_tls.Pointer()->Get()) | 64 if (g_sync_provider_tls.Pointer()->Get()) |
| 66 return g_sync_provider_tls.Pointer()->Get(); | 65 return g_sync_provider_tls.Pointer()->Get(); |
| 67 | 66 |
| 68 bool have_worker_id = (WorkerThread::GetCurrentId() > 0); | 67 bool have_worker_id = (WorkerThread::GetCurrentId() > 0); |
| 69 if (!main_thread_task_runner->BelongsToCurrentThread() && !have_worker_id) { | 68 if (!main_thread_task_runner->BelongsToCurrentThread() && !have_worker_id) { |
| 70 // On a worker thread, this could happen if this method is called | 69 // On a worker thread, this could happen if this method is called |
| 71 // very late (say by a garbage collected mojom::SyncRegistration). | 70 // very late (say by a garbage collected blink::mojom::SyncRegistration). |
| 72 return nullptr; | 71 return nullptr; |
| 73 } | 72 } |
| 74 | 73 |
| 75 BackgroundSyncProvider* instance = | 74 BackgroundSyncProvider* instance = |
| 76 new BackgroundSyncProvider(main_thread_task_runner); | 75 new BackgroundSyncProvider(main_thread_task_runner); |
| 77 | 76 |
| 78 if (have_worker_id) { | 77 if (have_worker_id) { |
| 79 // For worker threads, use the observer interface to clean up when workers | 78 // For worker threads, use the observer interface to clean up when workers |
| 80 // are stopped. | 79 // are stopped. |
| 81 WorkerThread::AddObserver(instance); | 80 WorkerThread::AddObserver(instance); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 92 DCHECK(service_worker_registration); | 91 DCHECK(service_worker_registration); |
| 93 DCHECK(callbacks); | 92 DCHECK(callbacks); |
| 94 int64_t service_worker_registration_id = | 93 int64_t service_worker_registration_id = |
| 95 GetServiceWorkerRegistrationId(service_worker_registration); | 94 GetServiceWorkerRegistrationId(service_worker_registration); |
| 96 std::unique_ptr<const blink::WebSyncRegistration> optionsPtr(options); | 95 std::unique_ptr<const blink::WebSyncRegistration> optionsPtr(options); |
| 97 std::unique_ptr<blink::WebSyncRegistrationCallbacks> callbacksPtr(callbacks); | 96 std::unique_ptr<blink::WebSyncRegistrationCallbacks> callbacksPtr(callbacks); |
| 98 | 97 |
| 99 // base::Unretained is safe here, as the mojo channel will be deleted (and | 98 // base::Unretained is safe here, as the mojo channel will be deleted (and |
| 100 // will wipe its callbacks) before 'this' is deleted. | 99 // will wipe its callbacks) before 'this' is deleted. |
| 101 GetBackgroundSyncServicePtr()->Register( | 100 GetBackgroundSyncServicePtr()->Register( |
| 102 mojo::ConvertTo<mojom::SyncRegistrationPtr>(*(optionsPtr.get())), | 101 mojo::ConvertTo<blink::mojom::SyncRegistrationPtr>(*(optionsPtr.get())), |
| 103 service_worker_registration_id, | 102 service_worker_registration_id, |
| 104 base::Bind(&BackgroundSyncProvider::RegisterCallback, | 103 base::Bind(&BackgroundSyncProvider::RegisterCallback, |
| 105 base::Unretained(this), | 104 base::Unretained(this), |
| 106 base::Passed(std::move(callbacksPtr)))); | 105 base::Passed(std::move(callbacksPtr)))); |
| 107 } | 106 } |
| 108 | 107 |
| 109 void BackgroundSyncProvider::getRegistrations( | 108 void BackgroundSyncProvider::getRegistrations( |
| 110 blink::WebServiceWorkerRegistration* service_worker_registration, | 109 blink::WebServiceWorkerRegistration* service_worker_registration, |
| 111 blink::WebSyncGetRegistrationsCallbacks* callbacks) { | 110 blink::WebSyncGetRegistrationsCallbacks* callbacks) { |
| 112 DCHECK(service_worker_registration); | 111 DCHECK(service_worker_registration); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 124 base::Unretained(this), | 123 base::Unretained(this), |
| 125 base::Passed(std::move(callbacksPtr)))); | 124 base::Passed(std::move(callbacksPtr)))); |
| 126 } | 125 } |
| 127 | 126 |
| 128 void BackgroundSyncProvider::WillStopCurrentWorkerThread() { | 127 void BackgroundSyncProvider::WillStopCurrentWorkerThread() { |
| 129 delete this; | 128 delete this; |
| 130 } | 129 } |
| 131 | 130 |
| 132 void BackgroundSyncProvider::RegisterCallback( | 131 void BackgroundSyncProvider::RegisterCallback( |
| 133 std::unique_ptr<blink::WebSyncRegistrationCallbacks> callbacks, | 132 std::unique_ptr<blink::WebSyncRegistrationCallbacks> callbacks, |
| 134 mojom::BackgroundSyncError error, | 133 blink::mojom::BackgroundSyncError error, |
| 135 const mojom::SyncRegistrationPtr& options) { | 134 const blink::mojom::SyncRegistrationPtr& options) { |
| 136 // TODO(iclelland): Determine the correct error message to return in each case | 135 // TODO(iclelland): Determine the correct error message to return in each case |
| 137 std::unique_ptr<blink::WebSyncRegistration> result; | 136 std::unique_ptr<blink::WebSyncRegistration> result; |
| 138 switch (error) { | 137 switch (error) { |
| 139 case mojom::BackgroundSyncError::NONE: | 138 case blink::mojom::BackgroundSyncError::NONE: |
| 140 if (!options.is_null()) | 139 if (!options.is_null()) |
| 141 result = mojo::ConvertTo<std::unique_ptr<blink::WebSyncRegistration>>( | 140 result = mojo::ConvertTo<std::unique_ptr<blink::WebSyncRegistration>>( |
| 142 options); | 141 options); |
| 143 callbacks->onSuccess(std::move(result)); | 142 callbacks->onSuccess(std::move(result)); |
| 144 break; | 143 break; |
| 145 case mojom::BackgroundSyncError::NOT_FOUND: | 144 case blink::mojom::BackgroundSyncError::NOT_FOUND: |
| 146 NOTREACHED(); | 145 NOTREACHED(); |
| 147 break; | 146 break; |
| 148 case mojom::BackgroundSyncError::STORAGE: | 147 case blink::mojom::BackgroundSyncError::STORAGE: |
| 149 callbacks->onError( | 148 callbacks->onError( |
| 150 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, | 149 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, |
| 151 "Background Sync is disabled.")); | 150 "Background Sync is disabled.")); |
| 152 break; | 151 break; |
| 153 case mojom::BackgroundSyncError::NOT_ALLOWED: | 152 case blink::mojom::BackgroundSyncError::NOT_ALLOWED: |
| 154 callbacks->onError( | 153 callbacks->onError( |
| 155 blink::WebSyncError(blink::WebSyncError::ErrorTypeNoPermission, | 154 blink::WebSyncError(blink::WebSyncError::ErrorTypeNoPermission, |
| 156 "Attempted to register a sync event without a " | 155 "Attempted to register a sync event without a " |
| 157 "window or registration tag too long.")); | 156 "window or registration tag too long.")); |
| 158 break; | 157 break; |
| 159 case mojom::BackgroundSyncError::PERMISSION_DENIED: | 158 case blink::mojom::BackgroundSyncError::PERMISSION_DENIED: |
| 160 callbacks->onError( | 159 callbacks->onError( |
| 161 blink::WebSyncError(blink::WebSyncError::ErrorTypePermissionDenied, | 160 blink::WebSyncError(blink::WebSyncError::ErrorTypePermissionDenied, |
| 162 "Permission denied.")); | 161 "Permission denied.")); |
| 163 break; | 162 break; |
| 164 case mojom::BackgroundSyncError::NO_SERVICE_WORKER: | 163 case blink::mojom::BackgroundSyncError::NO_SERVICE_WORKER: |
| 165 callbacks->onError( | 164 callbacks->onError( |
| 166 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, | 165 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, |
| 167 "No service worker is active.")); | 166 "No service worker is active.")); |
| 168 break; | 167 break; |
| 169 } | 168 } |
| 170 } | 169 } |
| 171 | 170 |
| 172 void BackgroundSyncProvider::GetRegistrationsCallback( | 171 void BackgroundSyncProvider::GetRegistrationsCallback( |
| 173 std::unique_ptr<blink::WebSyncGetRegistrationsCallbacks> callbacks, | 172 std::unique_ptr<blink::WebSyncGetRegistrationsCallbacks> callbacks, |
| 174 mojom::BackgroundSyncError error, | 173 blink::mojom::BackgroundSyncError error, |
| 175 const mojo::Array<mojom::SyncRegistrationPtr>& registrations) { | 174 const mojo::Array<blink::mojom::SyncRegistrationPtr>& registrations) { |
| 176 // TODO(iclelland): Determine the correct error message to return in each case | 175 // TODO(iclelland): Determine the correct error message to return in each case |
| 177 switch (error) { | 176 switch (error) { |
| 178 case mojom::BackgroundSyncError::NONE: { | 177 case blink::mojom::BackgroundSyncError::NONE: { |
| 179 blink::WebVector<blink::WebSyncRegistration*> results( | 178 blink::WebVector<blink::WebSyncRegistration*> results( |
| 180 registrations.size()); | 179 registrations.size()); |
| 181 for (size_t i = 0; i < registrations.size(); ++i) { | 180 for (size_t i = 0; i < registrations.size(); ++i) { |
| 182 results[i] = | 181 results[i] = |
| 183 mojo::ConvertTo<std::unique_ptr<blink::WebSyncRegistration>>( | 182 mojo::ConvertTo<std::unique_ptr<blink::WebSyncRegistration>>( |
| 184 registrations[i]) | 183 registrations[i]) |
| 185 .release(); | 184 .release(); |
| 186 } | 185 } |
| 187 callbacks->onSuccess(results); | 186 callbacks->onSuccess(results); |
| 188 break; | 187 break; |
| 189 } | 188 } |
| 190 case mojom::BackgroundSyncError::NOT_FOUND: | 189 case blink::mojom::BackgroundSyncError::NOT_FOUND: |
| 191 case mojom::BackgroundSyncError::NOT_ALLOWED: | 190 case blink::mojom::BackgroundSyncError::NOT_ALLOWED: |
| 192 case mojom::BackgroundSyncError::PERMISSION_DENIED: | 191 case blink::mojom::BackgroundSyncError::PERMISSION_DENIED: |
| 193 // These errors should never be returned from | 192 // These errors should never be returned from |
| 194 // BackgroundSyncManager::GetRegistrations | 193 // BackgroundSyncManager::GetRegistrations |
| 195 NOTREACHED(); | 194 NOTREACHED(); |
| 196 break; | 195 break; |
| 197 case mojom::BackgroundSyncError::STORAGE: | 196 case blink::mojom::BackgroundSyncError::STORAGE: |
| 198 callbacks->onError( | 197 callbacks->onError( |
| 199 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, | 198 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, |
| 200 "Background Sync is disabled.")); | 199 "Background Sync is disabled.")); |
| 201 break; | 200 break; |
| 202 case mojom::BackgroundSyncError::NO_SERVICE_WORKER: | 201 case blink::mojom::BackgroundSyncError::NO_SERVICE_WORKER: |
| 203 callbacks->onError( | 202 callbacks->onError( |
| 204 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, | 203 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, |
| 205 "No service worker is active.")); | 204 "No service worker is active.")); |
| 206 break; | 205 break; |
| 207 } | 206 } |
| 208 } | 207 } |
| 209 | 208 |
| 210 mojom::BackgroundSyncServicePtr& | 209 blink::mojom::BackgroundSyncServicePtr& |
| 211 BackgroundSyncProvider::GetBackgroundSyncServicePtr() { | 210 BackgroundSyncProvider::GetBackgroundSyncServicePtr() { |
| 212 if (!background_sync_service_.get()) { | 211 if (!background_sync_service_.get()) { |
| 213 mojo::InterfaceRequest<mojom::BackgroundSyncService> request = | 212 mojo::InterfaceRequest<blink::mojom::BackgroundSyncService> request = |
| 214 mojo::GetProxy(&background_sync_service_); | 213 mojo::GetProxy(&background_sync_service_); |
| 215 main_thread_task_runner_->PostTask( | 214 main_thread_task_runner_->PostTask( |
| 216 FROM_HERE, | 215 FROM_HERE, |
| 217 base::Bind(&ConnectToServiceOnMainThread, base::Passed(&request))); | 216 base::Bind(&ConnectToServiceOnMainThread, base::Passed(&request))); |
| 218 } | 217 } |
| 219 return background_sync_service_; | 218 return background_sync_service_; |
| 220 } | 219 } |
| 221 | 220 |
| 222 } // namespace content | 221 } // namespace content |
| OLD | NEW |