| Index: content/browser/service_worker/service_worker_register_job.cc
|
| diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..51ae40ff6a011be624a8a41e5527019e6aad6a2e
|
| --- /dev/null
|
| +++ b/content/browser/service_worker/service_worker_register_job.cc
|
| @@ -0,0 +1,118 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/browser/service_worker/service_worker_register_job.h"
|
| +
|
| +#include "content/browser/service_worker/service_worker_registration.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace content {
|
| +
|
| +ServiceWorkerRegisterJob::ServiceWorkerRegisterJob(
|
| + const base::WeakPtr<ServiceWorkerStorage>& storage,
|
| + const RegistrationCompleteCallback& callback)
|
| + : storage_(storage), callback_(callback), weak_factory_(this) {}
|
| +
|
| +ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() {}
|
| +
|
| +void ServiceWorkerRegisterJob::StartRegister(const GURL& pattern,
|
| + const GURL& script_url) {
|
| + // Set up a chain of callbacks, in reverse order. Each of these
|
| + // callbacks may be called asynchronously by the previous callback.
|
| + ServiceWorkerStorage::RegistrationCallback finish_registration(base::Bind(
|
| + &ServiceWorkerRegisterJob::RegisterComplete, weak_factory_.GetWeakPtr()));
|
| +
|
| + ServiceWorkerStorage::UnregistrationCallback register_new(
|
| + base::Bind(&ServiceWorkerRegisterJob::RegisterPatternAndContinue,
|
| + weak_factory_.GetWeakPtr(),
|
| + pattern,
|
| + script_url,
|
| + finish_registration));
|
| +
|
| + ServiceWorkerStorage::RegistrationCallback unregister_old(
|
| + base::Bind(&ServiceWorkerRegisterJob::UnregisterPatternAndContinue,
|
| + weak_factory_.GetWeakPtr(),
|
| + pattern,
|
| + script_url,
|
| + register_new));
|
| +
|
| + storage_->FindRegistrationForPattern(pattern, unregister_old);
|
| +}
|
| +
|
| +void ServiceWorkerRegisterJob::StartUnregister(const GURL& pattern) {
|
| + // Set up a chain of callbacks, in reverse order. Each of these
|
| + // callbacks may be called asynchronously by the previous callback.
|
| + ServiceWorkerStorage::UnregistrationCallback finish_unregistration(
|
| + base::Bind(&ServiceWorkerRegisterJob::UnregisterComplete,
|
| + weak_factory_.GetWeakPtr()));
|
| +
|
| + ServiceWorkerStorage::RegistrationCallback unregister(
|
| + base::Bind(&ServiceWorkerRegisterJob::UnregisterPatternAndContinue,
|
| + weak_factory_.GetWeakPtr(),
|
| + pattern,
|
| + GURL(),
|
| + finish_unregistration));
|
| +
|
| + storage_->FindRegistrationForPattern(pattern, unregister);
|
| +}
|
| +
|
| +void ServiceWorkerRegisterJob::RegisterPatternAndContinue(
|
| + const GURL& pattern,
|
| + const GURL& script_url,
|
| + const ServiceWorkerStorage::RegistrationCallback& callback,
|
| + ServiceWorkerRegistrationStatus previous_status) {
|
| + if (previous_status != REGISTRATION_OK &&
|
| + previous_status != REGISTRATION_NOT_FOUND) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO,
|
| + FROM_HERE,
|
| + base::Bind(callback,
|
| + previous_status,
|
| + scoped_refptr<ServiceWorkerRegistration>()));
|
| + }
|
| +
|
| + // TODO: Eventually RegisterInternal will be replaced by an asynchronous
|
| + // operation. Pass its resulting status through 'callback'.
|
| + scoped_refptr<ServiceWorkerRegistration> registration =
|
| + storage_->RegisterInternal(pattern, script_url);
|
| + BrowserThread::PostTask(BrowserThread::IO,
|
| + FROM_HERE,
|
| + base::Bind(callback, REGISTRATION_OK, registration));
|
| +}
|
| +
|
| +void ServiceWorkerRegisterJob::UnregisterPatternAndContinue(
|
| + const GURL& pattern,
|
| + const GURL& new_script_url,
|
| + const ServiceWorkerStorage::UnregistrationCallback& callback,
|
| + ServiceWorkerRegistrationStatus previous_status,
|
| + const scoped_refptr<ServiceWorkerRegistration>& previous_registration) {
|
| + DCHECK(previous_status == REGISTRATION_OK ||
|
| + previous_status == REGISTRATION_NOT_FOUND);
|
| +
|
| + // The previous registration may not exist, which is ok.
|
| + if (previous_status == REGISTRATION_OK &&
|
| + (new_script_url.is_empty() ||
|
| + previous_registration->script_url() != new_script_url)) {
|
| + // TODO: Eventually UnregisterInternal will be replaced by an
|
| + // asynchronous operation. Pass its resulting status though
|
| + // 'callback'.
|
| + storage_->UnregisterInternal(pattern);
|
| + }
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE, base::Bind(callback, previous_status));
|
| +}
|
| +
|
| +void ServiceWorkerRegisterJob::UnregisterComplete(
|
| + ServiceWorkerRegistrationStatus status) {
|
| + callback_.Run(this, status, NULL);
|
| +}
|
| +
|
| +void ServiceWorkerRegisterJob::RegisterComplete(
|
| + ServiceWorkerRegistrationStatus status,
|
| + const scoped_refptr<ServiceWorkerRegistration>& registration) {
|
| + callback_.Run(this, status, registration);
|
| +}
|
| +
|
| +} // namespace content
|
|
|