// Copyright 2014 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.

#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_UNREGISTER_JOB_H_
#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_UNREGISTER_JOB_H_

#include <stdint.h>

#include <vector>

#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "content/browser/service_worker/service_worker_register_job_base.h"
#include "content/common/service_worker/service_worker_status_code.h"
#include "url/gurl.h"

namespace content {

class EmbeddedWorkerRegistry;
class ServiceWorkerContextCore;
class ServiceWorkerJobCoordinator;
class ServiceWorkerRegistration;
class ServiceWorkerStorage;

// Handles the unregistration of a Service Worker.
//
// The unregistration process is primarily cleanup, removing everything that was
// created during the registration process, including the
// ServiceWorkerRegistration itself.
class ServiceWorkerUnregisterJob : public ServiceWorkerRegisterJobBase {
 public:
  typedef base::Callback<void(int64_t registration_id,
                              ServiceWorkerStatusCode status)>
      UnregistrationCallback;

  ServiceWorkerUnregisterJob(base::WeakPtr<ServiceWorkerContextCore> context,
                             const GURL& pattern);
  ~ServiceWorkerUnregisterJob() override;

  // Registers a callback to be called when the job completes (whether
  // successfully or not). Multiple callbacks may be registered.
  void AddCallback(const UnregistrationCallback& callback);

  // ServiceWorkerRegisterJobBase implementation:
  void Start() override;
  void Abort() override;
  bool Equals(ServiceWorkerRegisterJobBase* job) const override;
  RegistrationJobType GetType() const override;

 private:
  void OnRegistrationFound(
      ServiceWorkerStatusCode status,
      const scoped_refptr<ServiceWorkerRegistration>& registration);
  void Complete(int64_t registration_id, ServiceWorkerStatusCode status);
  void CompleteInternal(int64_t registration_id,
                        ServiceWorkerStatusCode status);
  void ResolvePromise(int64_t registration_id, ServiceWorkerStatusCode status);

  base::WeakPtr<ServiceWorkerContextCore> context_;
  const GURL pattern_;
  std::vector<UnregistrationCallback> callbacks_;
  bool is_promise_resolved_;
  base::WeakPtrFactory<ServiceWorkerUnregisterJob> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(ServiceWorkerUnregisterJob);
};
}  // namespace content

#endif  // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_UNREGISTER_JOB_H_
