Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: content/browser/background_sync/background_sync_manager.cc

Issue 1048053002: [BackgroundSync] Handle storage failure (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@background_sync
Patch Set: Rebase Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/browser/background_sync/background_sync_manager.h" 5 #include "content/browser/background_sync/background_sync_manager.h"
6 6
7 #include "base/barrier_closure.h" 7 #include "base/barrier_closure.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "content/browser/background_sync/background_sync.pb.h" 9 #include "content/browser/background_sync/background_sync.pb.h"
10 #include "content/browser/service_worker/service_worker_context_wrapper.h" 10 #include "content/browser/service_worker/service_worker_context_wrapper.h"
(...skipping 28 matching lines...) Expand all
39 // static 39 // static
40 scoped_ptr<BackgroundSyncManager> BackgroundSyncManager::Create( 40 scoped_ptr<BackgroundSyncManager> BackgroundSyncManager::Create(
41 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) { 41 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) {
42 BackgroundSyncManager* sync_manager = 42 BackgroundSyncManager* sync_manager =
43 new BackgroundSyncManager(service_worker_context); 43 new BackgroundSyncManager(service_worker_context);
44 sync_manager->Init(); 44 sync_manager->Init();
45 return make_scoped_ptr(sync_manager); 45 return make_scoped_ptr(sync_manager);
46 } 46 }
47 47
48 BackgroundSyncManager::~BackgroundSyncManager() { 48 BackgroundSyncManager::~BackgroundSyncManager() {
49 service_worker_context_->RemoveObserver(this);
49 } 50 }
50 51
51 void BackgroundSyncManager::Register( 52 void BackgroundSyncManager::Register(
52 const GURL& origin, 53 const GURL& origin,
53 int64 sw_registration_id, 54 int64 sw_registration_id,
54 const BackgroundSyncRegistration& sync_registration, 55 const BackgroundSyncRegistration& sync_registration,
55 const StatusAndRegistrationCallback& callback) { 56 const StatusAndRegistrationCallback& callback) {
56 DCHECK_CURRENTLY_ON(BrowserThread::IO); 57 DCHECK_CURRENTLY_ON(BrowserThread::IO);
57 DCHECK_EQ(BackgroundSyncRegistration::kInvalidRegistrationId, 58 DCHECK_EQ(BackgroundSyncRegistration::kInvalidRegistrationId,
58 sync_registration.id); 59 sync_registration.id);
59 60
61 if (disabled_) {
62 base::MessageLoop::current()->PostTask(
63 FROM_HERE,
64 base::Bind(callback, ERROR_TYPE_STORAGE, BackgroundSyncRegistration()));
65 return;
66 }
67
60 StatusAndRegistrationCallback pending_callback = 68 StatusAndRegistrationCallback pending_callback =
61 base::Bind(&BackgroundSyncManager::PendingStatusAndRegistrationCallback, 69 base::Bind(&BackgroundSyncManager::PendingStatusAndRegistrationCallback,
62 weak_ptr_factory_.GetWeakPtr(), callback); 70 weak_ptr_factory_.GetWeakPtr(), callback);
63 71
64 op_scheduler_.ScheduleOperation(base::Bind( 72 op_scheduler_.ScheduleOperation(base::Bind(
65 &BackgroundSyncManager::RegisterImpl, weak_ptr_factory_.GetWeakPtr(), 73 &BackgroundSyncManager::RegisterImpl, weak_ptr_factory_.GetWeakPtr(),
66 origin, sw_registration_id, sync_registration, pending_callback)); 74 origin, sw_registration_id, sync_registration, pending_callback));
67 } 75 }
68 76
69 void BackgroundSyncManager::Unregister( 77 void BackgroundSyncManager::Unregister(
70 const GURL& origin, 78 const GURL& origin,
71 int64 sw_registration_id, 79 int64 sw_registration_id,
72 const std::string& sync_registration_name, 80 const std::string& sync_registration_name,
73 BackgroundSyncRegistration::RegistrationId sync_registration_id, 81 BackgroundSyncRegistration::RegistrationId sync_registration_id,
74 const StatusCallback& callback) { 82 const StatusCallback& callback) {
75 DCHECK_CURRENTLY_ON(BrowserThread::IO); 83 DCHECK_CURRENTLY_ON(BrowserThread::IO);
76 84
85 if (disabled_) {
86 base::MessageLoop::current()->PostTask(
87 FROM_HERE, base::Bind(callback, ERROR_TYPE_STORAGE));
88 return;
89 }
90
77 StatusCallback pending_callback = 91 StatusCallback pending_callback =
78 base::Bind(&BackgroundSyncManager::PendingStatusCallback, 92 base::Bind(&BackgroundSyncManager::PendingStatusCallback,
79 weak_ptr_factory_.GetWeakPtr(), callback); 93 weak_ptr_factory_.GetWeakPtr(), callback);
80 94
81 op_scheduler_.ScheduleOperation(base::Bind( 95 op_scheduler_.ScheduleOperation(base::Bind(
82 &BackgroundSyncManager::UnregisterImpl, weak_ptr_factory_.GetWeakPtr(), 96 &BackgroundSyncManager::UnregisterImpl, weak_ptr_factory_.GetWeakPtr(),
83 origin, sw_registration_id, sync_registration_name, sync_registration_id, 97 origin, sw_registration_id, sync_registration_name, sync_registration_id,
84 pending_callback)); 98 pending_callback));
85 } 99 }
86 100
87 void BackgroundSyncManager::GetRegistration( 101 void BackgroundSyncManager::GetRegistration(
88 const GURL& origin, 102 const GURL& origin,
89 int64 sw_registration_id, 103 int64 sw_registration_id,
90 const std::string sync_registration_name, 104 const std::string sync_registration_name,
91 const StatusAndRegistrationCallback& callback) { 105 const StatusAndRegistrationCallback& callback) {
92 DCHECK_CURRENTLY_ON(BrowserThread::IO); 106 DCHECK_CURRENTLY_ON(BrowserThread::IO);
93 107
108 if (disabled_) {
109 base::MessageLoop::current()->PostTask(
110 FROM_HERE,
111 base::Bind(callback, ERROR_TYPE_STORAGE, BackgroundSyncRegistration()));
112 return;
113 }
114
94 StatusAndRegistrationCallback pending_callback = 115 StatusAndRegistrationCallback pending_callback =
95 base::Bind(&BackgroundSyncManager::PendingStatusAndRegistrationCallback, 116 base::Bind(&BackgroundSyncManager::PendingStatusAndRegistrationCallback,
96 weak_ptr_factory_.GetWeakPtr(), callback); 117 weak_ptr_factory_.GetWeakPtr(), callback);
97 118
98 op_scheduler_.ScheduleOperation( 119 op_scheduler_.ScheduleOperation(
99 base::Bind(&BackgroundSyncManager::GetRegistrationImpl, 120 base::Bind(&BackgroundSyncManager::GetRegistrationImpl,
100 weak_ptr_factory_.GetWeakPtr(), origin, sw_registration_id, 121 weak_ptr_factory_.GetWeakPtr(), origin, sw_registration_id,
101 sync_registration_name, pending_callback)); 122 sync_registration_name, pending_callback));
102 } 123 }
103 124
125 void BackgroundSyncManager::OnRegistrationDeleted(int64 registration_id,
126 const GURL& pattern) {
127 DCHECK_CURRENTLY_ON(BrowserThread::IO);
128 base::Closure pending_callback =
jsbell 2015/04/01 21:54:54 Can you add a comment that this do-nothing callbac
jkarlin 2015/04/02 17:57:56 Nice suggestion. I made such functions for all of
michaeln 2015/04/02 23:06:20 Nice, those helpers help a lot.
129 base::Bind(&BackgroundSyncManager::PendingClosure,
130 weak_ptr_factory_.GetWeakPtr(), base::Bind(base::DoNothing));
131
132 // Operations already in the queue will either fail when they write to storage
133 // or return stale results based on registrations loaded in memory. This is
134 // inconsequential since the service worker is gone.
135 op_scheduler_.ScheduleOperation(base::Bind(
136 &BackgroundSyncManager::OnRegistrationDeletedImpl,
137 weak_ptr_factory_.GetWeakPtr(), registration_id, pending_callback));
138 }
139
140 void BackgroundSyncManager::OnStorageWiped() {
141 DCHECK_CURRENTLY_ON(BrowserThread::IO);
142 base::Closure pending_callback =
143 base::Bind(&BackgroundSyncManager::PendingClosure,
144 weak_ptr_factory_.GetWeakPtr(), base::Bind(base::DoNothing));
145
146 // Operations already in the queue will either fail when they write to storage
147 // or return stale results based on registrations loaded in memory. This is
148 // inconsequential since the service workers are gone.
149 op_scheduler_.ScheduleOperation(
150 base::Bind(&BackgroundSyncManager::OnStorageWipedImpl,
151 weak_ptr_factory_.GetWeakPtr(), pending_callback));
152 }
153
104 BackgroundSyncManager::BackgroundSyncManager( 154 BackgroundSyncManager::BackgroundSyncManager(
105 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) 155 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context)
106 : service_worker_context_(service_worker_context), weak_ptr_factory_(this) { 156 : service_worker_context_(service_worker_context),
157 disabled_(false),
158 weak_ptr_factory_(this) {
159 service_worker_context_->AddObserver(this);
107 } 160 }
108 161
109 void BackgroundSyncManager::Init() { 162 void BackgroundSyncManager::Init() {
110 DCHECK_CURRENTLY_ON(BrowserThread::IO); 163 DCHECK_CURRENTLY_ON(BrowserThread::IO);
111 DCHECK(!op_scheduler_.ScheduledOperations()); 164 DCHECK(!op_scheduler_.ScheduledOperations());
165 DCHECK(!disabled_);
166
167 base::Closure pending_callback =
168 base::Bind(&BackgroundSyncManager::PendingClosure,
169 weak_ptr_factory_.GetWeakPtr(), base::Bind(base::DoNothing));
112 170
113 op_scheduler_.ScheduleOperation(base::Bind(&BackgroundSyncManager::InitImpl, 171 op_scheduler_.ScheduleOperation(base::Bind(&BackgroundSyncManager::InitImpl,
114 weak_ptr_factory_.GetWeakPtr())); 172 weak_ptr_factory_.GetWeakPtr(),
173 pending_callback));
115 } 174 }
116 175
117 void BackgroundSyncManager::InitImpl() { 176 void BackgroundSyncManager::InitImpl(const base::Closure& callback) {
118 DCHECK_CURRENTLY_ON(BrowserThread::IO); 177 DCHECK_CURRENTLY_ON(BrowserThread::IO);
119 178
179 if (disabled_) {
180 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback));
181 return;
182 }
183
120 GetDataFromBackend( 184 GetDataFromBackend(
121 kBackgroundSyncUserDataKey, 185 kBackgroundSyncUserDataKey,
122 base::Bind(&BackgroundSyncManager::InitDidGetDataFromBackend, 186 base::Bind(&BackgroundSyncManager::InitDidGetDataFromBackend,
123 weak_ptr_factory_.GetWeakPtr())); 187 weak_ptr_factory_.GetWeakPtr(), callback));
124 } 188 }
125 189
126 void BackgroundSyncManager::InitDidGetDataFromBackend( 190 void BackgroundSyncManager::InitDidGetDataFromBackend(
191 const base::Closure& callback,
127 const std::vector<std::pair<int64, std::string>>& user_data, 192 const std::vector<std::pair<int64, std::string>>& user_data,
128 ServiceWorkerStatusCode status) { 193 ServiceWorkerStatusCode status) {
129 if (status != SERVICE_WORKER_OK && status != SERVICE_WORKER_ERROR_NOT_FOUND) 194 if (status != SERVICE_WORKER_OK && status != SERVICE_WORKER_ERROR_NOT_FOUND) {
130 LOG(ERROR) << "Background Sync Failed to load from backend."; 195 LOG(ERROR) << "BackgroundSync failed to init due to backend failure.";
196 DisableAndClearManager();
197 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback));
198 return;
199 }
131 200
132 bool corruption_detected = false; 201 bool corruption_detected = false;
133 for (const std::pair<int64, std::string>& data : user_data) { 202 for (const std::pair<int64, std::string>& data : user_data) {
134 BackgroundSyncRegistrationsProto registrations_proto; 203 BackgroundSyncRegistrationsProto registrations_proto;
135 if (registrations_proto.ParseFromString(data.second)) { 204 if (registrations_proto.ParseFromString(data.second)) {
136 sw_to_registrations_map_[data.first] = BackgroundSyncRegistrations( 205 sw_to_registrations_map_[data.first] = BackgroundSyncRegistrations(
137 registrations_proto.next_registration_id()); 206 registrations_proto.next_registration_id());
138 BackgroundSyncRegistrations* registrations = 207 BackgroundSyncRegistrations* registrations =
139 &sw_to_registrations_map_[data.first]; 208 &sw_to_registrations_map_[data.first];
140 209
(...skipping 15 matching lines...) Expand all
156 registration; 225 registration;
157 } 226 }
158 } 227 }
159 228
160 if (corruption_detected) 229 if (corruption_detected)
161 break; 230 break;
162 } 231 }
163 232
164 if (corruption_detected) { 233 if (corruption_detected) {
165 LOG(ERROR) << "Corruption detected in background sync backend"; 234 LOG(ERROR) << "Corruption detected in background sync backend";
166 sw_to_registrations_map_.clear(); 235 DisableAndClearManager();
167 } 236 }
168 237
169 // TODO(jkarlin): Call the scheduling algorithm here. 238 // TODO(jkarlin): Call the scheduling algorithm here.
170 239
171 op_scheduler_.CompleteOperationAndRunNext(); 240 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback));
172 } 241 }
173 242
174 void BackgroundSyncManager::RegisterImpl( 243 void BackgroundSyncManager::RegisterImpl(
175 const GURL& origin, 244 const GURL& origin,
176 int64 sw_registration_id, 245 int64 sw_registration_id,
177 const BackgroundSyncRegistration& sync_registration, 246 const BackgroundSyncRegistration& sync_registration,
178 const StatusAndRegistrationCallback& callback) { 247 const StatusAndRegistrationCallback& callback) {
248 if (disabled_) {
249 base::MessageLoop::current()->PostTask(
250 FROM_HERE,
251 base::Bind(callback, ERROR_TYPE_STORAGE, BackgroundSyncRegistration()));
252 return;
253 }
254
179 BackgroundSyncRegistration existing_registration; 255 BackgroundSyncRegistration existing_registration;
180 if (LookupRegistration(sw_registration_id, sync_registration.name, 256 if (LookupRegistration(sw_registration_id, sync_registration.name,
181 &existing_registration)) { 257 &existing_registration)) {
182 if (existing_registration.Equals(sync_registration)) { 258 if (existing_registration.Equals(sync_registration)) {
183 base::MessageLoop::current()->PostTask( 259 base::MessageLoop::current()->PostTask(
184 FROM_HERE, 260 FROM_HERE,
185 base::Bind(callback, ERROR_TYPE_OK, existing_registration)); 261 base::Bind(callback, ERROR_TYPE_OK, existing_registration));
186 return; 262 return;
187 } 263 }
188 } 264 }
189 265
190 BackgroundSyncRegistration new_registration = sync_registration; 266 BackgroundSyncRegistration new_registration = sync_registration;
191 BackgroundSyncRegistrations* registrations = 267 BackgroundSyncRegistrations* registrations =
192 &sw_to_registrations_map_[sw_registration_id]; 268 &sw_to_registrations_map_[sw_registration_id];
193 new_registration.id = registrations->next_id++; 269 new_registration.id = registrations->next_id++;
194 270
195 AddRegistrationToMap(sw_registration_id, new_registration); 271 AddRegistrationToMap(sw_registration_id, new_registration);
196 272
197 StoreRegistrations( 273 StoreRegistrations(
198 origin, sw_registration_id, 274 origin, sw_registration_id,
199 base::Bind(&BackgroundSyncManager::RegisterDidStore, 275 base::Bind(&BackgroundSyncManager::RegisterDidStore,
200 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, 276 weak_ptr_factory_.GetWeakPtr(), sw_registration_id,
201 new_registration, existing_registration, callback)); 277 new_registration, callback));
278 }
279
280 void BackgroundSyncManager::DisableAndClearManager() {
281 disabled_ = true;
282 base::Closure pending_callback =
283 base::Bind(&BackgroundSyncManager::PendingClosure,
284 weak_ptr_factory_.GetWeakPtr(), base::Bind(base::DoNothing));
285
286 op_scheduler_.ScheduleOperation(
287 base::Bind(&BackgroundSyncManager::DisableAndClearManagerImpl,
288 weak_ptr_factory_.GetWeakPtr(), pending_callback));
289 }
290
291 void BackgroundSyncManager::DisableAndClearManagerImpl(
jsbell 2015/04/01 21:54:54 Out of curiosity, are there any relevant "I'm runn
jkarlin 2015/04/02 17:57:56 There is a check that an operation is currently ru
jsbell 2015/04/02 20:25:13 sgtm
292 const base::Closure& callback) {
293 DCHECK(disabled_);
michaeln 2015/04/01 21:37:30 Can BackgroundSyncManager::OnStorageWipedImpl happ
jkarlin 2015/04/02 17:57:56 Yes, there is a race on disabled_ if DisableAndCle
michaeln 2015/04/02 23:06:20 yup, that works!
294
295 sw_to_registrations_map_.clear();
296
297 // Delete all backend entries. The memory representation of registered syncs
298 // may be corrupt so reload the registrations from storage again.
jsbell 2015/04/01 21:54:54 Maybe clarify in the comment why memory is "corrup
jkarlin 2015/04/02 17:57:56 Done.
299 GetDataFromBackend(
300 kBackgroundSyncUserDataKey,
301 base::Bind(&BackgroundSyncManager::DisableAndClearDidGetRegistrations,
302 weak_ptr_factory_.GetWeakPtr(), callback));
303 }
304
305 void BackgroundSyncManager::DisableAndClearDidGetRegistrations(
306 const base::Closure& callback,
307 const std::vector<std::pair<int64, std::string>>& user_data,
308 ServiceWorkerStatusCode status) {
309 if (status != SERVICE_WORKER_OK || user_data.empty()) {
310 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback));
311 return;
312 }
313
314 base::Closure barrier_closure =
315 base::BarrierClosure(user_data.size(), base::Bind(callback));
316
317 for (const auto& sw_id_and_regs : user_data) {
318 service_worker_context_->context()->storage()->ClearUserData(
319 sw_id_and_regs.first, kBackgroundSyncUserDataKey,
320 base::Bind(&BackgroundSyncManager::DisableAndClearManagerClearedOne,
321 weak_ptr_factory_.GetWeakPtr(), barrier_closure));
322 }
323 }
324
325 void BackgroundSyncManager::DisableAndClearManagerClearedOne(
326 const base::Closure& barrier_closure,
327 ServiceWorkerStatusCode status) {
328 // The status doesn't matter at this point, there is nothing else to be done.
329 base::MessageLoop::current()->PostTask(FROM_HERE,
330 base::Bind(barrier_closure));
202 } 331 }
203 332
204 bool BackgroundSyncManager::LookupRegistration( 333 bool BackgroundSyncManager::LookupRegistration(
205 int64 sw_registration_id, 334 int64 sw_registration_id,
206 const std::string& sync_registration_name, 335 const std::string& sync_registration_name,
207 BackgroundSyncRegistration* existing_registration) { 336 BackgroundSyncRegistration* existing_registration) {
208 SWIdToRegistrationsMap::iterator it = 337 SWIdToRegistrationsMap::iterator it =
209 sw_to_registrations_map_.find(sw_registration_id); 338 sw_to_registrations_map_.find(sw_registration_id);
210 if (it == sw_to_registrations_map_.end()) 339 if (it == sw_to_registrations_map_.end())
211 return false; 340 return false;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 bool success = registrations_proto.SerializeToString(&serialized); 377 bool success = registrations_proto.SerializeToString(&serialized);
249 DCHECK(success); 378 DCHECK(success);
250 379
251 StoreDataInBackend(sw_registration_id, origin, kBackgroundSyncUserDataKey, 380 StoreDataInBackend(sw_registration_id, origin, kBackgroundSyncUserDataKey,
252 serialized, callback); 381 serialized, callback);
253 } 382 }
254 383
255 void BackgroundSyncManager::RegisterDidStore( 384 void BackgroundSyncManager::RegisterDidStore(
256 int64 sw_registration_id, 385 int64 sw_registration_id,
257 const BackgroundSyncRegistration& new_registration, 386 const BackgroundSyncRegistration& new_registration,
258 const BackgroundSyncRegistration& previous_registration,
259 const StatusAndRegistrationCallback& callback, 387 const StatusAndRegistrationCallback& callback,
260 ServiceWorkerStatusCode status) { 388 ServiceWorkerStatusCode status) {
261 if (status != SERVICE_WORKER_OK) { 389 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) {
262 // Restore the previous state. 390 // The registration is gone.
263 if (previous_registration.id != 391 sw_to_registrations_map_.erase(sw_registration_id);
264 BackgroundSyncRegistration::kInvalidRegistrationId) {
265 AddRegistrationToMap(sw_registration_id, previous_registration);
266 } else {
267 RemoveRegistrationFromMap(sw_registration_id, new_registration.name,
268 nullptr);
269 }
270 base::MessageLoop::current()->PostTask( 392 base::MessageLoop::current()->PostTask(
271 FROM_HERE, 393 FROM_HERE,
272 base::Bind(callback, ERROR_TYPE_STORAGE, BackgroundSyncRegistration())); 394 base::Bind(callback, ERROR_TYPE_STORAGE, BackgroundSyncRegistration()));
395 return;
396 }
397
398 if (status != SERVICE_WORKER_OK) {
399 LOG(ERROR) << "BackgroundSync failed to store registration due to backend "
400 "failure.";
401 DisableAndClearManager();
402 base::MessageLoop::current()->PostTask(
403 FROM_HERE,
404 base::Bind(callback, ERROR_TYPE_STORAGE, BackgroundSyncRegistration()));
273 return; 405 return;
274 } 406 }
275 407
276 // TODO(jkarlin): Run the registration algorithm. 408 // TODO(jkarlin): Run the registration algorithm.
277 base::MessageLoop::current()->PostTask( 409 base::MessageLoop::current()->PostTask(
278 FROM_HERE, base::Bind(callback, ERROR_TYPE_OK, new_registration)); 410 FROM_HERE, base::Bind(callback, ERROR_TYPE_OK, new_registration));
279 } 411 }
280 412
281 void BackgroundSyncManager::RemoveRegistrationFromMap( 413 void BackgroundSyncManager::RemoveRegistrationFromMap(
282 int64 sw_registration_id, 414 int64 sw_registration_id,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 service_worker_context_->context()->storage()->GetUserDataForAllRegistrations( 459 service_worker_context_->context()->storage()->GetUserDataForAllRegistrations(
328 key, callback); 460 key, callback);
329 } 461 }
330 462
331 void BackgroundSyncManager::UnregisterImpl( 463 void BackgroundSyncManager::UnregisterImpl(
332 const GURL& origin, 464 const GURL& origin,
333 int64 sw_registration_id, 465 int64 sw_registration_id,
334 const std::string& sync_registration_name, 466 const std::string& sync_registration_name,
335 BackgroundSyncRegistration::RegistrationId sync_registration_id, 467 BackgroundSyncRegistration::RegistrationId sync_registration_id,
336 const StatusCallback& callback) { 468 const StatusCallback& callback) {
469 if (disabled_) {
470 base::MessageLoop::current()->PostTask(
471 FROM_HERE, base::Bind(callback, ERROR_TYPE_STORAGE));
472 return;
473 }
474
337 BackgroundSyncRegistration existing_registration; 475 BackgroundSyncRegistration existing_registration;
338 if (!LookupRegistration(sw_registration_id, sync_registration_name, 476 if (!LookupRegistration(sw_registration_id, sync_registration_name,
339 &existing_registration) || 477 &existing_registration) ||
340 existing_registration.id != sync_registration_id) { 478 existing_registration.id != sync_registration_id) {
341 base::MessageLoop::current()->PostTask( 479 base::MessageLoop::current()->PostTask(
342 FROM_HERE, base::Bind(callback, ERROR_TYPE_NOT_FOUND)); 480 FROM_HERE, base::Bind(callback, ERROR_TYPE_NOT_FOUND));
343 return; 481 return;
344 } 482 }
345 483
346 BackgroundSyncRegistration old_sync_registration; 484 BackgroundSyncRegistration old_sync_registration;
347 RemoveRegistrationFromMap(sw_registration_id, sync_registration_name, 485 RemoveRegistrationFromMap(sw_registration_id, sync_registration_name,
348 &old_sync_registration); 486 &old_sync_registration);
349 487
350 StoreRegistrations( 488 StoreRegistrations(
351 origin, sw_registration_id, 489 origin, sw_registration_id,
352 base::Bind(&BackgroundSyncManager::UnregisterDidStore, 490 base::Bind(&BackgroundSyncManager::UnregisterDidStore,
353 weak_ptr_factory_.GetWeakPtr(), sw_registration_id, 491 weak_ptr_factory_.GetWeakPtr(), sw_registration_id,
354 old_sync_registration, callback)); 492 old_sync_registration, callback));
355 } 493 }
356 494
357 void BackgroundSyncManager::UnregisterDidStore( 495 void BackgroundSyncManager::UnregisterDidStore(
358 int64 sw_registration_id, 496 int64 sw_registration_id,
359 const BackgroundSyncRegistration& old_sync_registration, 497 const BackgroundSyncRegistration& old_sync_registration,
360 const StatusCallback& callback, 498 const StatusCallback& callback,
361 ServiceWorkerStatusCode status) { 499 ServiceWorkerStatusCode status) {
362 if (status != SERVICE_WORKER_OK) { 500 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) {
363 // Restore the previous state. 501 // ServiceWorker was unregistered.
364 AddRegistrationToMap(sw_registration_id, old_sync_registration); 502 sw_to_registrations_map_.erase(sw_registration_id);
365 base::MessageLoop::current()->PostTask( 503 base::MessageLoop::current()->PostTask(
366 FROM_HERE, base::Bind(callback, ERROR_TYPE_STORAGE)); 504 FROM_HERE, base::Bind(callback, ERROR_TYPE_STORAGE));
367 return; 505 return;
506 }
507
508 if (status != SERVICE_WORKER_OK) {
509 LOG(ERROR) << "BackgroundSync failed to unregister due to backend failure.";
510 DisableAndClearManager();
511 base::MessageLoop::current()->PostTask(
512 FROM_HERE, base::Bind(callback, ERROR_TYPE_STORAGE));
513 return;
368 } 514 }
369 515
370 // TODO(jkarlin): Run the registration algorithm. 516 // TODO(jkarlin): Run the registration algorithm.
371 base::MessageLoop::current()->PostTask(FROM_HERE, 517 base::MessageLoop::current()->PostTask(FROM_HERE,
372 base::Bind(callback, ERROR_TYPE_OK)); 518 base::Bind(callback, ERROR_TYPE_OK));
373 } 519 }
374 520
375 void BackgroundSyncManager::GetRegistrationImpl( 521 void BackgroundSyncManager::GetRegistrationImpl(
376 const GURL& origin, 522 const GURL& origin,
377 int64 sw_registration_id, 523 int64 sw_registration_id,
378 const std::string sync_registration_name, 524 const std::string sync_registration_name,
379 const StatusAndRegistrationCallback& callback) { 525 const StatusAndRegistrationCallback& callback) {
526 if (disabled_) {
527 base::MessageLoop::current()->PostTask(
528 FROM_HERE,
529 base::Bind(callback, ERROR_TYPE_STORAGE, BackgroundSyncRegistration()));
530 return;
531 }
532
380 BackgroundSyncRegistration out_registration; 533 BackgroundSyncRegistration out_registration;
381 if (!LookupRegistration(sw_registration_id, sync_registration_name, 534 if (!LookupRegistration(sw_registration_id, sync_registration_name,
382 &out_registration)) { 535 &out_registration)) {
383 base::MessageLoop::current()->PostTask( 536 base::MessageLoop::current()->PostTask(
384 FROM_HERE, base::Bind(callback, ERROR_TYPE_NOT_FOUND, 537 FROM_HERE, base::Bind(callback, ERROR_TYPE_NOT_FOUND,
385 BackgroundSyncRegistration())); 538 BackgroundSyncRegistration()));
386 return; 539 return;
387 } 540 }
388 541
389 base::MessageLoop::current()->PostTask( 542 base::MessageLoop::current()->PostTask(
390 FROM_HERE, base::Bind(callback, ERROR_TYPE_OK, out_registration)); 543 FROM_HERE, base::Bind(callback, ERROR_TYPE_OK, out_registration));
391 } 544 }
392 545
546 void BackgroundSyncManager::OnRegistrationDeletedImpl(
547 int64 registration_id,
548 const base::Closure& callback) {
549 // The backend (ServiceWorkerStorage) will delete the data, so just delete the
550 // memory representation here.
551 sw_to_registrations_map_.erase(registration_id);
552 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback));
553 }
554
555 void BackgroundSyncManager::OnStorageWipedImpl(const base::Closure& callback) {
556 sw_to_registrations_map_.clear();
557 disabled_ = false;
michaeln 2015/04/01 21:37:30 would it make sense to schedule an op to reinit?
jkarlin 2015/04/02 17:57:56 Scheduling the op might allow some new requests to
558 InitImpl(callback);
559 }
560
393 void BackgroundSyncManager::PendingStatusAndRegistrationCallback( 561 void BackgroundSyncManager::PendingStatusAndRegistrationCallback(
394 const StatusAndRegistrationCallback& callback, 562 const StatusAndRegistrationCallback& callback,
395 ErrorType error, 563 ErrorType error,
396 const BackgroundSyncRegistration& sync_registration) { 564 const BackgroundSyncRegistration& sync_registration) {
397 // The callback might delete this object, so hang onto a weak ptr to find out. 565 // The callback might delete this object, so hang onto a weak ptr to find out.
398 base::WeakPtr<BackgroundSyncManager> manager = weak_ptr_factory_.GetWeakPtr(); 566 base::WeakPtr<BackgroundSyncManager> manager = weak_ptr_factory_.GetWeakPtr();
399 callback.Run(error, sync_registration); 567 callback.Run(error, sync_registration);
400 if (manager) 568 if (manager)
401 op_scheduler_.CompleteOperationAndRunNext(); 569 op_scheduler_.CompleteOperationAndRunNext();
402 } 570 }
403 571
404 void BackgroundSyncManager::PendingStatusCallback( 572 void BackgroundSyncManager::PendingStatusCallback(
405 const StatusCallback& callback, 573 const StatusCallback& callback,
406 ErrorType error) { 574 ErrorType error) {
407 // The callback might delete this object, so hang onto a weak ptr to find out. 575 // The callback might delete this object, so hang onto a weak ptr to find out.
408 base::WeakPtr<BackgroundSyncManager> manager = weak_ptr_factory_.GetWeakPtr(); 576 base::WeakPtr<BackgroundSyncManager> manager = weak_ptr_factory_.GetWeakPtr();
409 callback.Run(error); 577 callback.Run(error);
410 if (manager) 578 if (manager)
411 op_scheduler_.CompleteOperationAndRunNext(); 579 op_scheduler_.CompleteOperationAndRunNext();
412 } 580 }
413 581
582 void BackgroundSyncManager::PendingClosure(const base::Closure& callback) {
583 // The callback might delete this object, so hang onto a weak ptr to find out.
584 base::WeakPtr<BackgroundSyncManager> manager = weak_ptr_factory_.GetWeakPtr();
585 callback.Run();
586 if (manager)
587 op_scheduler_.CompleteOperationAndRunNext();
588 }
589
414 } // namespace content 590 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698