OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/appcache/appcache_storage_impl.h" | 5 #include "content/browser/appcache/appcache_storage_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 #include <set> | 9 #include <set> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
15 #include "base/logging.h" | 15 #include "base/logging.h" |
16 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
17 #include "base/profiler/scoped_tracker.h" | |
17 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
18 #include "base/stl_util.h" | 19 #include "base/stl_util.h" |
19 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
20 #include "content/browser/appcache/appcache.h" | 21 #include "content/browser/appcache/appcache.h" |
21 #include "content/browser/appcache/appcache_database.h" | 22 #include "content/browser/appcache/appcache_database.h" |
22 #include "content/browser/appcache/appcache_entry.h" | 23 #include "content/browser/appcache/appcache_entry.h" |
23 #include "content/browser/appcache/appcache_group.h" | 24 #include "content/browser/appcache/appcache_group.h" |
24 #include "content/browser/appcache/appcache_histograms.h" | 25 #include "content/browser/appcache/appcache_histograms.h" |
25 #include "content/browser/appcache/appcache_quota_client.h" | 26 #include "content/browser/appcache/appcache_quota_client.h" |
26 #include "content/browser/appcache/appcache_response.h" | 27 #include "content/browser/appcache/appcache_response.h" |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
278 base::FilePath db_file_path_; | 279 base::FilePath db_file_path_; |
279 base::FilePath disk_cache_directory_; | 280 base::FilePath disk_cache_directory_; |
280 int64 last_group_id_; | 281 int64 last_group_id_; |
281 int64 last_cache_id_; | 282 int64 last_cache_id_; |
282 int64 last_response_id_; | 283 int64 last_response_id_; |
283 int64 last_deletable_response_rowid_; | 284 int64 last_deletable_response_rowid_; |
284 std::map<GURL, int64> usage_map_; | 285 std::map<GURL, int64> usage_map_; |
285 }; | 286 }; |
286 | 287 |
287 void AppCacheStorageImpl::InitTask::Run() { | 288 void AppCacheStorageImpl::InitTask::Run() { |
289 tracked_objects::ScopedTracker tracking_profile( | |
290 FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::InitTask")); | |
288 // If there is no sql database, ensure there is no disk cache either. | 291 // If there is no sql database, ensure there is no disk cache either. |
289 if (!db_file_path_.empty() && | 292 if (!db_file_path_.empty() && |
290 !base::PathExists(db_file_path_) && | 293 !base::PathExists(db_file_path_) && |
291 base::DirectoryExists(disk_cache_directory_)) { | 294 base::DirectoryExists(disk_cache_directory_)) { |
292 base::DeleteFile(disk_cache_directory_, true); | 295 base::DeleteFile(disk_cache_directory_, true); |
293 if (base::DirectoryExists(disk_cache_directory_)) { | 296 if (base::DirectoryExists(disk_cache_directory_)) { |
294 database_->Disable(); // This triggers OnFatalError handling. | 297 database_->Disable(); // This triggers OnFatalError handling. |
295 return; | 298 return; |
296 } | 299 } |
297 } | 300 } |
298 | 301 |
299 database_->FindLastStorageIds( | 302 database_->FindLastStorageIds( |
300 &last_group_id_, &last_cache_id_, &last_response_id_, | 303 &last_group_id_, &last_cache_id_, &last_response_id_, |
301 &last_deletable_response_rowid_); | 304 &last_deletable_response_rowid_); |
302 database_->GetAllOriginUsage(&usage_map_); | 305 database_->GetAllOriginUsage(&usage_map_); |
303 } | 306 } |
304 | 307 |
305 void AppCacheStorageImpl::InitTask::RunCompleted() { | 308 void AppCacheStorageImpl::InitTask::RunCompleted() { |
306 storage_->last_group_id_ = last_group_id_; | 309 storage_->last_group_id_ = last_group_id_; |
307 storage_->last_cache_id_ = last_cache_id_; | 310 storage_->last_cache_id_ = last_cache_id_; |
308 storage_->last_response_id_ = last_response_id_; | 311 storage_->last_response_id_ = last_response_id_; |
309 storage_->last_deletable_response_rowid_ = last_deletable_response_rowid_; | 312 storage_->last_deletable_response_rowid_ = last_deletable_response_rowid_; |
310 | 313 |
311 if (!storage_->is_disabled()) { | 314 if (!storage_->is_disabled()) { |
312 storage_->usage_map_.swap(usage_map_); | 315 storage_->usage_map_.swap(usage_map_); |
313 const base::TimeDelta kDelay = base::TimeDelta::FromMinutes(5); | 316 const base::TimeDelta k5Minutes = base::TimeDelta::FromMinutes(5); |
cmumford
2015/02/17 19:26:39
My preference would be to have a name that describ
michaeln
2015/02/17 19:46:26
Done.
| |
314 base::MessageLoop::current()->PostDelayedTask( | 317 base::MessageLoop::current()->PostDelayedTask( |
315 FROM_HERE, | 318 FROM_HERE, |
316 base::Bind(&AppCacheStorageImpl::DelayedStartDeletingUnusedResponses, | 319 base::Bind(&AppCacheStorageImpl::DelayedStartDeletingUnusedResponses, |
317 storage_->weak_factory_.GetWeakPtr()), | 320 storage_->weak_factory_.GetWeakPtr()), |
318 kDelay); | 321 k5Minutes); |
319 } | 322 } |
320 | 323 |
321 if (storage_->service()->quota_client()) | 324 if (storage_->service()->quota_client()) |
322 storage_->service()->quota_client()->NotifyAppCacheReady(); | 325 storage_->service()->quota_client()->NotifyAppCacheReady(); |
323 } | 326 } |
324 | 327 |
325 // DisableDatabaseTask ------- | 328 // DisableDatabaseTask ------- |
326 | 329 |
327 class AppCacheStorageImpl::DisableDatabaseTask : public DatabaseTask { | 330 class AppCacheStorageImpl::DisableDatabaseTask : public DatabaseTask { |
328 public: | 331 public: |
(...skipping 21 matching lines...) Expand all Loading... | |
350 void RunCompleted() override; | 353 void RunCompleted() override; |
351 | 354 |
352 protected: | 355 protected: |
353 ~GetAllInfoTask() override {} | 356 ~GetAllInfoTask() override {} |
354 | 357 |
355 private: | 358 private: |
356 scoped_refptr<AppCacheInfoCollection> info_collection_; | 359 scoped_refptr<AppCacheInfoCollection> info_collection_; |
357 }; | 360 }; |
358 | 361 |
359 void AppCacheStorageImpl::GetAllInfoTask::Run() { | 362 void AppCacheStorageImpl::GetAllInfoTask::Run() { |
363 tracked_objects::ScopedTracker tracking_profile( | |
364 FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::GetAllInfoTask")); | |
360 std::set<GURL> origins; | 365 std::set<GURL> origins; |
361 database_->FindOriginsWithGroups(&origins); | 366 database_->FindOriginsWithGroups(&origins); |
362 for (std::set<GURL>::const_iterator origin = origins.begin(); | 367 for (std::set<GURL>::const_iterator origin = origins.begin(); |
363 origin != origins.end(); ++origin) { | 368 origin != origins.end(); ++origin) { |
364 AppCacheInfoVector& infos = | 369 AppCacheInfoVector& infos = |
365 info_collection_->infos_by_origin[*origin]; | 370 info_collection_->infos_by_origin[*origin]; |
366 std::vector<AppCacheDatabase::GroupRecord> groups; | 371 std::vector<AppCacheDatabase::GroupRecord> groups; |
367 database_->FindGroupsForOrigin(*origin, &groups); | 372 database_->FindGroupsForOrigin(*origin, &groups); |
368 for (std::vector<AppCacheDatabase::GroupRecord>::const_iterator | 373 for (std::vector<AppCacheDatabase::GroupRecord>::const_iterator |
369 group = groups.begin(); | 374 group = groups.begin(); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
505 | 510 |
506 protected: | 511 protected: |
507 ~CacheLoadTask() override {} | 512 ~CacheLoadTask() override {} |
508 | 513 |
509 private: | 514 private: |
510 int64 cache_id_; | 515 int64 cache_id_; |
511 bool success_; | 516 bool success_; |
512 }; | 517 }; |
513 | 518 |
514 void AppCacheStorageImpl::CacheLoadTask::Run() { | 519 void AppCacheStorageImpl::CacheLoadTask::Run() { |
520 tracked_objects::ScopedTracker tracking_profile( | |
521 FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::CacheLoadTask")); | |
515 success_ = | 522 success_ = |
516 database_->FindCache(cache_id_, &cache_record_) && | 523 database_->FindCache(cache_id_, &cache_record_) && |
517 database_->FindGroup(cache_record_.group_id, &group_record_) && | 524 database_->FindGroup(cache_record_.group_id, &group_record_) && |
518 FindRelatedCacheRecords(cache_id_); | 525 FindRelatedCacheRecords(cache_id_); |
519 | 526 |
520 if (success_) | 527 if (success_) |
521 database_->UpdateGroupLastAccessTime(group_record_.group_id, | 528 database_->LazyUpdateLastAccessTime(group_record_.group_id, |
522 base::Time::Now()); | 529 base::Time::Now()); |
523 } | 530 } |
524 | 531 |
525 void AppCacheStorageImpl::CacheLoadTask::RunCompleted() { | 532 void AppCacheStorageImpl::CacheLoadTask::RunCompleted() { |
526 storage_->pending_cache_loads_.erase(cache_id_); | 533 storage_->pending_cache_loads_.erase(cache_id_); |
527 scoped_refptr<AppCache> cache; | 534 scoped_refptr<AppCache> cache; |
528 scoped_refptr<AppCacheGroup> group; | 535 scoped_refptr<AppCacheGroup> group; |
529 if (success_ && !storage_->is_disabled()) { | 536 if (success_ && !storage_->is_disabled()) { |
537 storage_->LazilyCommitLastAccessTimes(); | |
530 DCHECK(cache_record_.cache_id == cache_id_); | 538 DCHECK(cache_record_.cache_id == cache_id_); |
531 CreateCacheAndGroupFromRecords(&cache, &group); | 539 CreateCacheAndGroupFromRecords(&cache, &group); |
532 } | 540 } |
533 FOR_EACH_DELEGATE(delegates_, OnCacheLoaded(cache.get(), cache_id_)); | 541 FOR_EACH_DELEGATE(delegates_, OnCacheLoaded(cache.get(), cache_id_)); |
534 } | 542 } |
535 | 543 |
536 // GroupLoadTask ------- | 544 // GroupLoadTask ------- |
537 | 545 |
538 class AppCacheStorageImpl::GroupLoadTask : public StoreOrLoadTask { | 546 class AppCacheStorageImpl::GroupLoadTask : public StoreOrLoadTask { |
539 public: | 547 public: |
540 GroupLoadTask(GURL manifest_url, AppCacheStorageImpl* storage) | 548 GroupLoadTask(GURL manifest_url, AppCacheStorageImpl* storage) |
541 : StoreOrLoadTask(storage), manifest_url_(manifest_url), | 549 : StoreOrLoadTask(storage), manifest_url_(manifest_url), |
542 success_(false) {} | 550 success_(false) {} |
543 | 551 |
544 // DatabaseTask: | 552 // DatabaseTask: |
545 void Run() override; | 553 void Run() override; |
546 void RunCompleted() override; | 554 void RunCompleted() override; |
547 | 555 |
548 protected: | 556 protected: |
549 ~GroupLoadTask() override {} | 557 ~GroupLoadTask() override {} |
550 | 558 |
551 private: | 559 private: |
552 GURL manifest_url_; | 560 GURL manifest_url_; |
553 bool success_; | 561 bool success_; |
554 }; | 562 }; |
555 | 563 |
556 void AppCacheStorageImpl::GroupLoadTask::Run() { | 564 void AppCacheStorageImpl::GroupLoadTask::Run() { |
565 tracked_objects::ScopedTracker tracking_profile( | |
566 FROM_HERE_WITH_EXPLICIT_FUNCTION("AppCacheStorageImpl::GroupLoadTask")); | |
557 success_ = | 567 success_ = |
558 database_->FindGroupForManifestUrl(manifest_url_, &group_record_) && | 568 database_->FindGroupForManifestUrl(manifest_url_, &group_record_) && |
559 database_->FindCacheForGroup(group_record_.group_id, &cache_record_) && | 569 database_->FindCacheForGroup(group_record_.group_id, &cache_record_) && |
560 FindRelatedCacheRecords(cache_record_.cache_id); | 570 FindRelatedCacheRecords(cache_record_.cache_id); |
561 | 571 |
562 if (success_) | 572 if (success_) |
563 database_->UpdateGroupLastAccessTime(group_record_.group_id, | 573 database_->LazyUpdateLastAccessTime(group_record_.group_id, |
564 base::Time::Now()); | 574 base::Time::Now()); |
565 } | 575 } |
566 | 576 |
567 void AppCacheStorageImpl::GroupLoadTask::RunCompleted() { | 577 void AppCacheStorageImpl::GroupLoadTask::RunCompleted() { |
568 storage_->pending_group_loads_.erase(manifest_url_); | 578 storage_->pending_group_loads_.erase(manifest_url_); |
569 scoped_refptr<AppCacheGroup> group; | 579 scoped_refptr<AppCacheGroup> group; |
570 scoped_refptr<AppCache> cache; | 580 scoped_refptr<AppCache> cache; |
571 if (!storage_->is_disabled()) { | 581 if (!storage_->is_disabled()) { |
572 if (success_) { | 582 if (success_) { |
583 storage_->LazilyCommitLastAccessTimes(); | |
573 DCHECK(group_record_.manifest_url == manifest_url_); | 584 DCHECK(group_record_.manifest_url == manifest_url_); |
574 CreateCacheAndGroupFromRecords(&cache, &group); | 585 CreateCacheAndGroupFromRecords(&cache, &group); |
575 } else { | 586 } else { |
576 group = storage_->working_set_.GetGroup(manifest_url_); | 587 group = storage_->working_set_.GetGroup(manifest_url_); |
577 if (!group.get()) { | 588 if (!group.get()) { |
578 group = | 589 group = |
579 new AppCacheGroup(storage_, manifest_url_, storage_->NewGroupId()); | 590 new AppCacheGroup(storage_, manifest_url_, storage_->NewGroupId()); |
580 } | 591 } |
581 } | 592 } |
582 } | 593 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
661 if (status == storage::kQuotaStatusOk) | 672 if (status == storage::kQuotaStatusOk) |
662 space_available_ = std::max(static_cast<int64>(0), quota - usage); | 673 space_available_ = std::max(static_cast<int64>(0), quota - usage); |
663 else | 674 else |
664 space_available_ = 0; | 675 space_available_ = 0; |
665 storage_->pending_quota_queries_.erase(this); | 676 storage_->pending_quota_queries_.erase(this); |
666 Schedule(); | 677 Schedule(); |
667 } | 678 } |
668 } | 679 } |
669 | 680 |
670 void AppCacheStorageImpl::StoreGroupAndCacheTask::Run() { | 681 void AppCacheStorageImpl::StoreGroupAndCacheTask::Run() { |
682 tracked_objects::ScopedTracker tracking_profile( | |
683 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
684 "AppCacheStorageImpl::StoreGroupAndCacheTask")); | |
671 DCHECK(!success_); | 685 DCHECK(!success_); |
672 sql::Connection* connection = database_->db_connection(); | 686 sql::Connection* connection = database_->db_connection(); |
673 if (!connection) | 687 if (!connection) |
674 return; | 688 return; |
675 | 689 |
676 sql::Transaction transaction(connection); | 690 sql::Transaction transaction(connection); |
677 if (!transaction.Begin()) | 691 if (!transaction.Begin()) |
678 return; | 692 return; |
679 | 693 |
680 int64 old_origin_usage = database_->GetOriginUsage(group_record_.origin); | 694 int64 old_origin_usage = database_->GetOriginUsage(group_record_.origin); |
681 | 695 |
682 AppCacheDatabase::GroupRecord existing_group; | 696 AppCacheDatabase::GroupRecord existing_group; |
683 success_ = database_->FindGroup(group_record_.group_id, &existing_group); | 697 success_ = database_->FindGroup(group_record_.group_id, &existing_group); |
684 if (!success_) { | 698 if (!success_) { |
685 group_record_.creation_time = base::Time::Now(); | 699 group_record_.creation_time = base::Time::Now(); |
686 group_record_.last_access_time = base::Time::Now(); | 700 group_record_.last_access_time = base::Time::Now(); |
687 success_ = database_->InsertGroup(&group_record_); | 701 success_ = database_->InsertGroup(&group_record_); |
688 } else { | 702 } else { |
689 DCHECK(group_record_.group_id == existing_group.group_id); | 703 DCHECK(group_record_.group_id == existing_group.group_id); |
690 DCHECK(group_record_.manifest_url == existing_group.manifest_url); | 704 DCHECK(group_record_.manifest_url == existing_group.manifest_url); |
691 DCHECK(group_record_.origin == existing_group.origin); | 705 DCHECK(group_record_.origin == existing_group.origin); |
692 | 706 |
693 database_->UpdateGroupLastAccessTime(group_record_.group_id, | 707 database_->UpdateLastAccessTime(group_record_.group_id, |
694 base::Time::Now()); | 708 base::Time::Now()); |
695 | 709 |
696 AppCacheDatabase::CacheRecord cache; | 710 AppCacheDatabase::CacheRecord cache; |
697 if (database_->FindCacheForGroup(group_record_.group_id, &cache)) { | 711 if (database_->FindCacheForGroup(group_record_.group_id, &cache)) { |
698 // Get the set of response ids in the old cache. | 712 // Get the set of response ids in the old cache. |
699 std::set<int64> existing_response_ids; | 713 std::set<int64> existing_response_ids; |
700 database_->FindResponseIdsForCacheAsSet(cache.cache_id, | 714 database_->FindResponseIdsForCacheAsSet(cache.cache_id, |
701 &existing_response_ids); | 715 &existing_response_ids); |
702 | 716 |
703 // Remove those that remain in the new cache. | 717 // Remove those that remain in the new cache. |
704 std::vector<AppCacheDatabase::EntryRecord>::const_iterator entry_iter = | 718 std::vector<AppCacheDatabase::EntryRecord>::const_iterator entry_iter = |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
924 std::set<int64> cache_ids_in_use_; | 938 std::set<int64> cache_ids_in_use_; |
925 AppCacheEntry entry_; | 939 AppCacheEntry entry_; |
926 AppCacheEntry fallback_entry_; | 940 AppCacheEntry fallback_entry_; |
927 GURL namespace_entry_url_; | 941 GURL namespace_entry_url_; |
928 int64 cache_id_; | 942 int64 cache_id_; |
929 int64 group_id_; | 943 int64 group_id_; |
930 GURL manifest_url_; | 944 GURL manifest_url_; |
931 }; | 945 }; |
932 | 946 |
933 void AppCacheStorageImpl::FindMainResponseTask::Run() { | 947 void AppCacheStorageImpl::FindMainResponseTask::Run() { |
948 tracked_objects::ScopedTracker tracking_profile( | |
949 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
950 "AppCacheStorageImpl::FindMainResponseTask")); | |
934 // NOTE: The heuristics around choosing amoungst multiple candidates | 951 // NOTE: The heuristics around choosing amoungst multiple candidates |
935 // is underspecified, and just plain not fully understood. This needs | 952 // is underspecified, and just plain not fully understood. This needs |
936 // to be refined. | 953 // to be refined. |
937 | 954 |
938 // The 'preferred_manifest_url' is the url of the manifest associated | 955 // The 'preferred_manifest_url' is the url of the manifest associated |
939 // with the page that opened or embedded the page being loaded now. | 956 // with the page that opened or embedded the page being loaded now. |
940 // We have a strong preference to use resources from that cache. | 957 // We have a strong preference to use resources from that cache. |
941 // We also have a lesser bias to use resources from caches that are currently | 958 // We also have a lesser bias to use resources from caches that are currently |
942 // being used by other unrelated pages. | 959 // being used by other unrelated pages. |
943 // TODO(michaeln): come up with a 'preferred_manifest_url' in more cases | 960 // TODO(michaeln): come up with a 'preferred_manifest_url' in more cases |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1107 | 1124 |
1108 protected: | 1125 protected: |
1109 ~MarkEntryAsForeignTask() override {} | 1126 ~MarkEntryAsForeignTask() override {} |
1110 | 1127 |
1111 private: | 1128 private: |
1112 int64 cache_id_; | 1129 int64 cache_id_; |
1113 GURL entry_url_; | 1130 GURL entry_url_; |
1114 }; | 1131 }; |
1115 | 1132 |
1116 void AppCacheStorageImpl::MarkEntryAsForeignTask::Run() { | 1133 void AppCacheStorageImpl::MarkEntryAsForeignTask::Run() { |
1134 tracked_objects::ScopedTracker tracking_profile( | |
1135 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
1136 "AppCacheStorageImpl::MarkEntryAsForeignTask")); | |
1117 database_->AddEntryFlags(entry_url_, cache_id_, AppCacheEntry::FOREIGN); | 1137 database_->AddEntryFlags(entry_url_, cache_id_, AppCacheEntry::FOREIGN); |
1118 } | 1138 } |
1119 | 1139 |
1120 void AppCacheStorageImpl::MarkEntryAsForeignTask::RunCompleted() { | 1140 void AppCacheStorageImpl::MarkEntryAsForeignTask::RunCompleted() { |
1121 DCHECK(storage_->pending_foreign_markings_.front().first == entry_url_ && | 1141 DCHECK(storage_->pending_foreign_markings_.front().first == entry_url_ && |
1122 storage_->pending_foreign_markings_.front().second == cache_id_); | 1142 storage_->pending_foreign_markings_.front().second == cache_id_); |
1123 storage_->pending_foreign_markings_.pop_front(); | 1143 storage_->pending_foreign_markings_.pop_front(); |
1124 } | 1144 } |
1125 | 1145 |
1126 // MakeGroupObsoleteTask ------- | 1146 // MakeGroupObsoleteTask ------- |
(...skipping 28 matching lines...) Expand all Loading... | |
1155 int response_code) | 1175 int response_code) |
1156 : DatabaseTask(storage), | 1176 : DatabaseTask(storage), |
1157 group_(group), | 1177 group_(group), |
1158 group_id_(group->group_id()), | 1178 group_id_(group->group_id()), |
1159 origin_(group->manifest_url().GetOrigin()), | 1179 origin_(group->manifest_url().GetOrigin()), |
1160 success_(false), | 1180 success_(false), |
1161 response_code_(response_code), | 1181 response_code_(response_code), |
1162 new_origin_usage_(-1) {} | 1182 new_origin_usage_(-1) {} |
1163 | 1183 |
1164 void AppCacheStorageImpl::MakeGroupObsoleteTask::Run() { | 1184 void AppCacheStorageImpl::MakeGroupObsoleteTask::Run() { |
1185 tracked_objects::ScopedTracker tracking_profile( | |
1186 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
1187 "AppCacheStorageImpl::MakeGroupObsoleteTask")); | |
1165 DCHECK(!success_); | 1188 DCHECK(!success_); |
1166 sql::Connection* connection = database_->db_connection(); | 1189 sql::Connection* connection = database_->db_connection(); |
1167 if (!connection) | 1190 if (!connection) |
1168 return; | 1191 return; |
1169 | 1192 |
1170 sql::Transaction transaction(connection); | 1193 sql::Transaction transaction(connection); |
1171 if (!transaction.Begin()) | 1194 if (!transaction.Begin()) |
1172 return; | 1195 return; |
1173 | 1196 |
1174 AppCacheDatabase::GroupRecord group_record; | 1197 AppCacheDatabase::GroupRecord group_record; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1226 | 1249 |
1227 protected: | 1250 protected: |
1228 ~GetDeletableResponseIdsTask() override {} | 1251 ~GetDeletableResponseIdsTask() override {} |
1229 | 1252 |
1230 private: | 1253 private: |
1231 int64 max_rowid_; | 1254 int64 max_rowid_; |
1232 std::vector<int64> response_ids_; | 1255 std::vector<int64> response_ids_; |
1233 }; | 1256 }; |
1234 | 1257 |
1235 void AppCacheStorageImpl::GetDeletableResponseIdsTask::Run() { | 1258 void AppCacheStorageImpl::GetDeletableResponseIdsTask::Run() { |
1259 tracked_objects::ScopedTracker tracking_profile( | |
1260 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
1261 "AppCacheStorageImpl::GetDeletableResponseIdsTask")); | |
1236 const int kSqlLimit = 1000; | 1262 const int kSqlLimit = 1000; |
1237 database_->GetDeletableResponseIds(&response_ids_, max_rowid_, kSqlLimit); | 1263 database_->GetDeletableResponseIds(&response_ids_, max_rowid_, kSqlLimit); |
1238 // TODO(michaeln): retrieve group_ids too | 1264 // TODO(michaeln): retrieve group_ids too |
1239 } | 1265 } |
1240 | 1266 |
1241 void AppCacheStorageImpl::GetDeletableResponseIdsTask::RunCompleted() { | 1267 void AppCacheStorageImpl::GetDeletableResponseIdsTask::RunCompleted() { |
1242 if (!response_ids_.empty()) | 1268 if (!response_ids_.empty()) |
1243 storage_->StartDeletingResponses(response_ids_); | 1269 storage_->StartDeletingResponses(response_ids_); |
1244 } | 1270 } |
1245 | 1271 |
1246 // InsertDeletableResponseIdsTask ------- | 1272 // InsertDeletableResponseIdsTask ------- |
1247 | 1273 |
1248 class AppCacheStorageImpl::InsertDeletableResponseIdsTask | 1274 class AppCacheStorageImpl::InsertDeletableResponseIdsTask |
1249 : public DatabaseTask { | 1275 : public DatabaseTask { |
1250 public: | 1276 public: |
1251 explicit InsertDeletableResponseIdsTask(AppCacheStorageImpl* storage) | 1277 explicit InsertDeletableResponseIdsTask(AppCacheStorageImpl* storage) |
1252 : DatabaseTask(storage) {} | 1278 : DatabaseTask(storage) {} |
1253 | 1279 |
1254 // DatabaseTask: | 1280 // DatabaseTask: |
1255 void Run() override; | 1281 void Run() override; |
1256 | 1282 |
1257 std::vector<int64> response_ids_; | 1283 std::vector<int64> response_ids_; |
1258 | 1284 |
1259 protected: | 1285 protected: |
1260 ~InsertDeletableResponseIdsTask() override {} | 1286 ~InsertDeletableResponseIdsTask() override {} |
1261 }; | 1287 }; |
1262 | 1288 |
1263 void AppCacheStorageImpl::InsertDeletableResponseIdsTask::Run() { | 1289 void AppCacheStorageImpl::InsertDeletableResponseIdsTask::Run() { |
1290 tracked_objects::ScopedTracker tracking_profile( | |
1291 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
1292 "AppCacheStorageImpl::InsertDeletableResponseIdsTask")); | |
1264 database_->InsertDeletableResponseIds(response_ids_); | 1293 database_->InsertDeletableResponseIds(response_ids_); |
1265 // TODO(michaeln): store group_ids too | 1294 // TODO(michaeln): store group_ids too |
1266 } | 1295 } |
1267 | 1296 |
1268 // DeleteDeletableResponseIdsTask ------- | 1297 // DeleteDeletableResponseIdsTask ------- |
1269 | 1298 |
1270 class AppCacheStorageImpl::DeleteDeletableResponseIdsTask | 1299 class AppCacheStorageImpl::DeleteDeletableResponseIdsTask |
1271 : public DatabaseTask { | 1300 : public DatabaseTask { |
1272 public: | 1301 public: |
1273 explicit DeleteDeletableResponseIdsTask(AppCacheStorageImpl* storage) | 1302 explicit DeleteDeletableResponseIdsTask(AppCacheStorageImpl* storage) |
1274 : DatabaseTask(storage) {} | 1303 : DatabaseTask(storage) {} |
1275 | 1304 |
1276 // DatabaseTask: | 1305 // DatabaseTask: |
1277 void Run() override; | 1306 void Run() override; |
1278 | 1307 |
1279 std::vector<int64> response_ids_; | 1308 std::vector<int64> response_ids_; |
1280 | 1309 |
1281 protected: | 1310 protected: |
1282 ~DeleteDeletableResponseIdsTask() override {} | 1311 ~DeleteDeletableResponseIdsTask() override {} |
1283 }; | 1312 }; |
1284 | 1313 |
1285 void AppCacheStorageImpl::DeleteDeletableResponseIdsTask::Run() { | 1314 void AppCacheStorageImpl::DeleteDeletableResponseIdsTask::Run() { |
1315 tracked_objects::ScopedTracker tracking_profile( | |
1316 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
1317 "AppCacheStorageImpl::DeleteDeletableResponseIdsTask")); | |
1286 database_->DeleteDeletableResponseIds(response_ids_); | 1318 database_->DeleteDeletableResponseIds(response_ids_); |
1287 } | 1319 } |
1288 | 1320 |
1289 // UpdateGroupLastAccessTimeTask ------- | 1321 // LazyUpdateLastAccessTimeTask ------- |
1290 | 1322 |
1291 class AppCacheStorageImpl::UpdateGroupLastAccessTimeTask | 1323 class AppCacheStorageImpl::LazyUpdateLastAccessTimeTask |
1292 : public DatabaseTask { | 1324 : public DatabaseTask { |
1293 public: | 1325 public: |
1294 UpdateGroupLastAccessTimeTask( | 1326 LazyUpdateLastAccessTimeTask( |
1295 AppCacheStorageImpl* storage, AppCacheGroup* group, base::Time time) | 1327 AppCacheStorageImpl* storage, AppCacheGroup* group, base::Time time) |
1296 : DatabaseTask(storage), group_id_(group->group_id()), | 1328 : DatabaseTask(storage), group_id_(group->group_id()), |
1297 last_access_time_(time) { | 1329 last_access_time_(time) { |
1298 storage->NotifyStorageAccessed(group->manifest_url().GetOrigin()); | 1330 storage->NotifyStorageAccessed(group->manifest_url().GetOrigin()); |
1299 } | 1331 } |
1300 | 1332 |
1301 // DatabaseTask: | 1333 // DatabaseTask: |
1302 void Run() override; | 1334 void Run() override; |
1335 void RunCompleted() override; | |
1303 | 1336 |
1304 protected: | 1337 protected: |
1305 ~UpdateGroupLastAccessTimeTask() override {} | 1338 ~LazyUpdateLastAccessTimeTask() override {} |
1306 | 1339 |
1307 private: | 1340 private: |
1308 int64 group_id_; | 1341 int64 group_id_; |
1309 base::Time last_access_time_; | 1342 base::Time last_access_time_; |
1310 }; | 1343 }; |
1311 | 1344 |
1312 void AppCacheStorageImpl::UpdateGroupLastAccessTimeTask::Run() { | 1345 void AppCacheStorageImpl::LazyUpdateLastAccessTimeTask::Run() { |
1313 database_->UpdateGroupLastAccessTime(group_id_, last_access_time_); | 1346 tracked_objects::ScopedTracker tracking_profile( |
1347 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
1348 "AppCacheStorageImpl::UpdateGroupLastAccessTimeTask")); | |
1349 database_->LazyUpdateLastAccessTime(group_id_, last_access_time_); | |
1314 } | 1350 } |
1315 | 1351 |
1352 void AppCacheStorageImpl::LazyUpdateLastAccessTimeTask::RunCompleted() { | |
1353 storage_->LazilyCommitLastAccessTimes(); | |
1354 } | |
1355 | |
1356 // CommitLastAccessTimesTask ------- | |
1357 | |
1358 class AppCacheStorageImpl::CommitLastAccessTimesTask | |
1359 : public DatabaseTask { | |
1360 public: | |
1361 CommitLastAccessTimesTask(AppCacheStorageImpl* storage) | |
1362 : DatabaseTask(storage) {} | |
1363 | |
1364 // DatabaseTask: | |
1365 void Run() override { | |
1366 database_->CommitLazyLastAccessTimes(); | |
1367 } | |
1368 | |
1369 protected: | |
1370 ~CommitLastAccessTimesTask() override {} | |
1371 }; | |
1316 | 1372 |
1317 // AppCacheStorageImpl --------------------------------------------------- | 1373 // AppCacheStorageImpl --------------------------------------------------- |
1318 | 1374 |
1319 AppCacheStorageImpl::AppCacheStorageImpl(AppCacheServiceImpl* service) | 1375 AppCacheStorageImpl::AppCacheStorageImpl(AppCacheServiceImpl* service) |
1320 : AppCacheStorage(service), | 1376 : AppCacheStorage(service), |
1321 is_incognito_(false), | 1377 is_incognito_(false), |
1322 is_response_deletion_scheduled_(false), | 1378 is_response_deletion_scheduled_(false), |
1323 did_start_deleting_responses_(false), | 1379 did_start_deleting_responses_(false), |
1324 last_deletable_response_rowid_(0), | 1380 last_deletable_response_rowid_(0), |
1325 database_(NULL), | 1381 database_(NULL), |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1393 if (is_disabled_) { | 1449 if (is_disabled_) { |
1394 delegate->OnCacheLoaded(NULL, id); | 1450 delegate->OnCacheLoaded(NULL, id); |
1395 return; | 1451 return; |
1396 } | 1452 } |
1397 | 1453 |
1398 AppCache* cache = working_set_.GetCache(id); | 1454 AppCache* cache = working_set_.GetCache(id); |
1399 if (cache) { | 1455 if (cache) { |
1400 delegate->OnCacheLoaded(cache, id); | 1456 delegate->OnCacheLoaded(cache, id); |
1401 if (cache->owning_group()) { | 1457 if (cache->owning_group()) { |
1402 scoped_refptr<DatabaseTask> update_task( | 1458 scoped_refptr<DatabaseTask> update_task( |
1403 new UpdateGroupLastAccessTimeTask( | 1459 new LazyUpdateLastAccessTimeTask( |
1404 this, cache->owning_group(), base::Time::Now())); | 1460 this, cache->owning_group(), base::Time::Now())); |
1405 update_task->Schedule(); | 1461 update_task->Schedule(); |
1406 } | 1462 } |
1407 return; | 1463 return; |
1408 } | 1464 } |
1409 scoped_refptr<CacheLoadTask> task(GetPendingCacheLoadTask(id)); | 1465 scoped_refptr<CacheLoadTask> task(GetPendingCacheLoadTask(id)); |
1410 if (task.get()) { | 1466 if (task.get()) { |
1411 task->AddDelegate(GetOrCreateDelegateReference(delegate)); | 1467 task->AddDelegate(GetOrCreateDelegateReference(delegate)); |
1412 return; | 1468 return; |
1413 } | 1469 } |
1414 task = new CacheLoadTask(id, this); | 1470 task = new CacheLoadTask(id, this); |
1415 task->AddDelegate(GetOrCreateDelegateReference(delegate)); | 1471 task->AddDelegate(GetOrCreateDelegateReference(delegate)); |
1416 task->Schedule(); | 1472 task->Schedule(); |
1417 pending_cache_loads_[id] = task.get(); | 1473 pending_cache_loads_[id] = task.get(); |
1418 } | 1474 } |
1419 | 1475 |
1420 void AppCacheStorageImpl::LoadOrCreateGroup( | 1476 void AppCacheStorageImpl::LoadOrCreateGroup( |
1421 const GURL& manifest_url, Delegate* delegate) { | 1477 const GURL& manifest_url, Delegate* delegate) { |
1422 DCHECK(delegate); | 1478 DCHECK(delegate); |
1423 if (is_disabled_) { | 1479 if (is_disabled_) { |
1424 delegate->OnGroupLoaded(NULL, manifest_url); | 1480 delegate->OnGroupLoaded(NULL, manifest_url); |
1425 return; | 1481 return; |
1426 } | 1482 } |
1427 | 1483 |
1428 AppCacheGroup* group = working_set_.GetGroup(manifest_url); | 1484 AppCacheGroup* group = working_set_.GetGroup(manifest_url); |
1429 if (group) { | 1485 if (group) { |
1430 delegate->OnGroupLoaded(group, manifest_url); | 1486 delegate->OnGroupLoaded(group, manifest_url); |
1431 scoped_refptr<DatabaseTask> update_task( | 1487 scoped_refptr<DatabaseTask> update_task( |
1432 new UpdateGroupLastAccessTimeTask( | 1488 new LazyUpdateLastAccessTimeTask( |
1433 this, group, base::Time::Now())); | 1489 this, group, base::Time::Now())); |
1434 update_task->Schedule(); | 1490 update_task->Schedule(); |
1435 return; | 1491 return; |
1436 } | 1492 } |
1437 | 1493 |
1438 scoped_refptr<GroupLoadTask> task(GetPendingGroupLoadTask(manifest_url)); | 1494 scoped_refptr<GroupLoadTask> task(GetPendingGroupLoadTask(manifest_url)); |
1439 if (task.get()) { | 1495 if (task.get()) { |
1440 task->AddDelegate(GetOrCreateDelegateReference(delegate)); | 1496 task->AddDelegate(GetOrCreateDelegateReference(delegate)); |
1441 return; | 1497 return; |
1442 } | 1498 } |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1684 did_start_deleting_responses_ = true; | 1740 did_start_deleting_responses_ = true; |
1685 deletable_response_ids_.insert( | 1741 deletable_response_ids_.insert( |
1686 deletable_response_ids_.end(), | 1742 deletable_response_ids_.end(), |
1687 response_ids.begin(), response_ids.end()); | 1743 response_ids.begin(), response_ids.end()); |
1688 if (!is_response_deletion_scheduled_) | 1744 if (!is_response_deletion_scheduled_) |
1689 ScheduleDeleteOneResponse(); | 1745 ScheduleDeleteOneResponse(); |
1690 } | 1746 } |
1691 | 1747 |
1692 void AppCacheStorageImpl::ScheduleDeleteOneResponse() { | 1748 void AppCacheStorageImpl::ScheduleDeleteOneResponse() { |
1693 DCHECK(!is_response_deletion_scheduled_); | 1749 DCHECK(!is_response_deletion_scheduled_); |
1694 const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(10); | 1750 const base::TimeDelta k10Millis = base::TimeDelta::FromMilliseconds(10); |
1695 base::MessageLoop::current()->PostDelayedTask( | 1751 base::MessageLoop::current()->PostDelayedTask( |
1696 FROM_HERE, | 1752 FROM_HERE, |
1697 base::Bind(&AppCacheStorageImpl::DeleteOneResponse, | 1753 base::Bind(&AppCacheStorageImpl::DeleteOneResponse, |
1698 weak_factory_.GetWeakPtr()), | 1754 weak_factory_.GetWeakPtr()), |
1699 kDelay); | 1755 k10Millis); |
1700 is_response_deletion_scheduled_ = true; | 1756 is_response_deletion_scheduled_ = true; |
1701 } | 1757 } |
1702 | 1758 |
1703 void AppCacheStorageImpl::DeleteOneResponse() { | 1759 void AppCacheStorageImpl::DeleteOneResponse() { |
1704 DCHECK(is_response_deletion_scheduled_); | 1760 DCHECK(is_response_deletion_scheduled_); |
1705 DCHECK(!deletable_response_ids_.empty()); | 1761 DCHECK(!deletable_response_ids_.empty()); |
1706 | 1762 |
1707 if (!disk_cache()) { | 1763 if (!disk_cache()) { |
1708 DCHECK(is_disabled_); | 1764 DCHECK(is_disabled_); |
1709 deletable_response_ids_.clear(); | 1765 deletable_response_ids_.clear(); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1856 base::Bind(base::IgnoreResult(&base::DeleteFile), cache_directory_, true), | 1912 base::Bind(base::IgnoreResult(&base::DeleteFile), cache_directory_, true), |
1857 base::Bind(&AppCacheStorageImpl::CallScheduleReinitialize, | 1913 base::Bind(&AppCacheStorageImpl::CallScheduleReinitialize, |
1858 weak_factory_.GetWeakPtr())); | 1914 weak_factory_.GetWeakPtr())); |
1859 } | 1915 } |
1860 | 1916 |
1861 void AppCacheStorageImpl::CallScheduleReinitialize() { | 1917 void AppCacheStorageImpl::CallScheduleReinitialize() { |
1862 service_->ScheduleReinitialize(); | 1918 service_->ScheduleReinitialize(); |
1863 // note: 'this' may be deleted at this point. | 1919 // note: 'this' may be deleted at this point. |
1864 } | 1920 } |
1865 | 1921 |
1922 void AppCacheStorageImpl::LazilyCommitLastAccessTimes() { | |
1923 if (lazy_commit_timer_.IsRunning()) | |
1924 return; | |
1925 const int k10Minutes = 10; | |
1926 lazy_commit_timer_.Start( | |
1927 FROM_HERE, base::TimeDelta::FromMinutes(k10Minutes), | |
1928 base::Bind(&AppCacheStorageImpl::OnCommitLastAccessTimes, | |
1929 weak_factory_.GetWeakPtr())); | |
1930 } | |
1931 | |
1932 void AppCacheStorageImpl::OnCommitLastAccessTimes() { | |
1933 lazy_commit_timer_.Stop(); | |
1934 if (is_disabled()) | |
1935 return; | |
1936 scoped_refptr<DatabaseTask> task(new CommitLastAccessTimesTask(this)); | |
1937 task->Schedule(); | |
1938 } | |
cmumford
2015/02/17 19:26:39
Space
michaeln
2015/02/17 19:46:26
Done.
| |
1866 } // namespace content | 1939 } // namespace content |
OLD | NEW |