Ensure that all async IPC calls made on ServiceWorkerRegistration (which includes calls made on behalf of NavigationPreloadManager) hold a strong reference to the ServiceWorkerRegistration for the duration of the async IPC calls so that the ServiceWorkerRegistration is not cycle-collected if the caller is only then-ing on the promise and has not retained a strong reference to the ServiceWorkerRegistration. This is accomplished by holding a strong self-reference in the IPC-resolved callback. In order to ensure that these strong references are properly cleaned up on the main thread, we: - Add a call to Shutdown during DisconnectFromOwner to shutdown IPC when the global is being torn down. - Modernize PServiceWorkerRegistration to allow the child to directly invoke `Send__delete__` rather than having to ask the parent to call that method via `SendTeardown`. This ensures the actor is destroyed in a more timely fashion and generally makes things easier to reason about. - Eliminate use of boolean flags that are redundant with what `CanSend()` indicates (as long as we call it on the thread that owns the actor). The Shutdown call isn't technically needed on the worker thread because worker shutdown tears down PBackground and thereby all PServiceWorkerRegistration instances, although these cleanups make that cleanup happen in a more timely fashion. Additionally, ServiceWorkerRegistrationChild does use IPCWorkerRef with the callback triggering eager shutdown of the actor on workers (notify(Canceling) can occur prior to DisconnectFromOwner when the interrupt is used), but the more notable impact is IPCWorkerRef causes the actor to not be counted as something that should prevent GC of the worker (and these changes do not alter that). Differential Revision: https://phabricator.services.mozilla.com/D242885
61 lines
2.1 KiB
C++
61 lines
2.1 KiB
C++
/* -*- 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_serviceworkerregistrationparent_h__
|
|
#define mozilla_dom_serviceworkerregistrationparent_h__
|
|
|
|
#include "mozilla/dom/PServiceWorkerRegistrationParent.h"
|
|
|
|
namespace mozilla::dom {
|
|
|
|
class IPCServiceWorkerRegistrationDescriptor;
|
|
class ServiceWorkerRegistrationProxy;
|
|
|
|
class ServiceWorkerRegistrationParent final
|
|
: public PServiceWorkerRegistrationParent {
|
|
RefPtr<ServiceWorkerRegistrationProxy> mProxy;
|
|
|
|
~ServiceWorkerRegistrationParent();
|
|
|
|
// PServiceWorkerRegistrationParent
|
|
void ActorDestroy(ActorDestroyReason aReason) override;
|
|
|
|
mozilla::ipc::IPCResult RecvUnregister(
|
|
UnregisterResolver&& aResolver) override;
|
|
|
|
mozilla::ipc::IPCResult RecvUpdate(const nsACString& aNewestWorkerScriptUrl,
|
|
UpdateResolver&& aResolver) override;
|
|
|
|
mozilla::ipc::IPCResult RecvSetNavigationPreloadEnabled(
|
|
const bool& aEnabled,
|
|
SetNavigationPreloadEnabledResolver&& aResolver) override;
|
|
|
|
mozilla::ipc::IPCResult RecvSetNavigationPreloadHeader(
|
|
const nsACString& aHeader,
|
|
SetNavigationPreloadHeaderResolver&& aResolver) override;
|
|
|
|
mozilla::ipc::IPCResult RecvGetNavigationPreloadState(
|
|
GetNavigationPreloadStateResolver&& aResolver) override;
|
|
|
|
mozilla::ipc::IPCResult RecvGetNotifications(
|
|
const nsAString& aTag, GetNotificationsResolver&& aResolver) override;
|
|
|
|
public:
|
|
NS_INLINE_DECL_REFCOUNTING(ServiceWorkerRegistrationParent, override);
|
|
|
|
// If we default this we have to fully define ServiceWorkerRegistrationProxy.
|
|
ServiceWorkerRegistrationParent();
|
|
|
|
void Init(const IPCServiceWorkerRegistrationDescriptor& aDescriptor,
|
|
const IPCClientInfo& aForClient);
|
|
|
|
void MaybeSendDelete();
|
|
};
|
|
|
|
} // namespace mozilla::dom
|
|
|
|
#endif // mozilla_dom_serviceworkerregistrationparent_h__
|