Chromium Code Reviews| 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/file_util.h" | 10 #include "base/file_util.h" |
| 11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 12 #include "base/sequenced_task_runner.h" | 12 #include "base/sequenced_task_runner.h" |
| 13 #include "base/task_runner_util.h" | 13 #include "base/task_runner_util.h" |
| 14 #include "content/browser/service_worker/service_worker_context_core.h" | 14 #include "content/browser/service_worker/service_worker_context_core.h" |
| 15 #include "content/browser/service_worker/service_worker_disk_cache.h" | 15 #include "content/browser/service_worker/service_worker_disk_cache.h" |
| 16 #include "content/browser/service_worker/service_worker_info.h" | 16 #include "content/browser/service_worker/service_worker_info.h" |
| 17 #include "content/browser/service_worker/service_worker_metrics.h" | 17 #include "content/browser/service_worker/service_worker_metrics.h" |
| 18 #include "content/browser/service_worker/service_worker_registration.h" | 18 #include "content/browser/service_worker/service_worker_registration.h" |
| 19 #include "content/browser/service_worker/service_worker_utils.h" | 19 #include "content/browser/service_worker/service_worker_utils.h" |
| 20 #include "content/browser/service_worker/service_worker_version.h" | 20 #include "content/browser/service_worker/service_worker_version.h" |
| 21 #include "content/common/service_worker/service_worker_types.h" | 21 #include "content/common/service_worker/service_worker_types.h" |
| 22 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 23 #include "net/base/io_buffer.h" | |
| 23 #include "net/base/net_errors.h" | 24 #include "net/base/net_errors.h" |
| 24 #include "webkit/browser/quota/quota_manager_proxy.h" | 25 #include "webkit/browser/quota/quota_manager_proxy.h" |
| 25 | 26 |
| 26 namespace content { | 27 namespace content { |
| 27 | 28 |
| 28 namespace { | 29 namespace { |
| 29 | 30 |
| 30 void RunSoon(const tracked_objects::Location& from_here, | 31 void RunSoon(const tracked_objects::Location& from_here, |
| 31 const base::Closure& closure) { | 32 const base::Closure& closure) { |
| 32 base::MessageLoop::current()->PostTask(from_here, closure); | 33 base::MessageLoop::current()->PostTask(from_here, closure); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 66 return SERVICE_WORKER_OK; | 67 return SERVICE_WORKER_OK; |
| 67 case ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND: | 68 case ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND: |
| 68 return SERVICE_WORKER_ERROR_NOT_FOUND; | 69 return SERVICE_WORKER_ERROR_NOT_FOUND; |
| 69 case ServiceWorkerDatabase::STATUS_ERROR_MAX: | 70 case ServiceWorkerDatabase::STATUS_ERROR_MAX: |
| 70 NOTREACHED(); | 71 NOTREACHED(); |
| 71 default: | 72 default: |
| 72 return SERVICE_WORKER_ERROR_FAILED; | 73 return SERVICE_WORKER_ERROR_FAILED; |
| 73 } | 74 } |
| 74 } | 75 } |
| 75 | 76 |
| 77 class CompareHelper : public base::RefCounted<CompareHelper> { | |
|
falken
2014/07/17 06:33:42
would ResponseComparer be a more descriptive name?
michaeln
2014/07/18 03:40:49
Done (classname but not comment since the name ind
| |
| 78 public: | |
| 79 CompareHelper( | |
| 80 base::WeakPtr<ServiceWorkerStorage> owner, | |
| 81 scoped_ptr<ServiceWorkerResponseReader> lhs, | |
| 82 scoped_ptr<ServiceWorkerResponseReader> rhs, | |
| 83 const ServiceWorkerStorage::CompareCallback& callback) | |
| 84 : owner_(owner), | |
| 85 completion_callback_(callback), | |
| 86 lhs_reader_(lhs.release()), | |
| 87 rhs_reader_(rhs.release()), | |
| 88 completion_count_(0), | |
| 89 previous_result_(0) { | |
| 90 } | |
| 91 | |
| 92 void Start(); | |
| 93 | |
| 94 private: | |
| 95 friend class base::RefCounted<CompareHelper>; | |
| 96 | |
| 97 static const int kBufferSize = 16 * 1024; | |
| 98 | |
| 99 ~CompareHelper() {} | |
| 100 void ReadInfos(); | |
| 101 void OnReadInfoComplete(int result); | |
| 102 void ReadSomeData(); | |
| 103 void OnReadDataComplete(int result); | |
| 104 | |
| 105 base::WeakPtr<ServiceWorkerStorage> owner_; | |
| 106 ServiceWorkerStorage::CompareCallback completion_callback_; | |
| 107 scoped_ptr<ServiceWorkerResponseReader> lhs_reader_; | |
| 108 scoped_refptr<HttpResponseInfoIOBuffer> lhs_info_; | |
| 109 scoped_refptr<net::IOBuffer> lhs_buffer_; | |
| 110 scoped_ptr<ServiceWorkerResponseReader> rhs_reader_; | |
| 111 scoped_refptr<HttpResponseInfoIOBuffer> rhs_info_; | |
| 112 scoped_refptr<net::IOBuffer> rhs_buffer_; | |
| 113 int completion_count_; | |
| 114 int previous_result_; | |
| 115 DISALLOW_COPY_AND_ASSIGN(CompareHelper); | |
| 116 }; | |
| 117 | |
| 118 void CompareHelper::Start() { | |
| 119 lhs_buffer_ = new net::IOBuffer(kBufferSize); | |
| 120 lhs_info_ = new HttpResponseInfoIOBuffer(); | |
| 121 rhs_buffer_ = new net::IOBuffer(kBufferSize); | |
| 122 rhs_info_ = new HttpResponseInfoIOBuffer(); | |
| 123 | |
| 124 ReadInfos(); | |
| 125 } | |
| 126 | |
| 127 void CompareHelper::ReadInfos() { | |
| 128 lhs_reader_->ReadInfo( | |
| 129 lhs_info_, | |
| 130 base::Bind(&CompareHelper::OnReadInfoComplete, | |
| 131 this)); | |
| 132 rhs_reader_->ReadInfo( | |
| 133 rhs_info_, | |
| 134 base::Bind(&CompareHelper::OnReadInfoComplete, | |
| 135 this)); | |
| 136 } | |
| 137 | |
| 138 void CompareHelper::OnReadInfoComplete(int result) { | |
| 139 if (completion_callback_.is_null() || !owner_) | |
| 140 return; | |
| 141 if (result < 0) { | |
| 142 completion_callback_.Run(SERVICE_WORKER_ERROR_FAILED, -1); | |
| 143 completion_callback_.Reset(); | |
| 144 return; | |
| 145 } | |
| 146 if (++(completion_count_) != 2) | |
|
falken
2014/07/17 06:33:42
nit: those parens look unnecessary to me
michaeln
2014/07/18 03:40:49
Done.
| |
| 147 return; | |
| 148 | |
| 149 if (lhs_info_->response_data_size != rhs_info_->response_data_size) { | |
| 150 completion_callback_.Run(SERVICE_WORKER_OK, -1); | |
|
falken
2014/07/17 06:33:42
nit: this seems another reason that "bool equals"
michaeln
2014/07/18 03:40:49
Done.
| |
| 151 return; | |
| 152 } | |
| 153 ReadSomeData(); | |
| 154 } | |
| 155 | |
| 156 void CompareHelper::ReadSomeData() { | |
| 157 completion_count_ = 0; | |
| 158 lhs_reader_->ReadData( | |
| 159 lhs_buffer_, | |
| 160 kBufferSize, | |
| 161 base::Bind(&CompareHelper::OnReadDataComplete, this)); | |
| 162 rhs_reader_->ReadData( | |
| 163 rhs_buffer_, | |
| 164 kBufferSize, | |
| 165 base::Bind(&CompareHelper::OnReadDataComplete, this)); | |
| 166 } | |
| 167 | |
| 168 void CompareHelper::OnReadDataComplete(int result) { | |
| 169 if (completion_callback_.is_null() || !owner_) | |
| 170 return; | |
| 171 if (result < 0) { | |
| 172 completion_callback_.Run(SERVICE_WORKER_ERROR_FAILED, -1); | |
| 173 completion_callback_.Reset(); | |
| 174 return; | |
| 175 } | |
| 176 if (++(completion_count_) != 2) { | |
|
falken
2014/07/17 06:33:42
nit: i prefer removing those parens
michaeln
2014/07/18 03:40:48
Done.
| |
| 177 previous_result_ = result; | |
| 178 return; | |
| 179 } | |
| 180 | |
| 181 if (result != previous_result_) { | |
|
falken
2014/07/17 06:33:42
I was confused at first. I see that lhs and rhs mu
michaeln
2014/07/18 03:40:49
Good questin, I'm not sure if it's guaranteed to a
| |
| 182 completion_callback_.Run(SERVICE_WORKER_ERROR_FAILED, -1); | |
| 183 return; | |
| 184 } | |
| 185 | |
| 186 if (result == 0) { | |
| 187 completion_callback_.Run(SERVICE_WORKER_OK, 0); | |
| 188 return; | |
| 189 } | |
| 190 | |
| 191 int compare_result = | |
| 192 memcmp(lhs_buffer_->data(), rhs_buffer_->data(), result); | |
| 193 if (compare_result != 0) { | |
| 194 completion_callback_.Run(SERVICE_WORKER_OK, compare_result); | |
| 195 return; | |
| 196 } | |
| 197 | |
| 198 ReadSomeData(); | |
| 199 } | |
| 200 | |
| 76 } // namespace | 201 } // namespace |
| 77 | 202 |
| 78 ServiceWorkerStorage::InitialData::InitialData() | 203 ServiceWorkerStorage::InitialData::InitialData() |
| 79 : next_registration_id(kInvalidServiceWorkerRegistrationId), | 204 : next_registration_id(kInvalidServiceWorkerRegistrationId), |
| 80 next_version_id(kInvalidServiceWorkerVersionId), | 205 next_version_id(kInvalidServiceWorkerVersionId), |
| 81 next_resource_id(kInvalidServiceWorkerResourceId) { | 206 next_resource_id(kInvalidServiceWorkerResourceId) { |
| 82 } | 207 } |
| 83 | 208 |
| 84 ServiceWorkerStorage::InitialData::~InitialData() { | 209 ServiceWorkerStorage::InitialData::~InitialData() { |
| 85 } | 210 } |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 DCHECK_NE(kInvalidServiceWorkerResponseId, id); | 510 DCHECK_NE(kInvalidServiceWorkerResponseId, id); |
| 386 database_task_runner_->PostTask( | 511 database_task_runner_->PostTask( |
| 387 FROM_HERE, | 512 FROM_HERE, |
| 388 base::Bind(base::IgnoreResult( | 513 base::Bind(base::IgnoreResult( |
| 389 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), | 514 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), |
| 390 base::Unretained(database_.get()), | 515 base::Unretained(database_.get()), |
| 391 std::set<int64>(&id, &id + 1))); | 516 std::set<int64>(&id, &id + 1))); |
| 392 StartPurgingResources(std::vector<int64>(1, id)); | 517 StartPurgingResources(std::vector<int64>(1, id)); |
| 393 } | 518 } |
| 394 | 519 |
| 520 void ServiceWorkerStorage::CompareScriptResources( | |
| 521 int64 lhs_id, int64 rhs_id, | |
| 522 const CompareCallback& callback) { | |
| 523 DCHECK(!callback.is_null()); | |
| 524 scoped_refptr<CompareHelper> helper = | |
| 525 new CompareHelper(weak_factory_.GetWeakPtr(), | |
| 526 CreateResponseReader(lhs_id), | |
| 527 CreateResponseReader(rhs_id), | |
| 528 callback); | |
| 529 helper->Start(); // It deletes itself when done. | |
| 530 } | |
| 531 | |
| 395 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { | 532 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { |
| 396 Disable(); | 533 Disable(); |
| 397 | 534 |
| 398 // Delete the database on the database thread. | 535 // Delete the database on the database thread. |
| 399 PostTaskAndReplyWithResult( | 536 PostTaskAndReplyWithResult( |
| 400 database_task_runner_, | 537 database_task_runner_, |
| 401 FROM_HERE, | 538 FROM_HERE, |
| 402 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, | 539 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, |
| 403 base::Unretained(database_.get())), | 540 base::Unretained(database_.get())), |
| 404 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, | 541 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 754 | 891 |
| 755 registration = new ServiceWorkerRegistration( | 892 registration = new ServiceWorkerRegistration( |
| 756 data.scope, data.script, data.registration_id, context_); | 893 data.scope, data.script, data.registration_id, context_); |
| 757 scoped_refptr<ServiceWorkerVersion> version = | 894 scoped_refptr<ServiceWorkerVersion> version = |
| 758 context_->GetLiveVersion(data.version_id); | 895 context_->GetLiveVersion(data.version_id); |
| 759 if (!version) { | 896 if (!version) { |
| 760 version = new ServiceWorkerVersion(registration, data.version_id, context_); | 897 version = new ServiceWorkerVersion(registration, data.version_id, context_); |
| 761 version->SetStatus(data.is_active ? | 898 version->SetStatus(data.is_active ? |
| 762 ServiceWorkerVersion::ACTIVATED : ServiceWorkerVersion::INSTALLED); | 899 ServiceWorkerVersion::ACTIVATED : ServiceWorkerVersion::INSTALLED); |
| 763 version->script_cache_map()->SetResources(resources); | 900 version->script_cache_map()->SetResources(resources); |
| 901 | |
| 902 // TODO(michaeln): need to activate a waiting version that wasn't | |
| 903 // actrivated in an earlier session, maybe test for this condition | |
| 904 // (waitingversion and no activeversion) when navigating to a page? | |
| 764 } | 905 } |
| 765 | 906 |
| 766 if (version->status() == ServiceWorkerVersion::ACTIVATED) | 907 if (version->status() == ServiceWorkerVersion::ACTIVATED) { |
| 767 registration->SetActiveVersion(version); | 908 registration->SetActiveVersion(version); |
| 768 else if (version->status() == ServiceWorkerVersion::INSTALLED) | 909 } else if (version->status() == ServiceWorkerVersion::INSTALLED) { |
| 769 registration->SetWaitingVersion(version); | 910 registration->SetWaitingVersion(version); |
| 770 else | 911 } else { |
| 771 NOTREACHED(); | 912 NOTREACHED(); |
| 772 // TODO(michaeln): Hmmm, what if DeleteReg was invoked after | 913 } |
|
falken
2014/07/17 06:33:42
nit: these braces aren't neeeded
michaeln
2014/07/18 03:40:49
Done.
| |
| 773 // the Find result we're returning here? NOTREACHED condition? | |
| 774 return registration; | 914 return registration; |
| 775 } | 915 } |
| 776 | 916 |
| 777 ServiceWorkerRegistration* | 917 ServiceWorkerRegistration* |
| 778 ServiceWorkerStorage::FindInstallingRegistrationForDocument( | 918 ServiceWorkerStorage::FindInstallingRegistrationForDocument( |
| 779 const GURL& document_url) { | 919 const GURL& document_url) { |
| 780 DCHECK(!document_url.has_ref()); | 920 DCHECK(!document_url.has_ref()); |
| 781 | 921 |
| 782 LongestScopeMatcher matcher(document_url); | 922 LongestScopeMatcher matcher(document_url); |
| 783 ServiceWorkerRegistration* match = NULL; | 923 ServiceWorkerRegistration* match = NULL; |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1176 // Give up the corruption recovery until the browser restarts. | 1316 // Give up the corruption recovery until the browser restarts. |
| 1177 LOG(ERROR) << "Failed to delete the diskcache."; | 1317 LOG(ERROR) << "Failed to delete the diskcache."; |
| 1178 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1318 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 1179 return; | 1319 return; |
| 1180 } | 1320 } |
| 1181 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1321 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
| 1182 callback.Run(SERVICE_WORKER_OK); | 1322 callback.Run(SERVICE_WORKER_OK); |
| 1183 } | 1323 } |
| 1184 | 1324 |
| 1185 } // namespace content | 1325 } // namespace content |
| OLD | NEW |