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

Unified Diff: content/browser/service_worker/service_worker_job_coordinator.cc

Issue 126603002: Implement registration job ordering (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix comments in tests Created 6 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/service_worker/service_worker_job_coordinator.cc
diff --git a/content/browser/service_worker/service_worker_job_coordinator.cc b/content/browser/service_worker/service_worker_job_coordinator.cc
index 16f92adf8dff82451afd67fb90218d92f22e2cc0..3495ba311118c5a31a496ac164990af1c81320f3 100644
--- a/content/browser/service_worker/service_worker_job_coordinator.cc
+++ b/content/browser/service_worker/service_worker_job_coordinator.cc
@@ -4,6 +4,7 @@
#include "content/browser/service_worker/service_worker_job_coordinator.h"
+#include "base/stl_util.h"
#include "content/browser/service_worker/service_worker_registration.h"
namespace content {
@@ -12,43 +13,77 @@ ServiceWorkerJobCoordinator::ServiceWorkerJobCoordinator(
const base::WeakPtr<ServiceWorkerStorage>& storage)
: storage_(storage), weak_factory_(this) {}
-ServiceWorkerJobCoordinator::~ServiceWorkerJobCoordinator() {}
+ServiceWorkerJobCoordinator::~ServiceWorkerJobCoordinator() {
+ for (RegistrationJobMap::iterator it = jobs_.begin(); it != jobs_.end();
+ ++it) {
+ STLDeleteElements(&it->second);
+ }
+}
void ServiceWorkerJobCoordinator::Register(
const GURL& pattern,
const GURL& script_url,
const ServiceWorkerRegisterJob::RegistrationCallback& callback) {
- scoped_ptr<ServiceWorkerRegisterJob> job(new ServiceWorkerRegisterJob(
- storage_,
- base::Bind(&ServiceWorkerJobCoordinator::RegisterComplete,
- weak_factory_.GetWeakPtr(),
- callback)));
- job->StartRegister(pattern, script_url);
- registration_jobs_.push_back(job.release());
+ ServiceWorkerRegisterJob* job;
kinuko 2014/01/08 08:38:36 Please initialize with NULL etc
alecflett 2014/01/08 23:59:16 Done.
+
+ if (MostRecentJobEquals(
+ pattern, script_url, ServiceWorkerRegisterJob::REGISTER))
+ job = *jobs_.find(pattern)->second.rbegin();
+ else {
+ job = new ServiceWorkerRegisterJob(storage_,
+ this,
+ pattern,
+ script_url,
+ ServiceWorkerRegisterJob::REGISTER);
+ jobs_[pattern].push_back(job);
+
+ // If this is the first job for this pattern, start it. Otherwise,
+ // starting it will be kicked off by the completion of the
+ // previous job.
+ if (jobs_[pattern].size() == 1)
+ job->Start();
+ }
+
+ job->AddCallback(base::Bind(&ServiceWorkerJobCoordinator::RegisterComplete,
+ weak_factory_.GetWeakPtr(),
+ callback));
kinuko 2014/01/08 08:38:36 This code path is mostly same as that of Unregiste
alecflett 2014/01/08 23:59:16 I like it. I'll give it a try.
}
void ServiceWorkerJobCoordinator::Unregister(
const GURL& pattern,
const ServiceWorkerRegisterJob::UnregistrationCallback& callback) {
- scoped_ptr<ServiceWorkerRegisterJob> job(new ServiceWorkerRegisterJob(
- storage_,
- base::Bind(&ServiceWorkerJobCoordinator::UnregisterComplete,
- weak_factory_.GetWeakPtr(),
- callback)));
- job->StartUnregister(pattern);
- registration_jobs_.push_back(job.release());
-}
+ ServiceWorkerRegisterJob* job;
-void ServiceWorkerJobCoordinator::EraseJob(ServiceWorkerRegisterJob* job) {
- ScopedVector<ServiceWorkerRegisterJob>::iterator job_position =
- registration_jobs_.begin();
- for (; job_position != registration_jobs_.end(); ++job_position) {
- if (*job_position == job) {
- registration_jobs_.erase(job_position);
- return;
- }
+ if (MostRecentJobEquals(
+ pattern, GURL(), ServiceWorkerRegisterJob::UNREGISTER))
+ job = *jobs_.find(pattern)->second.rbegin();
+ else {
+ job = new ServiceWorkerRegisterJob(
+ storage_, this, pattern, GURL(), ServiceWorkerRegisterJob::UNREGISTER);
+ jobs_[pattern].push_back(job);
+
+ // If this is the first job for this pattern, start it. Otherwise,
+ // starting it will be kicked off by the completion of the
+ // previous job.
+ if (jobs_[pattern].size() == 1)
+ job->Start();
}
- NOTREACHED() << "Deleting non-existent job. ";
+
+ job->AddCallback(base::Bind(&ServiceWorkerJobCoordinator::UnregisterComplete,
+ weak_factory_.GetWeakPtr(),
+ callback));
+}
+
+void ServiceWorkerJobCoordinator::FinishJob(ServiceWorkerRegisterJob* job) {
+ RegistrationJobMap::iterator pending_jobs = jobs_.find(job->pattern());
+ DCHECK(pending_jobs != jobs_.end()) << "Deleting non-existent job.";
+ DCHECK(job == *pending_jobs->second.begin());
+ pending_jobs->second.erase(pending_jobs->second.begin());
+ if (pending_jobs->second.size() == 0)
+ jobs_.erase(pending_jobs);
+ else
+ // queue up the next job here?
+ (*pending_jobs->second.begin())->Start();
}
void ServiceWorkerJobCoordinator::RegisterComplete(
@@ -57,7 +92,6 @@ void ServiceWorkerJobCoordinator::RegisterComplete(
ServiceWorkerRegistrationStatus status,
ServiceWorkerRegistration* registration) {
callback.Run(status, registration);
- EraseJob(job);
}
void ServiceWorkerJobCoordinator::UnregisterComplete(
@@ -66,7 +100,21 @@ void ServiceWorkerJobCoordinator::UnregisterComplete(
ServiceWorkerRegistrationStatus status,
ServiceWorkerRegistration* previous_registration) {
callback.Run(status);
- EraseJob(job);
+}
+
+bool ServiceWorkerJobCoordinator::MostRecentJobEquals(
+ const GURL& pattern,
+ const GURL& script_url,
+ ServiceWorkerRegisterJob::RegistrationType type) {
+ RegistrationJobMap::const_iterator it = jobs_.find(pattern);
+ if (it == jobs_.end())
+ return false;
+
+ if (it->second.size() == 0)
+ return false;
+
+ return ((*it->second.rbegin())->type() == type &&
+ (*it->second.rbegin())->script_url() == script_url);
kinuko 2014/01/08 08:38:36 This line 116-117 could be probably separated out
alecflett 2014/01/08 23:59:16 Done.
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698