1e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// found in the LICENSE file.
4e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/service_worker/service_worker_unregister_job.h"
6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/memory/weak_ptr.h"
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_context_core.h"
9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/service_worker/service_worker_job_coordinator.h"
10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/service_worker/service_worker_registration.h"
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/service_worker/service_worker_storage.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_utils.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_version.h"
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace content {
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochtypedef ServiceWorkerRegisterJobBase::RegistrationJobType RegistrationJobType;
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochServiceWorkerUnregisterJob::ServiceWorkerUnregisterJob(
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::WeakPtr<ServiceWorkerContextCore> context,
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const GURL& pattern)
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : context_(context),
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      pattern_(pattern),
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      is_promise_resolved_(false),
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      weak_factory_(this) {
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochServiceWorkerUnregisterJob::~ServiceWorkerUnregisterJob() {}
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid ServiceWorkerUnregisterJob::AddCallback(
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const UnregistrationCallback& callback) {
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  callbacks_.push_back(callback);
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid ServiceWorkerUnregisterJob::Start() {
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  context_->storage()->FindRegistrationForPattern(
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      pattern_,
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&ServiceWorkerUnregisterJob::OnRegistrationFound,
39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                 weak_factory_.GetWeakPtr()));
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ServiceWorkerUnregisterJob::Abort() {
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CompleteInternal(SERVICE_WORKER_ERROR_ABORT);
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool ServiceWorkerUnregisterJob::Equals(ServiceWorkerRegisterJobBase* job) {
47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (job->GetType() != GetType())
48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return false;
49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return static_cast<ServiceWorkerUnregisterJob*>(job)->pattern_ == pattern_;
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochRegistrationJobType ServiceWorkerUnregisterJob::GetType() {
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return UNREGISTRATION_JOB;
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceWorkerUnregisterJob::OnRegistrationFound(
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ServiceWorkerStatusCode status,
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const scoped_refptr<ServiceWorkerRegistration>& registration) {
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (status == SERVICE_WORKER_ERROR_NOT_FOUND) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(!registration.get());
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Complete(SERVICE_WORKER_ERROR_NOT_FOUND);
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (status != SERVICE_WORKER_OK || registration->is_uninstalling()) {
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Complete(status);
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO: "7. If registration.updatePromise is not null..."
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // "8. Resolve promise."
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ResolvePromise(SERVICE_WORKER_OK);
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  registration->ClearWhenReady();
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Complete(SERVICE_WORKER_OK);
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid ServiceWorkerUnregisterJob::Complete(ServiceWorkerStatusCode status) {
816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CompleteInternal(status);
826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  context_->job_coordinator()->FinishJob(pattern_, this);
836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ServiceWorkerUnregisterJob::CompleteInternal(
866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ServiceWorkerStatusCode status) {
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!is_promise_resolved_)
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ResolvePromise(status);
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceWorkerUnregisterJob::ResolvePromise(
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ServiceWorkerStatusCode status) {
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(!is_promise_resolved_);
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  is_promise_resolved_ = true;
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (std::vector<UnregistrationCallback>::iterator it = callbacks_.begin();
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch       it != callbacks_.end();
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch       ++it) {
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    it->Run(status);
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace content
103