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
3 // found in the LICENSE file.
5 #include "content/child/background_sync/background_sync_provider.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "content/child/background_sync/background_sync_type_converters.h"
10 #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"
13 #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/WebSyncError.h"
16 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncRegistration.h"
21 // Returns the id of the given |service_worker_registration|, which
22 // is only available on the implementation of the interface.
23 int64
GetServiceWorkerRegistrationId(
24 blink::WebServiceWorkerRegistration
* service_worker_registration
) {
25 return static_cast<WebServiceWorkerRegistrationImpl
*>(
26 service_worker_registration
)->registration_id();
31 BackgroundSyncProvider::BackgroundSyncProvider(
32 ServiceRegistry
* service_registry
)
33 : service_registry_(service_registry
) {
34 DCHECK(service_registry
);
37 BackgroundSyncProvider::~BackgroundSyncProvider() {
40 void BackgroundSyncProvider::registerBackgroundSync(
41 const blink::WebSyncRegistration
* options
,
42 blink::WebServiceWorkerRegistration
* service_worker_registration
,
43 bool requested_from_service_worker
,
44 blink::WebSyncRegistrationCallbacks
* callbacks
) {
46 DCHECK(service_worker_registration
);
48 int64 service_worker_registration_id
=
49 GetServiceWorkerRegistrationId(service_worker_registration
);
50 scoped_ptr
<const blink::WebSyncRegistration
> optionsPtr(options
);
51 scoped_ptr
<blink::WebSyncRegistrationCallbacks
> callbacksPtr(callbacks
);
53 // base::Unretained is safe here, as the mojo channel will be deleted (and
54 // will wipe its callbacks) before 'this' is deleted.
55 GetBackgroundSyncServicePtr()->Register(
56 mojo::ConvertTo
<SyncRegistrationPtr
>(*(optionsPtr
.get())),
57 service_worker_registration_id
, requested_from_service_worker
,
58 base::Bind(&BackgroundSyncProvider::RegisterCallback
,
59 base::Unretained(this), base::Passed(callbacksPtr
.Pass())));
62 void BackgroundSyncProvider::unregisterBackgroundSync(
63 blink::WebSyncRegistration::Periodicity periodicity
,
65 const blink::WebString
& tag
,
66 blink::WebServiceWorkerRegistration
* service_worker_registration
,
67 blink::WebSyncUnregistrationCallbacks
* callbacks
) {
68 DCHECK(service_worker_registration
);
70 int64 service_worker_registration_id
=
71 GetServiceWorkerRegistrationId(service_worker_registration
);
72 scoped_ptr
<blink::WebSyncUnregistrationCallbacks
> callbacksPtr(callbacks
);
74 // base::Unretained is safe here, as the mojo channel will be deleted (and
75 // will wipe its callbacks) before 'this' is deleted.
76 GetBackgroundSyncServicePtr()->Unregister(
77 mojo::ConvertTo
<BackgroundSyncPeriodicity
>(periodicity
), handle_id
,
78 service_worker_registration_id
,
79 base::Bind(&BackgroundSyncProvider::UnregisterCallback
,
80 base::Unretained(this), base::Passed(callbacksPtr
.Pass())));
83 void BackgroundSyncProvider::getRegistration(
84 blink::WebSyncRegistration::Periodicity periodicity
,
85 const blink::WebString
& tag
,
86 blink::WebServiceWorkerRegistration
* service_worker_registration
,
87 blink::WebSyncRegistrationCallbacks
* callbacks
) {
88 DCHECK(service_worker_registration
);
90 int64 service_worker_registration_id
=
91 GetServiceWorkerRegistrationId(service_worker_registration
);
92 scoped_ptr
<blink::WebSyncRegistrationCallbacks
> callbacksPtr(callbacks
);
94 // base::Unretained is safe here, as the mojo channel will be deleted (and
95 // will wipe its callbacks) before 'this' is deleted.
96 GetBackgroundSyncServicePtr()->GetRegistration(
97 mojo::ConvertTo
<BackgroundSyncPeriodicity
>(periodicity
), tag
.utf8(),
98 service_worker_registration_id
,
99 base::Bind(&BackgroundSyncProvider::GetRegistrationCallback
,
100 base::Unretained(this), base::Passed(callbacksPtr
.Pass())));
103 void BackgroundSyncProvider::getRegistrations(
104 blink::WebSyncRegistration::Periodicity periodicity
,
105 blink::WebServiceWorkerRegistration
* service_worker_registration
,
106 blink::WebSyncGetRegistrationsCallbacks
* callbacks
) {
107 DCHECK(service_worker_registration
);
109 int64 service_worker_registration_id
=
110 GetServiceWorkerRegistrationId(service_worker_registration
);
111 scoped_ptr
<blink::WebSyncGetRegistrationsCallbacks
> callbacksPtr(callbacks
);
113 // base::Unretained is safe here, as the mojo channel will be deleted (and
114 // will wipe its callbacks) before 'this' is deleted.
115 GetBackgroundSyncServicePtr()->GetRegistrations(
116 mojo::ConvertTo
<BackgroundSyncPeriodicity
>(periodicity
),
117 service_worker_registration_id
,
118 base::Bind(&BackgroundSyncProvider::GetRegistrationsCallback
,
119 base::Unretained(this), base::Passed(callbacksPtr
.Pass())));
122 void BackgroundSyncProvider::getPermissionStatus(
123 blink::WebSyncRegistration::Periodicity periodicity
,
124 blink::WebServiceWorkerRegistration
* service_worker_registration
,
125 blink::WebSyncGetPermissionStatusCallbacks
* callbacks
) {
126 DCHECK(service_worker_registration
);
128 int64 service_worker_registration_id
=
129 GetServiceWorkerRegistrationId(service_worker_registration
);
130 scoped_ptr
<blink::WebSyncGetPermissionStatusCallbacks
> callbacksPtr(
133 // base::Unretained is safe here, as the mojo channel will be deleted (and
134 // will wipe its callbacks) before 'this' is deleted.
135 GetBackgroundSyncServicePtr()->GetPermissionStatus(
136 mojo::ConvertTo
<BackgroundSyncPeriodicity
>(periodicity
),
137 service_worker_registration_id
,
138 base::Bind(&BackgroundSyncProvider::GetPermissionStatusCallback
,
139 base::Unretained(this), base::Passed(callbacksPtr
.Pass())));
142 void BackgroundSyncProvider::releaseRegistration(int64_t handle_id
) {
143 GetBackgroundSyncServicePtr()->ReleaseRegistration(handle_id
);
146 void BackgroundSyncProvider::DuplicateRegistrationHandle(
148 const BackgroundSyncService::DuplicateRegistrationHandleCallback
&
150 GetBackgroundSyncServicePtr()->DuplicateRegistrationHandle(handle_id
,
154 void BackgroundSyncProvider::RegisterCallback(
155 scoped_ptr
<blink::WebSyncRegistrationCallbacks
> callbacks
,
156 BackgroundSyncError error
,
157 const SyncRegistrationPtr
& options
) {
158 // TODO(iclelland): Determine the correct error message to return in each case
159 scoped_ptr
<blink::WebSyncRegistration
> result
;
161 case BACKGROUND_SYNC_ERROR_NONE
:
162 if (!options
.is_null())
164 mojo::ConvertTo
<scoped_ptr
<blink::WebSyncRegistration
>>(options
);
165 callbacks
->onSuccess(blink::adoptWebPtr(result
.release()));
167 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
170 case BACKGROUND_SYNC_ERROR_STORAGE
:
172 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
173 "Background Sync is disabled."));
175 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
176 callbacks
->onError(blink::WebSyncError(
177 blink::WebSyncError::ErrorTypeNoPermission
,
178 "Cannot register a sync event without a window client."));
180 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
182 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
183 "No service worker is active."));
188 void BackgroundSyncProvider::UnregisterCallback(
189 scoped_ptr
<blink::WebSyncUnregistrationCallbacks
> callbacks
,
190 BackgroundSyncError error
) {
191 // TODO(iclelland): Determine the correct error message to return in each case
193 case BACKGROUND_SYNC_ERROR_NONE
:
194 callbacks
->onSuccess(true);
196 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
197 callbacks
->onSuccess(false);
199 case BACKGROUND_SYNC_ERROR_STORAGE
:
201 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
202 "Background Sync is disabled."));
204 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
205 // This error should never be returned from
206 // BackgroundSyncManager::Unregister
209 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
211 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
212 "No service worker is active."));
217 void BackgroundSyncProvider::GetRegistrationCallback(
218 scoped_ptr
<blink::WebSyncRegistrationCallbacks
> callbacks
,
219 BackgroundSyncError error
,
220 const SyncRegistrationPtr
& options
) {
221 // TODO(iclelland): Determine the correct error message to return in each case
222 scoped_ptr
<blink::WebSyncRegistration
> result
;
224 case BACKGROUND_SYNC_ERROR_NONE
:
225 if (!options
.is_null())
227 mojo::ConvertTo
<scoped_ptr
<blink::WebSyncRegistration
>>(options
);
228 callbacks
->onSuccess(blink::adoptWebPtr(result
.release()));
230 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
231 callbacks
->onSuccess(nullptr);
233 case BACKGROUND_SYNC_ERROR_STORAGE
:
235 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
236 "Background Sync is disabled."));
238 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
239 // This error should never be returned from
240 // BackgroundSyncManager::GetRegistration
243 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
245 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
246 "No service worker is active."));
251 void BackgroundSyncProvider::GetRegistrationsCallback(
252 scoped_ptr
<blink::WebSyncGetRegistrationsCallbacks
> callbacks
,
253 BackgroundSyncError error
,
254 const mojo::Array
<SyncRegistrationPtr
>& registrations
) {
255 // TODO(iclelland): Determine the correct error message to return in each case
257 case BACKGROUND_SYNC_ERROR_NONE
: {
258 blink::WebVector
<blink::WebSyncRegistration
*> results(
259 registrations
.size());
260 for (size_t i
= 0; i
< registrations
.size(); ++i
) {
261 results
[i
] = mojo::ConvertTo
<scoped_ptr
<blink::WebSyncRegistration
>>(
265 callbacks
->onSuccess(results
);
268 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
269 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
270 // These errors should never be returned from
271 // BackgroundSyncManager::GetRegistrations
274 case BACKGROUND_SYNC_ERROR_STORAGE
:
276 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
277 "Background Sync is disabled."));
279 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
281 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
282 "No service worker is active."));
287 void BackgroundSyncProvider::GetPermissionStatusCallback(
288 scoped_ptr
<blink::WebSyncGetPermissionStatusCallbacks
> callbacks
,
289 BackgroundSyncError error
,
290 PermissionStatus status
) {
291 // TODO(iclelland): Determine the correct error message to return in each case
293 case BACKGROUND_SYNC_ERROR_NONE
:
295 case PERMISSION_STATUS_GRANTED
:
296 callbacks
->onSuccess(blink::WebSyncPermissionStatusGranted
);
298 case PERMISSION_STATUS_DENIED
:
299 callbacks
->onSuccess(blink::WebSyncPermissionStatusDenied
);
301 case PERMISSION_STATUS_ASK
:
302 callbacks
->onSuccess(blink::WebSyncPermissionStatusPrompt
);
306 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
307 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
308 // These errors should never be returned from
309 // BackgroundSyncManager::GetPermissionStatus
312 case BACKGROUND_SYNC_ERROR_STORAGE
:
314 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
315 "Background Sync is disabled."));
317 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
319 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
320 "No service worker is active."));
325 BackgroundSyncServicePtr
&
326 BackgroundSyncProvider::GetBackgroundSyncServicePtr() {
327 if (!background_sync_service_
.get()) {
328 service_registry_
->ConnectToRemoteService(
329 mojo::GetProxy(&background_sync_service_
));
331 return background_sync_service_
;
334 } // namespace content