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::notifyWhenDone(
148 blink::WebSyncNotifyWhenDoneCallbacks
* callbacks
) {
151 scoped_ptr
<blink::WebSyncNotifyWhenDoneCallbacks
> callbacks_ptr(callbacks
);
153 // base::Unretained is safe here, as the mojo channel will be deleted (and
154 // will wipe its callbacks) before 'this' is deleted.
155 GetBackgroundSyncServicePtr()->NotifyWhenDone(
157 base::Bind(&BackgroundSyncProvider::NotifyWhenDoneCallback
,
158 base::Unretained(this), base::Passed(callbacks_ptr
.Pass())));
161 void BackgroundSyncProvider::DuplicateRegistrationHandle(
163 const BackgroundSyncService::DuplicateRegistrationHandleCallback
&
165 GetBackgroundSyncServicePtr()->DuplicateRegistrationHandle(handle_id
,
169 void BackgroundSyncProvider::RegisterCallback(
170 scoped_ptr
<blink::WebSyncRegistrationCallbacks
> callbacks
,
171 BackgroundSyncError error
,
172 const SyncRegistrationPtr
& options
) {
173 // TODO(iclelland): Determine the correct error message to return in each case
174 scoped_ptr
<blink::WebSyncRegistration
> result
;
176 case BACKGROUND_SYNC_ERROR_NONE
:
177 if (!options
.is_null())
179 mojo::ConvertTo
<scoped_ptr
<blink::WebSyncRegistration
>>(options
);
180 callbacks
->onSuccess(blink::adoptWebPtr(result
.release()));
182 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
185 case BACKGROUND_SYNC_ERROR_STORAGE
:
187 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
188 "Background Sync is disabled."));
190 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
192 blink::WebSyncError(blink::WebSyncError::ErrorTypeNoPermission
,
193 "Attempted to register a sync event without a "
194 "window or registration tag too long."));
196 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
198 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
199 "No service worker is active."));
204 void BackgroundSyncProvider::UnregisterCallback(
205 scoped_ptr
<blink::WebSyncUnregistrationCallbacks
> callbacks
,
206 BackgroundSyncError error
) {
207 // TODO(iclelland): Determine the correct error message to return in each case
209 case BACKGROUND_SYNC_ERROR_NONE
:
210 callbacks
->onSuccess(true);
212 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
213 callbacks
->onSuccess(false);
215 case BACKGROUND_SYNC_ERROR_STORAGE
:
217 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
218 "Background Sync is disabled."));
220 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
221 // This error should never be returned from
222 // BackgroundSyncManager::Unregister
225 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
227 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
228 "No service worker is active."));
233 void BackgroundSyncProvider::GetRegistrationCallback(
234 scoped_ptr
<blink::WebSyncRegistrationCallbacks
> callbacks
,
235 BackgroundSyncError error
,
236 const SyncRegistrationPtr
& options
) {
237 // TODO(iclelland): Determine the correct error message to return in each case
238 scoped_ptr
<blink::WebSyncRegistration
> result
;
240 case BACKGROUND_SYNC_ERROR_NONE
:
241 if (!options
.is_null())
243 mojo::ConvertTo
<scoped_ptr
<blink::WebSyncRegistration
>>(options
);
244 callbacks
->onSuccess(blink::adoptWebPtr(result
.release()));
246 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
247 callbacks
->onSuccess(nullptr);
249 case BACKGROUND_SYNC_ERROR_STORAGE
:
251 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
252 "Background Sync is disabled."));
254 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
255 // This error should never be returned from
256 // BackgroundSyncManager::GetRegistration
259 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
261 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
262 "No service worker is active."));
267 void BackgroundSyncProvider::GetRegistrationsCallback(
268 scoped_ptr
<blink::WebSyncGetRegistrationsCallbacks
> callbacks
,
269 BackgroundSyncError error
,
270 const mojo::Array
<SyncRegistrationPtr
>& registrations
) {
271 // TODO(iclelland): Determine the correct error message to return in each case
273 case BACKGROUND_SYNC_ERROR_NONE
: {
274 blink::WebVector
<blink::WebSyncRegistration
*> results(
275 registrations
.size());
276 for (size_t i
= 0; i
< registrations
.size(); ++i
) {
277 results
[i
] = mojo::ConvertTo
<scoped_ptr
<blink::WebSyncRegistration
>>(
281 callbacks
->onSuccess(results
);
284 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
285 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
286 // These errors should never be returned from
287 // BackgroundSyncManager::GetRegistrations
290 case BACKGROUND_SYNC_ERROR_STORAGE
:
292 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
293 "Background Sync is disabled."));
295 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
297 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
298 "No service worker is active."));
303 void BackgroundSyncProvider::GetPermissionStatusCallback(
304 scoped_ptr
<blink::WebSyncGetPermissionStatusCallbacks
> callbacks
,
305 BackgroundSyncError error
,
306 PermissionStatus status
) {
307 // TODO(iclelland): Determine the correct error message to return in each case
309 case BACKGROUND_SYNC_ERROR_NONE
:
311 case PERMISSION_STATUS_GRANTED
:
312 callbacks
->onSuccess(blink::WebSyncPermissionStatusGranted
);
314 case PERMISSION_STATUS_DENIED
:
315 callbacks
->onSuccess(blink::WebSyncPermissionStatusDenied
);
317 case PERMISSION_STATUS_ASK
:
318 callbacks
->onSuccess(blink::WebSyncPermissionStatusPrompt
);
322 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
323 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
324 // These errors should never be returned from
325 // BackgroundSyncManager::GetPermissionStatus
328 case BACKGROUND_SYNC_ERROR_STORAGE
:
330 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
331 "Background Sync is disabled."));
333 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
335 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
336 "No service worker is active."));
341 void BackgroundSyncProvider::NotifyWhenDoneCallback(
342 scoped_ptr
<blink::WebSyncNotifyWhenDoneCallbacks
> callbacks
,
343 BackgroundSyncError error
,
344 BackgroundSyncState state
) {
346 case BACKGROUND_SYNC_ERROR_NONE
:
348 case BACKGROUND_SYNC_STATE_PENDING
:
349 case BACKGROUND_SYNC_STATE_FIRING
:
350 case BACKGROUND_SYNC_STATE_UNREGISTERED_WHILE_FIRING
:
353 case BACKGROUND_SYNC_STATE_SUCCESS
:
354 callbacks
->onSuccess(true);
356 case BACKGROUND_SYNC_STATE_FAILED
:
357 case BACKGROUND_SYNC_STATE_UNREGISTERED
:
358 callbacks
->onSuccess(false);
362 case BACKGROUND_SYNC_ERROR_NOT_FOUND
:
363 case BACKGROUND_SYNC_ERROR_NOT_ALLOWED
:
366 case BACKGROUND_SYNC_ERROR_STORAGE
:
368 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
369 "Background Sync is disabled."));
371 case BACKGROUND_SYNC_ERROR_NO_SERVICE_WORKER
:
373 blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown
,
374 "No service worker is active."));
379 BackgroundSyncServicePtr
&
380 BackgroundSyncProvider::GetBackgroundSyncServicePtr() {
381 if (!background_sync_service_
.get()) {
382 service_registry_
->ConnectToRemoteService(
383 mojo::GetProxy(&background_sync_service_
));
385 return background_sync_service_
;
388 } // namespace content