| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/service_worker/service_worker_storage.h" | 5 #include "content/browser/service_worker/service_worker_storage.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 11 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
| 12 #include "base/hash.h" | 12 #include "base/hash.h" |
| 13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
| 14 #include "base/sequenced_task_runner.h" | 14 #include "base/sequenced_task_runner.h" |
| 15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 16 #include "base/task_runner_util.h" | 16 #include "base/task_runner_util.h" |
| 17 #include "content/browser/service_worker/service_worker_context_core.h" | 17 #include "content/browser/service_worker/service_worker_context_core.h" |
| 18 #include "content/browser/service_worker/service_worker_disk_cache.h" | 18 #include "content/browser/service_worker/service_worker_disk_cache.h" |
| 19 #include "content/browser/service_worker/service_worker_info.h" | 19 #include "content/browser/service_worker/service_worker_info.h" |
| 20 #include "content/browser/service_worker/service_worker_metrics.h" | 20 #include "content/browser/service_worker/service_worker_metrics.h" |
| 21 #include "content/browser/service_worker/service_worker_registration.h" | 21 #include "content/browser/service_worker/service_worker_registration.h" |
| 22 #include "content/browser/service_worker/service_worker_utils.h" | 22 #include "content/browser/service_worker/service_worker_utils.h" |
| 23 #include "content/browser/service_worker/service_worker_version.h" | 23 #include "content/browser/service_worker/service_worker_version.h" |
| 24 #include "content/common/service_worker/service_worker_types.h" | 24 #include "content/common/service_worker/service_worker_types.h" |
| 25 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
| 26 #include "net/base/completion_callback.h" | 26 #include "net/base/completion_callback.h" |
| 27 #include "net/base/io_buffer.h" | 27 #include "net/base/io_buffer.h" |
| 28 #include "net/base/net_errors.h" | 28 #include "net/base/net_errors.h" |
| 29 #include "storage/browser/quota/quota_manager_proxy.h" | 29 #include "storage/browser/quota/quota_manager_proxy.h" |
| 30 #include "storage/browser/quota/special_storage_policy.h" |
| 30 | 31 |
| 31 namespace content { | 32 namespace content { |
| 32 | 33 |
| 33 namespace { | 34 namespace { |
| 34 | 35 |
| 35 void RunSoon(const tracked_objects::Location& from_here, | 36 void RunSoon(const tracked_objects::Location& from_here, |
| 36 const base::Closure& closure) { | 37 const base::Closure& closure) { |
| 37 base::MessageLoop::current()->PostTask(from_here, closure); | 38 base::MessageLoop::current()->PostTask(from_here, closure); |
| 38 } | 39 } |
| 39 | 40 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 ServiceWorkerStorage:: | 212 ServiceWorkerStorage:: |
| 212 DidDeleteRegistrationParams::DidDeleteRegistrationParams() | 213 DidDeleteRegistrationParams::DidDeleteRegistrationParams() |
| 213 : registration_id(kInvalidServiceWorkerRegistrationId) { | 214 : registration_id(kInvalidServiceWorkerRegistrationId) { |
| 214 } | 215 } |
| 215 | 216 |
| 216 ServiceWorkerStorage:: | 217 ServiceWorkerStorage:: |
| 217 DidDeleteRegistrationParams::~DidDeleteRegistrationParams() { | 218 DidDeleteRegistrationParams::~DidDeleteRegistrationParams() { |
| 218 } | 219 } |
| 219 | 220 |
| 220 ServiceWorkerStorage::~ServiceWorkerStorage() { | 221 ServiceWorkerStorage::~ServiceWorkerStorage() { |
| 222 ClearSessionOnlyOrigins(); |
| 221 weak_factory_.InvalidateWeakPtrs(); | 223 weak_factory_.InvalidateWeakPtrs(); |
| 222 database_task_runner_->DeleteSoon(FROM_HERE, database_.release()); | 224 database_task_manager_->GetTaskRunner()->DeleteSoon(FROM_HERE, |
| 225 database_.release()); |
| 223 } | 226 } |
| 224 | 227 |
| 225 // static | 228 // static |
| 226 scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( | 229 scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
| 227 const base::FilePath& path, | 230 const base::FilePath& path, |
| 228 base::WeakPtr<ServiceWorkerContextCore> context, | 231 base::WeakPtr<ServiceWorkerContextCore> context, |
| 229 const scoped_refptr<base::SequencedTaskRunner>& database_task_runner, | 232 scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager, |
| 230 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, | 233 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, |
| 231 storage::QuotaManagerProxy* quota_manager_proxy) { | 234 storage::QuotaManagerProxy* quota_manager_proxy, |
| 235 storage::SpecialStoragePolicy* special_storage_policy) { |
| 232 return make_scoped_ptr(new ServiceWorkerStorage(path, | 236 return make_scoped_ptr(new ServiceWorkerStorage(path, |
| 233 context, | 237 context, |
| 234 database_task_runner, | 238 database_task_manager.Pass(), |
| 235 disk_cache_thread, | 239 disk_cache_thread, |
| 236 quota_manager_proxy)); | 240 quota_manager_proxy, |
| 241 special_storage_policy)); |
| 237 } | 242 } |
| 238 | 243 |
| 239 // static | 244 // static |
| 240 scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( | 245 scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
| 241 base::WeakPtr<ServiceWorkerContextCore> context, | 246 base::WeakPtr<ServiceWorkerContextCore> context, |
| 242 ServiceWorkerStorage* old_storage) { | 247 ServiceWorkerStorage* old_storage) { |
| 243 return make_scoped_ptr( | 248 return make_scoped_ptr( |
| 244 new ServiceWorkerStorage(old_storage->path_, | 249 new ServiceWorkerStorage(old_storage->path_, |
| 245 context, | 250 context, |
| 246 old_storage->database_task_runner_, | 251 old_storage->database_task_manager_->Clone(), |
| 247 old_storage->disk_cache_thread_, | 252 old_storage->disk_cache_thread_, |
| 248 old_storage->quota_manager_proxy_.get())); | 253 old_storage->quota_manager_proxy_.get(), |
| 254 old_storage->special_storage_policy_.get())); |
| 249 } | 255 } |
| 250 | 256 |
| 251 void ServiceWorkerStorage::FindRegistrationForDocument( | 257 void ServiceWorkerStorage::FindRegistrationForDocument( |
| 252 const GURL& document_url, | 258 const GURL& document_url, |
| 253 const FindRegistrationCallback& callback) { | 259 const FindRegistrationCallback& callback) { |
| 254 DCHECK(!document_url.has_ref()); | 260 DCHECK(!document_url.has_ref()); |
| 255 if (!LazyInitialize(base::Bind( | 261 if (!LazyInitialize(base::Bind( |
| 256 &ServiceWorkerStorage::FindRegistrationForDocument, | 262 &ServiceWorkerStorage::FindRegistrationForDocument, |
| 257 weak_factory_.GetWeakPtr(), document_url, callback))) { | 263 weak_factory_.GetWeakPtr(), document_url, callback))) { |
| 258 if (state_ != INITIALIZING || !context_) { | 264 if (state_ != INITIALIZING || !context_) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 288 } | 294 } |
| 289 | 295 |
| 290 // To connect this TRACE_EVENT with the callback, TimeTicks is used for | 296 // To connect this TRACE_EVENT with the callback, TimeTicks is used for |
| 291 // callback id. | 297 // callback id. |
| 292 int64 callback_id = base::TimeTicks::Now().ToInternalValue(); | 298 int64 callback_id = base::TimeTicks::Now().ToInternalValue(); |
| 293 TRACE_EVENT_ASYNC_BEGIN1( | 299 TRACE_EVENT_ASYNC_BEGIN1( |
| 294 "ServiceWorker", | 300 "ServiceWorker", |
| 295 "ServiceWorkerStorage::FindRegistrationForDocument", | 301 "ServiceWorkerStorage::FindRegistrationForDocument", |
| 296 callback_id, | 302 callback_id, |
| 297 "URL", document_url.spec()); | 303 "URL", document_url.spec()); |
| 298 database_task_runner_->PostTask( | 304 database_task_manager_->GetTaskRunner()->PostTask( |
| 299 FROM_HERE, | 305 FROM_HERE, |
| 300 base::Bind( | 306 base::Bind( |
| 301 &FindForDocumentInDB, | 307 &FindForDocumentInDB, |
| 302 database_.get(), | 308 database_.get(), |
| 303 base::MessageLoopProxy::current(), | 309 base::MessageLoopProxy::current(), |
| 304 document_url, | 310 document_url, |
| 305 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForDocument, | 311 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForDocument, |
| 306 weak_factory_.GetWeakPtr(), | 312 weak_factory_.GetWeakPtr(), |
| 307 document_url, | 313 document_url, |
| 308 callback, | 314 callback, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 330 FindInstallingRegistrationForPattern(scope); | 336 FindInstallingRegistrationForPattern(scope); |
| 331 CompleteFindSoon(FROM_HERE, | 337 CompleteFindSoon(FROM_HERE, |
| 332 installing_registration, | 338 installing_registration, |
| 333 installing_registration.get() | 339 installing_registration.get() |
| 334 ? SERVICE_WORKER_OK | 340 ? SERVICE_WORKER_OK |
| 335 : SERVICE_WORKER_ERROR_NOT_FOUND, | 341 : SERVICE_WORKER_ERROR_NOT_FOUND, |
| 336 callback); | 342 callback); |
| 337 return; | 343 return; |
| 338 } | 344 } |
| 339 | 345 |
| 340 database_task_runner_->PostTask( | 346 database_task_manager_->GetTaskRunner()->PostTask( |
| 341 FROM_HERE, | 347 FROM_HERE, |
| 342 base::Bind( | 348 base::Bind( |
| 343 &FindForPatternInDB, | 349 &FindForPatternInDB, |
| 344 database_.get(), | 350 database_.get(), |
| 345 base::MessageLoopProxy::current(), | 351 base::MessageLoopProxy::current(), |
| 346 scope, | 352 scope, |
| 347 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForPattern, | 353 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForPattern, |
| 348 weak_factory_.GetWeakPtr(), scope, callback))); | 354 weak_factory_.GetWeakPtr(), scope, callback))); |
| 349 } | 355 } |
| 350 | 356 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 return; | 398 return; |
| 393 } | 399 } |
| 394 | 400 |
| 395 scoped_refptr<ServiceWorkerRegistration> registration = | 401 scoped_refptr<ServiceWorkerRegistration> registration = |
| 396 context_->GetLiveRegistration(registration_id); | 402 context_->GetLiveRegistration(registration_id); |
| 397 if (registration.get()) { | 403 if (registration.get()) { |
| 398 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); | 404 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); |
| 399 return; | 405 return; |
| 400 } | 406 } |
| 401 | 407 |
| 402 database_task_runner_->PostTask( | 408 database_task_manager_->GetTaskRunner()->PostTask( |
| 403 FROM_HERE, | 409 FROM_HERE, |
| 404 base::Bind(&FindForIdInDB, | 410 base::Bind(&FindForIdInDB, |
| 405 database_.get(), | 411 database_.get(), |
| 406 base::MessageLoopProxy::current(), | 412 base::MessageLoopProxy::current(), |
| 407 registration_id, origin, | 413 registration_id, origin, |
| 408 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForId, | 414 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForId, |
| 409 weak_factory_.GetWeakPtr(), callback))); | 415 weak_factory_.GetWeakPtr(), callback))); |
| 410 } | 416 } |
| 411 | 417 |
| 412 void ServiceWorkerStorage::GetAllRegistrations( | 418 void ServiceWorkerStorage::GetAllRegistrations( |
| 413 const GetAllRegistrationInfosCallback& callback) { | 419 const GetAllRegistrationInfosCallback& callback) { |
| 414 if (!LazyInitialize(base::Bind( | 420 if (!LazyInitialize(base::Bind( |
| 415 &ServiceWorkerStorage::GetAllRegistrations, | 421 &ServiceWorkerStorage::GetAllRegistrations, |
| 416 weak_factory_.GetWeakPtr(), callback))) { | 422 weak_factory_.GetWeakPtr(), callback))) { |
| 417 if (state_ != INITIALIZING || !context_) { | 423 if (state_ != INITIALIZING || !context_) { |
| 418 RunSoon(FROM_HERE, base::Bind( | 424 RunSoon(FROM_HERE, base::Bind( |
| 419 callback, std::vector<ServiceWorkerRegistrationInfo>())); | 425 callback, std::vector<ServiceWorkerRegistrationInfo>())); |
| 420 } | 426 } |
| 421 return; | 427 return; |
| 422 } | 428 } |
| 423 DCHECK_EQ(INITIALIZED, state_); | 429 DCHECK_EQ(INITIALIZED, state_); |
| 424 | 430 |
| 425 RegistrationList* registrations = new RegistrationList; | 431 RegistrationList* registrations = new RegistrationList; |
| 426 PostTaskAndReplyWithResult( | 432 PostTaskAndReplyWithResult( |
| 427 database_task_runner_.get(), | 433 database_task_manager_->GetTaskRunner(), |
| 428 FROM_HERE, | 434 FROM_HERE, |
| 429 base::Bind(&ServiceWorkerDatabase::GetAllRegistrations, | 435 base::Bind(&ServiceWorkerDatabase::GetAllRegistrations, |
| 430 base::Unretained(database_.get()), | 436 base::Unretained(database_.get()), |
| 431 base::Unretained(registrations)), | 437 base::Unretained(registrations)), |
| 432 base::Bind(&ServiceWorkerStorage::DidGetAllRegistrations, | 438 base::Bind(&ServiceWorkerStorage::DidGetAllRegistrations, |
| 433 weak_factory_.GetWeakPtr(), | 439 weak_factory_.GetWeakPtr(), |
| 434 callback, | 440 callback, |
| 435 base::Owned(registrations))); | 441 base::Owned(registrations))); |
| 436 } | 442 } |
| 437 | 443 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 456 data.version_id = version->version_id(); | 462 data.version_id = version->version_id(); |
| 457 data.last_update_check = registration->last_update_check(); | 463 data.last_update_check = registration->last_update_check(); |
| 458 data.is_active = (version == registration->active_version()); | 464 data.is_active = (version == registration->active_version()); |
| 459 | 465 |
| 460 ResourceList resources; | 466 ResourceList resources; |
| 461 version->script_cache_map()->GetResources(&resources); | 467 version->script_cache_map()->GetResources(&resources); |
| 462 | 468 |
| 463 if (!has_checked_for_stale_resources_) | 469 if (!has_checked_for_stale_resources_) |
| 464 DeleteStaleResources(); | 470 DeleteStaleResources(); |
| 465 | 471 |
| 466 database_task_runner_->PostTask( | 472 database_task_manager_->GetTaskRunner()->PostTask( |
| 467 FROM_HERE, | 473 FROM_HERE, |
| 468 base::Bind(&WriteRegistrationInDB, | 474 base::Bind(&WriteRegistrationInDB, |
| 469 database_.get(), | 475 database_.get(), |
| 470 base::MessageLoopProxy::current(), | 476 base::MessageLoopProxy::current(), |
| 471 data, resources, | 477 data, resources, |
| 472 base::Bind(&ServiceWorkerStorage::DidStoreRegistration, | 478 base::Bind(&ServiceWorkerStorage::DidStoreRegistration, |
| 473 weak_factory_.GetWeakPtr(), | 479 weak_factory_.GetWeakPtr(), |
| 474 callback))); | 480 callback))); |
| 475 | 481 |
| 476 registration->set_is_deleted(false); | 482 registration->set_is_deleted(false); |
| 477 } | 483 } |
| 478 | 484 |
| 479 void ServiceWorkerStorage::UpdateToActiveState( | 485 void ServiceWorkerStorage::UpdateToActiveState( |
| 480 ServiceWorkerRegistration* registration, | 486 ServiceWorkerRegistration* registration, |
| 481 const StatusCallback& callback) { | 487 const StatusCallback& callback) { |
| 482 DCHECK(registration); | 488 DCHECK(registration); |
| 483 | 489 |
| 484 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 490 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
| 485 if (IsDisabled() || !context_) { | 491 if (IsDisabled() || !context_) { |
| 486 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); | 492 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
| 487 return; | 493 return; |
| 488 } | 494 } |
| 489 | 495 |
| 490 PostTaskAndReplyWithResult( | 496 PostTaskAndReplyWithResult( |
| 491 database_task_runner_.get(), | 497 database_task_manager_->GetTaskRunner(), |
| 492 FROM_HERE, | 498 FROM_HERE, |
| 493 base::Bind(&ServiceWorkerDatabase::UpdateVersionToActive, | 499 base::Bind(&ServiceWorkerDatabase::UpdateVersionToActive, |
| 494 base::Unretained(database_.get()), | 500 base::Unretained(database_.get()), |
| 495 registration->id(), | 501 registration->id(), |
| 496 registration->pattern().GetOrigin()), | 502 registration->pattern().GetOrigin()), |
| 497 base::Bind(&ServiceWorkerStorage::DidUpdateToActiveState, | 503 base::Bind(&ServiceWorkerStorage::DidUpdateToActiveState, |
| 498 weak_factory_.GetWeakPtr(), | 504 weak_factory_.GetWeakPtr(), |
| 499 callback)); | 505 callback)); |
| 500 } | 506 } |
| 501 | 507 |
| 502 void ServiceWorkerStorage::UpdateLastUpdateCheckTime( | 508 void ServiceWorkerStorage::UpdateLastUpdateCheckTime( |
| 503 ServiceWorkerRegistration* registration) { | 509 ServiceWorkerRegistration* registration) { |
| 504 DCHECK(registration); | 510 DCHECK(registration); |
| 505 | 511 |
| 506 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 512 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
| 507 if (IsDisabled() || !context_) | 513 if (IsDisabled() || !context_) |
| 508 return; | 514 return; |
| 509 | 515 |
| 510 database_task_runner_->PostTask( | 516 database_task_manager_->GetTaskRunner()->PostTask( |
| 511 FROM_HERE, | 517 FROM_HERE, |
| 512 base::Bind( | 518 base::Bind( |
| 513 base::IgnoreResult(&ServiceWorkerDatabase::UpdateLastCheckTime), | 519 base::IgnoreResult(&ServiceWorkerDatabase::UpdateLastCheckTime), |
| 514 base::Unretained(database_.get()), | 520 base::Unretained(database_.get()), |
| 515 registration->id(), | 521 registration->id(), |
| 516 registration->pattern().GetOrigin(), | 522 registration->pattern().GetOrigin(), |
| 517 registration->last_update_check())); | 523 registration->last_update_check())); |
| 518 } | 524 } |
| 519 | 525 |
| 520 void ServiceWorkerStorage::DeleteRegistration( | 526 void ServiceWorkerStorage::DeleteRegistration( |
| 521 int64 registration_id, | 527 int64 registration_id, |
| 522 const GURL& origin, | 528 const GURL& origin, |
| 523 const StatusCallback& callback) { | 529 const StatusCallback& callback) { |
| 524 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 530 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
| 525 if (IsDisabled() || !context_) { | 531 if (IsDisabled() || !context_) { |
| 526 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); | 532 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
| 527 return; | 533 return; |
| 528 } | 534 } |
| 529 | 535 |
| 530 if (!has_checked_for_stale_resources_) | 536 if (!has_checked_for_stale_resources_) |
| 531 DeleteStaleResources(); | 537 DeleteStaleResources(); |
| 532 | 538 |
| 533 DidDeleteRegistrationParams params; | 539 DidDeleteRegistrationParams params; |
| 534 params.registration_id = registration_id; | 540 params.registration_id = registration_id; |
| 535 params.origin = origin; | 541 params.origin = origin; |
| 536 params.callback = callback; | 542 params.callback = callback; |
| 537 | 543 |
| 538 database_task_runner_->PostTask( | 544 database_task_manager_->GetTaskRunner()->PostTask( |
| 539 FROM_HERE, | 545 FROM_HERE, |
| 540 base::Bind(&DeleteRegistrationFromDB, | 546 base::Bind(&DeleteRegistrationFromDB, |
| 541 database_.get(), | 547 database_.get(), |
| 542 base::MessageLoopProxy::current(), | 548 base::MessageLoopProxy::current(), |
| 543 registration_id, origin, | 549 registration_id, origin, |
| 544 base::Bind(&ServiceWorkerStorage::DidDeleteRegistration, | 550 base::Bind(&ServiceWorkerStorage::DidDeleteRegistration, |
| 545 weak_factory_.GetWeakPtr(), params))); | 551 weak_factory_.GetWeakPtr(), params))); |
| 546 | 552 |
| 547 // The registration should no longer be findable. | 553 // The registration should no longer be findable. |
| 548 pending_deletions_.insert(registration_id); | 554 pending_deletions_.insert(registration_id); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 564 new ServiceWorkerResponseWriter(response_id, disk_cache())); | 570 new ServiceWorkerResponseWriter(response_id, disk_cache())); |
| 565 } | 571 } |
| 566 | 572 |
| 567 void ServiceWorkerStorage::StoreUncommittedResponseId(int64 id) { | 573 void ServiceWorkerStorage::StoreUncommittedResponseId(int64 id) { |
| 568 DCHECK_NE(kInvalidServiceWorkerResponseId, id); | 574 DCHECK_NE(kInvalidServiceWorkerResponseId, id); |
| 569 DCHECK_EQ(INITIALIZED, state_); | 575 DCHECK_EQ(INITIALIZED, state_); |
| 570 | 576 |
| 571 if (!has_checked_for_stale_resources_) | 577 if (!has_checked_for_stale_resources_) |
| 572 DeleteStaleResources(); | 578 DeleteStaleResources(); |
| 573 | 579 |
| 574 database_task_runner_->PostTask( | 580 database_task_manager_->GetTaskRunner()->PostTask( |
| 575 FROM_HERE, | 581 FROM_HERE, |
| 576 base::Bind(base::IgnoreResult( | 582 base::Bind(base::IgnoreResult( |
| 577 &ServiceWorkerDatabase::WriteUncommittedResourceIds), | 583 &ServiceWorkerDatabase::WriteUncommittedResourceIds), |
| 578 base::Unretained(database_.get()), | 584 base::Unretained(database_.get()), |
| 579 std::set<int64>(&id, &id + 1))); | 585 std::set<int64>(&id, &id + 1))); |
| 580 } | 586 } |
| 581 | 587 |
| 582 void ServiceWorkerStorage::DoomUncommittedResponse(int64 id) { | 588 void ServiceWorkerStorage::DoomUncommittedResponse(int64 id) { |
| 583 DCHECK_NE(kInvalidServiceWorkerResponseId, id); | 589 DCHECK_NE(kInvalidServiceWorkerResponseId, id); |
| 584 database_task_runner_->PostTask( | 590 database_task_manager_->GetTaskRunner()->PostTask( |
| 585 FROM_HERE, | 591 FROM_HERE, |
| 586 base::Bind(base::IgnoreResult( | 592 base::Bind(base::IgnoreResult( |
| 587 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), | 593 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), |
| 588 base::Unretained(database_.get()), | 594 base::Unretained(database_.get()), |
| 589 std::set<int64>(&id, &id + 1))); | 595 std::set<int64>(&id, &id + 1))); |
| 590 StartPurgingResources(std::vector<int64>(1, id)); | 596 StartPurgingResources(std::vector<int64>(1, id)); |
| 591 } | 597 } |
| 592 | 598 |
| 593 void ServiceWorkerStorage::CompareScriptResources( | 599 void ServiceWorkerStorage::CompareScriptResources( |
| 594 int64 lhs_id, int64 rhs_id, | 600 int64 lhs_id, int64 rhs_id, |
| 595 const CompareCallback& callback) { | 601 const CompareCallback& callback) { |
| 596 DCHECK(!callback.is_null()); | 602 DCHECK(!callback.is_null()); |
| 597 scoped_refptr<ResponseComparer> comparer = | 603 scoped_refptr<ResponseComparer> comparer = |
| 598 new ResponseComparer(weak_factory_.GetWeakPtr(), | 604 new ResponseComparer(weak_factory_.GetWeakPtr(), |
| 599 CreateResponseReader(lhs_id), | 605 CreateResponseReader(lhs_id), |
| 600 CreateResponseReader(rhs_id), | 606 CreateResponseReader(rhs_id), |
| 601 callback); | 607 callback); |
| 602 comparer->Start(); // It deletes itself when done. | 608 comparer->Start(); // It deletes itself when done. |
| 603 } | 609 } |
| 604 | 610 |
| 605 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { | 611 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { |
| 606 Disable(); | 612 Disable(); |
| 607 | 613 |
| 608 // Delete the database on the database thread. | 614 // Delete the database on the database thread. |
| 609 PostTaskAndReplyWithResult( | 615 PostTaskAndReplyWithResult( |
| 610 database_task_runner_.get(), | 616 database_task_manager_->GetTaskRunner(), |
| 611 FROM_HERE, | 617 FROM_HERE, |
| 612 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, | 618 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, |
| 613 base::Unretained(database_.get())), | 619 base::Unretained(database_.get())), |
| 614 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, | 620 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, |
| 615 weak_factory_.GetWeakPtr(), | 621 weak_factory_.GetWeakPtr(), |
| 616 callback)); | 622 callback)); |
| 617 } | 623 } |
| 618 | 624 |
| 619 int64 ServiceWorkerStorage::NewRegistrationId() { | 625 int64 ServiceWorkerStorage::NewRegistrationId() { |
| 620 if (state_ == DISABLED) | 626 if (state_ == DISABLED) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 650 ServiceWorkerStatusCode status) { | 656 ServiceWorkerStatusCode status) { |
| 651 installing_registrations_.erase(registration->id()); | 657 installing_registrations_.erase(registration->id()); |
| 652 if (status != SERVICE_WORKER_OK && version) { | 658 if (status != SERVICE_WORKER_OK && version) { |
| 653 ResourceList resources; | 659 ResourceList resources; |
| 654 version->script_cache_map()->GetResources(&resources); | 660 version->script_cache_map()->GetResources(&resources); |
| 655 | 661 |
| 656 std::set<int64> ids; | 662 std::set<int64> ids; |
| 657 for (size_t i = 0; i < resources.size(); ++i) | 663 for (size_t i = 0; i < resources.size(); ++i) |
| 658 ids.insert(resources[i].resource_id); | 664 ids.insert(resources[i].resource_id); |
| 659 | 665 |
| 660 database_task_runner_->PostTask( | 666 database_task_manager_->GetTaskRunner()->PostTask( |
| 661 FROM_HERE, | 667 FROM_HERE, |
| 662 base::Bind(base::IgnoreResult( | 668 base::Bind(base::IgnoreResult( |
| 663 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), | 669 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), |
| 664 base::Unretained(database_.get()), | 670 base::Unretained(database_.get()), |
| 665 ids)); | 671 ids)); |
| 666 } | 672 } |
| 667 } | 673 } |
| 668 | 674 |
| 669 void ServiceWorkerStorage::NotifyUninstallingRegistration( | 675 void ServiceWorkerStorage::NotifyUninstallingRegistration( |
| 670 ServiceWorkerRegistration* registration) { | 676 ServiceWorkerRegistration* registration) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 690 | 696 |
| 691 void ServiceWorkerStorage::PurgeResources(const ResourceList& resources) { | 697 void ServiceWorkerStorage::PurgeResources(const ResourceList& resources) { |
| 692 if (!has_checked_for_stale_resources_) | 698 if (!has_checked_for_stale_resources_) |
| 693 DeleteStaleResources(); | 699 DeleteStaleResources(); |
| 694 StartPurgingResources(resources); | 700 StartPurgingResources(resources); |
| 695 } | 701 } |
| 696 | 702 |
| 697 ServiceWorkerStorage::ServiceWorkerStorage( | 703 ServiceWorkerStorage::ServiceWorkerStorage( |
| 698 const base::FilePath& path, | 704 const base::FilePath& path, |
| 699 base::WeakPtr<ServiceWorkerContextCore> context, | 705 base::WeakPtr<ServiceWorkerContextCore> context, |
| 700 const scoped_refptr<base::SequencedTaskRunner>& database_task_runner, | 706 scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager, |
| 701 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, | 707 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, |
| 702 storage::QuotaManagerProxy* quota_manager_proxy) | 708 storage::QuotaManagerProxy* quota_manager_proxy, |
| 709 storage::SpecialStoragePolicy* special_storage_policy) |
| 703 : next_registration_id_(kInvalidServiceWorkerRegistrationId), | 710 : next_registration_id_(kInvalidServiceWorkerRegistrationId), |
| 704 next_version_id_(kInvalidServiceWorkerVersionId), | 711 next_version_id_(kInvalidServiceWorkerVersionId), |
| 705 next_resource_id_(kInvalidServiceWorkerResourceId), | 712 next_resource_id_(kInvalidServiceWorkerResourceId), |
| 706 state_(UNINITIALIZED), | 713 state_(UNINITIALIZED), |
| 707 path_(path), | 714 path_(path), |
| 708 context_(context), | 715 context_(context), |
| 709 database_task_runner_(database_task_runner), | 716 database_task_manager_(database_task_manager.Pass()), |
| 710 disk_cache_thread_(disk_cache_thread), | 717 disk_cache_thread_(disk_cache_thread), |
| 711 quota_manager_proxy_(quota_manager_proxy), | 718 quota_manager_proxy_(quota_manager_proxy), |
| 719 special_storage_policy_(special_storage_policy), |
| 712 is_purge_pending_(false), | 720 is_purge_pending_(false), |
| 713 has_checked_for_stale_resources_(false), | 721 has_checked_for_stale_resources_(false), |
| 714 weak_factory_(this) { | 722 weak_factory_(this) { |
| 715 database_.reset(new ServiceWorkerDatabase(GetDatabasePath())); | 723 database_.reset(new ServiceWorkerDatabase(GetDatabasePath())); |
| 716 } | 724 } |
| 717 | 725 |
| 718 base::FilePath ServiceWorkerStorage::GetDatabasePath() { | 726 base::FilePath ServiceWorkerStorage::GetDatabasePath() { |
| 719 if (path_.empty()) | 727 if (path_.empty()) |
| 720 return base::FilePath(); | 728 return base::FilePath(); |
| 721 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) | 729 return path_.Append(ServiceWorkerContextCore::kServiceWorkerDirectory) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 740 return false; | 748 return false; |
| 741 case INITIALIZING: | 749 case INITIALIZING: |
| 742 pending_tasks_.push_back(callback); | 750 pending_tasks_.push_back(callback); |
| 743 return false; | 751 return false; |
| 744 case UNINITIALIZED: | 752 case UNINITIALIZED: |
| 745 pending_tasks_.push_back(callback); | 753 pending_tasks_.push_back(callback); |
| 746 // Fall-through. | 754 // Fall-through. |
| 747 } | 755 } |
| 748 | 756 |
| 749 state_ = INITIALIZING; | 757 state_ = INITIALIZING; |
| 750 database_task_runner_->PostTask( | 758 database_task_manager_->GetTaskRunner()->PostTask( |
| 751 FROM_HERE, | 759 FROM_HERE, |
| 752 base::Bind(&ReadInitialDataFromDB, | 760 base::Bind(&ReadInitialDataFromDB, |
| 753 database_.get(), | 761 database_.get(), |
| 754 base::MessageLoopProxy::current(), | 762 base::MessageLoopProxy::current(), |
| 755 base::Bind(&ServiceWorkerStorage::DidReadInitialData, | 763 base::Bind(&ServiceWorkerStorage::DidReadInitialData, |
| 756 weak_factory_.GetWeakPtr()))); | 764 weak_factory_.GetWeakPtr()))); |
| 757 return false; | 765 return false; |
| 758 } | 766 } |
| 759 | 767 |
| 760 void ServiceWorkerStorage::DidReadInitialData( | 768 void ServiceWorkerStorage::DidReadInitialData( |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1147 id, base::Bind(&ServiceWorkerStorage::OnResourcePurged, | 1155 id, base::Bind(&ServiceWorkerStorage::OnResourcePurged, |
| 1148 weak_factory_.GetWeakPtr(), id)); | 1156 weak_factory_.GetWeakPtr(), id)); |
| 1149 if (rv != net::ERR_IO_PENDING) | 1157 if (rv != net::ERR_IO_PENDING) |
| 1150 OnResourcePurged(id, rv); | 1158 OnResourcePurged(id, rv); |
| 1151 } | 1159 } |
| 1152 | 1160 |
| 1153 void ServiceWorkerStorage::OnResourcePurged(int64 id, int rv) { | 1161 void ServiceWorkerStorage::OnResourcePurged(int64 id, int rv) { |
| 1154 DCHECK(is_purge_pending_); | 1162 DCHECK(is_purge_pending_); |
| 1155 is_purge_pending_ = false; | 1163 is_purge_pending_ = false; |
| 1156 | 1164 |
| 1157 database_task_runner_->PostTask( | 1165 database_task_manager_->GetTaskRunner()->PostTask( |
| 1158 FROM_HERE, | 1166 FROM_HERE, |
| 1159 base::Bind(base::IgnoreResult( | 1167 base::Bind(base::IgnoreResult( |
| 1160 &ServiceWorkerDatabase::ClearPurgeableResourceIds), | 1168 &ServiceWorkerDatabase::ClearPurgeableResourceIds), |
| 1161 base::Unretained(database_.get()), | 1169 base::Unretained(database_.get()), |
| 1162 std::set<int64>(&id, &id + 1))); | 1170 std::set<int64>(&id, &id + 1))); |
| 1163 | 1171 |
| 1164 ContinuePurgingResources(); | 1172 ContinuePurgingResources(); |
| 1165 } | 1173 } |
| 1166 | 1174 |
| 1167 void ServiceWorkerStorage::DeleteStaleResources() { | 1175 void ServiceWorkerStorage::DeleteStaleResources() { |
| 1168 DCHECK(!has_checked_for_stale_resources_); | 1176 DCHECK(!has_checked_for_stale_resources_); |
| 1169 has_checked_for_stale_resources_ = true; | 1177 has_checked_for_stale_resources_ = true; |
| 1170 database_task_runner_->PostTask( | 1178 database_task_manager_->GetTaskRunner()->PostTask( |
| 1171 FROM_HERE, | 1179 FROM_HERE, |
| 1172 base::Bind(&ServiceWorkerStorage::CollectStaleResourcesFromDB, | 1180 base::Bind(&ServiceWorkerStorage::CollectStaleResourcesFromDB, |
| 1173 database_.get(), | 1181 database_.get(), |
| 1174 base::MessageLoopProxy::current(), | 1182 base::MessageLoopProxy::current(), |
| 1175 base::Bind(&ServiceWorkerStorage::DidCollectStaleResources, | 1183 base::Bind(&ServiceWorkerStorage::DidCollectStaleResources, |
| 1176 weak_factory_.GetWeakPtr()))); | 1184 weak_factory_.GetWeakPtr()))); |
| 1177 } | 1185 } |
| 1178 | 1186 |
| 1179 void ServiceWorkerStorage::DidCollectStaleResources( | 1187 void ServiceWorkerStorage::DidCollectStaleResources( |
| 1180 const std::vector<int64>& stale_resource_ids, | 1188 const std::vector<int64>& stale_resource_ids, |
| 1181 ServiceWorkerDatabase::Status status) { | 1189 ServiceWorkerDatabase::Status status) { |
| 1182 DCHECK_EQ(ServiceWorkerDatabase::STATUS_OK, status); | 1190 DCHECK_EQ(ServiceWorkerDatabase::STATUS_OK, status); |
| 1183 if (status != ServiceWorkerDatabase::STATUS_OK) | 1191 if (status != ServiceWorkerDatabase::STATUS_OK) |
| 1184 return; | 1192 return; |
| 1185 StartPurgingResources(stale_resource_ids); | 1193 StartPurgingResources(stale_resource_ids); |
| 1186 } | 1194 } |
| 1187 | 1195 |
| 1196 void ServiceWorkerStorage::ClearSessionOnlyOrigins() { |
| 1197 // Can be null in tests. |
| 1198 if (!special_storage_policy_.get()) |
| 1199 return; |
| 1200 |
| 1201 if (!special_storage_policy_->HasSessionOnlyOrigins()) |
| 1202 return; |
| 1203 |
| 1204 std::set<GURL> session_only_origins; |
| 1205 for (const GURL& origin : registered_origins_) { |
| 1206 if (special_storage_policy_->IsStorageSessionOnly(origin)) |
| 1207 session_only_origins.insert(origin); |
| 1208 } |
| 1209 |
| 1210 database_task_manager_->GetShutdownBlockingTaskRunner()->PostTask( |
| 1211 FROM_HERE, |
| 1212 base::Bind(&DeleteAllDataForOriginsFromDB, |
| 1213 database_.get(), |
| 1214 session_only_origins)); |
| 1215 } |
| 1216 |
| 1188 void ServiceWorkerStorage::CollectStaleResourcesFromDB( | 1217 void ServiceWorkerStorage::CollectStaleResourcesFromDB( |
| 1189 ServiceWorkerDatabase* database, | 1218 ServiceWorkerDatabase* database, |
| 1190 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1219 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 1191 const GetResourcesCallback& callback) { | 1220 const GetResourcesCallback& callback) { |
| 1192 std::set<int64> ids; | 1221 std::set<int64> ids; |
| 1193 ServiceWorkerDatabase::Status status = | 1222 ServiceWorkerDatabase::Status status = |
| 1194 database->GetUncommittedResourceIds(&ids); | 1223 database->GetUncommittedResourceIds(&ids); |
| 1195 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1224 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 1196 original_task_runner->PostTask( | 1225 original_task_runner->PostTask( |
| 1197 FROM_HERE, | 1226 FROM_HERE, |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1384 const GURL& origin, | 1413 const GURL& origin, |
| 1385 const FindInDBCallback& callback) { | 1414 const FindInDBCallback& callback) { |
| 1386 ServiceWorkerDatabase::RegistrationData data; | 1415 ServiceWorkerDatabase::RegistrationData data; |
| 1387 ResourceList resources; | 1416 ResourceList resources; |
| 1388 ServiceWorkerDatabase::Status status = | 1417 ServiceWorkerDatabase::Status status = |
| 1389 database->ReadRegistration(registration_id, origin, &data, &resources); | 1418 database->ReadRegistration(registration_id, origin, &data, &resources); |
| 1390 original_task_runner->PostTask( | 1419 original_task_runner->PostTask( |
| 1391 FROM_HERE, base::Bind(callback, data, resources, status)); | 1420 FROM_HERE, base::Bind(callback, data, resources, status)); |
| 1392 } | 1421 } |
| 1393 | 1422 |
| 1423 void ServiceWorkerStorage::DeleteAllDataForOriginsFromDB( |
| 1424 ServiceWorkerDatabase* database, |
| 1425 const std::set<GURL>& origins) { |
| 1426 DCHECK(database); |
| 1427 |
| 1428 std::vector<int64> newly_purgeable_resources; |
| 1429 database->DeleteAllDataForOrigins(origins, &newly_purgeable_resources); |
| 1430 } |
| 1431 |
| 1394 // TODO(nhiroki): The corruption recovery should not be scheduled if the error | 1432 // TODO(nhiroki): The corruption recovery should not be scheduled if the error |
| 1395 // is transient and it can get healed soon (e.g. IO error). To do that, the | 1433 // is transient and it can get healed soon (e.g. IO error). To do that, the |
| 1396 // database should not disable itself when an error occurs and the storage | 1434 // database should not disable itself when an error occurs and the storage |
| 1397 // controls it instead. | 1435 // controls it instead. |
| 1398 void ServiceWorkerStorage::ScheduleDeleteAndStartOver() { | 1436 void ServiceWorkerStorage::ScheduleDeleteAndStartOver() { |
| 1399 if (state_ == DISABLED) { | 1437 if (state_ == DISABLED) { |
| 1400 // Recovery process has already been scheduled. | 1438 // Recovery process has already been scheduled. |
| 1401 return; | 1439 return; |
| 1402 } | 1440 } |
| 1403 Disable(); | 1441 Disable(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1416 callback.Run(DatabaseStatusToStatusCode(status)); | 1454 callback.Run(DatabaseStatusToStatusCode(status)); |
| 1417 return; | 1455 return; |
| 1418 } | 1456 } |
| 1419 DVLOG(1) << "Deleted ServiceWorkerDatabase successfully."; | 1457 DVLOG(1) << "Deleted ServiceWorkerDatabase successfully."; |
| 1420 | 1458 |
| 1421 // Delete the disk cache on the cache thread. | 1459 // Delete the disk cache on the cache thread. |
| 1422 // TODO(nhiroki): What if there is a bunch of files in the cache directory? | 1460 // TODO(nhiroki): What if there is a bunch of files in the cache directory? |
| 1423 // Deleting the directory could take a long time and restart could be delayed. | 1461 // Deleting the directory could take a long time and restart could be delayed. |
| 1424 // We should probably rename the directory and delete it later. | 1462 // We should probably rename the directory and delete it later. |
| 1425 PostTaskAndReplyWithResult( | 1463 PostTaskAndReplyWithResult( |
| 1426 database_task_runner_.get(), | 1464 database_task_manager_->GetTaskRunner(), |
| 1427 FROM_HERE, | 1465 FROM_HERE, |
| 1428 base::Bind(&base::DeleteFile, GetDiskCachePath(), true), | 1466 base::Bind(&base::DeleteFile, GetDiskCachePath(), true), |
| 1429 base::Bind(&ServiceWorkerStorage::DidDeleteDiskCache, | 1467 base::Bind(&ServiceWorkerStorage::DidDeleteDiskCache, |
| 1430 weak_factory_.GetWeakPtr(), | 1468 weak_factory_.GetWeakPtr(), |
| 1431 callback)); | 1469 callback)); |
| 1432 } | 1470 } |
| 1433 | 1471 |
| 1434 void ServiceWorkerStorage::DidDeleteDiskCache( | 1472 void ServiceWorkerStorage::DidDeleteDiskCache( |
| 1435 const StatusCallback& callback, bool result) { | 1473 const StatusCallback& callback, bool result) { |
| 1436 DCHECK_EQ(DISABLED, state_); | 1474 DCHECK_EQ(DISABLED, state_); |
| 1437 if (!result) { | 1475 if (!result) { |
| 1438 // Give up the corruption recovery until the browser restarts. | 1476 // Give up the corruption recovery until the browser restarts. |
| 1439 LOG(ERROR) << "Failed to delete the diskcache."; | 1477 LOG(ERROR) << "Failed to delete the diskcache."; |
| 1440 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1478 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 1441 return; | 1479 return; |
| 1442 } | 1480 } |
| 1443 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1481 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
| 1444 callback.Run(SERVICE_WORKER_OK); | 1482 callback.Run(SERVICE_WORKER_OK); |
| 1445 } | 1483 } |
| 1446 | 1484 |
| 1447 } // namespace content | 1485 } // namespace content |
| OLD | NEW |