dom/serviceworkers/FetchEventOpChild.h
author Nika Layzell <nika@thelayzells.com>
Thu, 06 Aug 2020 14:04:13 +0000
changeset 544125 ee09cb88af177571304759bc05c760e3d82fd1ed
parent 514512 ba82dc114a305afe246fd559f08922e8977eff0f
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_fetcheventopchild_h__
#define mozilla_dom_fetcheventopchild_h__

#include "nsCOMPtr.h"

#include "mozilla/MozPromise.h"
#include "mozilla/RefPtr.h"
#include "mozilla/dom/PFetchEventOpChild.h"
#include "mozilla/dom/ServiceWorkerOpArgs.h"

class nsIInterceptedChannel;

namespace mozilla {
namespace dom {

class KeepAliveToken;
class PRemoteWorkerControllerChild;
class ServiceWorkerRegistrationInfo;

/**
 * FetchEventOpChild represents an in-flight FetchEvent operation.
 */
class FetchEventOpChild final : public PFetchEventOpChild {
  friend class PFetchEventOpChild;

 public:
  static RefPtr<GenericPromise> SendFetchEvent(
      PRemoteWorkerControllerChild* aManager,
      ServiceWorkerFetchEventOpArgs&& aArgs,
      nsCOMPtr<nsIInterceptedChannel> aInterceptedChannel,
      RefPtr<ServiceWorkerRegistrationInfo> aRegistrationInfo,
      RefPtr<KeepAliveToken>&& aKeepAliveToken);

  ~FetchEventOpChild();

 private:
  FetchEventOpChild(ServiceWorkerFetchEventOpArgs&& aArgs,
                    nsCOMPtr<nsIInterceptedChannel>&& aInterceptedChannel,
                    RefPtr<ServiceWorkerRegistrationInfo>&& aRegistrationInfo,
                    RefPtr<KeepAliveToken>&& aKeepAliveToken);

  mozilla::ipc::IPCResult RecvAsyncLog(const nsCString& aScriptSpec,
                                       const uint32_t& aLineNumber,
                                       const uint32_t& aColumnNumber,
                                       const nsCString& aMessageName,
                                       nsTArray<nsString>&& aParams);

  mozilla::ipc::IPCResult RecvRespondWith(
      IPCFetchEventRespondWithResult&& aResult);

  mozilla::ipc::IPCResult Recv__delete__(
      const ServiceWorkerFetchEventOpResult& aResult);

  void ActorDestroy(ActorDestroyReason) override;

  nsresult StartSynthesizedResponse(IPCSynthesizeResponseArgs&& aArgs);

  void SynthesizeResponse(IPCSynthesizeResponseArgs&& aArgs);

  void ResetInterception();

  void CancelInterception(nsresult aStatus);

  void MaybeScheduleRegistrationUpdate() const;

  const ServiceWorkerFetchEventOpArgs mArgs;
  nsCOMPtr<nsIInterceptedChannel> mInterceptedChannel;
  RefPtr<ServiceWorkerRegistrationInfo> mRegistration;
  RefPtr<KeepAliveToken> mKeepAliveToken;
  bool mInterceptedChannelHandled = false;
  MozPromiseHolder<GenericPromise> mPromiseHolder;
};

}  // namespace dom
}  // namespace mozilla

#endif  // mozilla_dom_fetcheventopchild_h__