dom/serviceworkers/ServiceWorkerUpdateJob.h
author Nika Layzell <nika@thelayzells.com>
Thu, 06 Aug 2020 14:04:13 +0000
changeset 544125 ee09cb88af177571304759bc05c760e3d82fd1ed
parent 509294 889c88363688e7e64b669b3c155852e7f6cb49b8
permissions -rw-r--r--
Bug 1656854 - Part 2: Add a BrowsingContextGroup keepalive to BrowserParent shutdown, r=farre In bug 1652085, I added BrowsingContextGroup keepalives while waiting for replies to the discard message, however that message isn't actually sent to the current owner process. Instead, the BrowsingContext is discarded by the PBrowser being destroyed. This should help ensure we also keep the group alive during normal BrowserParent destruction. Differential Revision: https://phabricator.services.mozilla.com/D85897

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_dom_serviceworkerupdatejob_h
#define mozilla_dom_serviceworkerupdatejob_h

#include "ServiceWorkerJob.h"
#include "ServiceWorkerRegistration.h"

namespace mozilla {
namespace dom {

namespace serviceWorkerScriptCache {
enum class OnFailure : uint8_t;
}  // namespace serviceWorkerScriptCache

class ServiceWorkerManager;
class ServiceWorkerRegistrationInfo;

// A job class that performs the Update and Install algorithms from the
// service worker spec.  This class is designed to be inherited and customized
// as a different job type.  This is necessary because the register job
// performs largely the same operations as the update job, but has a few
// different starting steps.
class ServiceWorkerUpdateJob : public ServiceWorkerJob {
 public:
  // Construct an update job to be used only for updates.
  ServiceWorkerUpdateJob(nsIPrincipal* aPrincipal, const nsACString& aScope,
                         nsCString aScriptSpec,
                         ServiceWorkerUpdateViaCache aUpdateViaCache);

  already_AddRefed<ServiceWorkerRegistrationInfo> GetRegistration() const;

 protected:
  // Construct an update job that is overriden as another job type.
  ServiceWorkerUpdateJob(Type aType, nsIPrincipal* aPrincipal,
                         const nsACString& aScope, nsCString aScriptSpec,
                         ServiceWorkerUpdateViaCache aUpdateViaCache);

  virtual ~ServiceWorkerUpdateJob();

  // FailUpdateJob() must be called if an update job needs Finish() with
  // an error.
  void FailUpdateJob(ErrorResult& aRv);

  void FailUpdateJob(nsresult aRv);

  // The entry point when the update job is being used directly.  Job
  // types overriding this class should override this method to
  // customize behavior.
  virtual void AsyncExecute() override;

  // Set the registration to be operated on by Update() or to be immediately
  // returned as a result of the job.  This must be called before Update().
  void SetRegistration(ServiceWorkerRegistrationInfo* aRegistration);

  // Execute the bulk of the update job logic using the registration defined
  // by a previous SetRegistration() call.  This can be called by the overriden
  // AsyncExecute() to complete the job.  The Update() method will always call
  // Finish().  This method corresponds to the spec Update algorithm.
  void Update();

  ServiceWorkerUpdateViaCache GetUpdateViaCache() const;

 private:
  class CompareCallback;
  class ContinueUpdateRunnable;
  class ContinueInstallRunnable;

  // Utility method called after a script is loaded and compared to
  // our current cached script.
  void ComparisonResult(nsresult aStatus, bool aInCacheAndEqual,
                        serviceWorkerScriptCache::OnFailure aOnFailure,
                        const nsAString& aNewCacheName,
                        const nsACString& aMaxScope, nsLoadFlags aLoadFlags);

  // Utility method called after evaluating the worker script.
  void ContinueUpdateAfterScriptEval(bool aScriptEvaluationResult);

  // Utility method corresponding to the spec Install algorithm.
  void Install();

  // Utility method called after the install event is handled.
  void ContinueAfterInstallEvent(bool aInstallEventSuccess);

  RefPtr<ServiceWorkerRegistrationInfo> mRegistration;
  ServiceWorkerUpdateViaCache mUpdateViaCache;
  serviceWorkerScriptCache::OnFailure mOnFailure;
};

}  // namespace dom
}  // namespace mozilla

#endif  // mozilla_dom_serviceworkerupdatejob_h