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