1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "ServiceWorkerRegistrationParent.h"
8 
9 #include <utility>
10 
11 #include "ServiceWorkerRegistrationProxy.h"
12 
13 namespace mozilla {
14 namespace dom {
15 
16 using mozilla::ipc::IPCResult;
17 
ActorDestroy(ActorDestroyReason aReason)18 void ServiceWorkerRegistrationParent::ActorDestroy(ActorDestroyReason aReason) {
19   if (mProxy) {
20     mProxy->RevokeActor(this);
21     mProxy = nullptr;
22   }
23 }
24 
RecvTeardown()25 IPCResult ServiceWorkerRegistrationParent::RecvTeardown() {
26   MaybeSendDelete();
27   return IPC_OK();
28 }
29 
30 namespace {
31 
ResolveUnregister(PServiceWorkerRegistrationParent::UnregisterResolver && aResolver,bool aSuccess,nsresult aRv)32 void ResolveUnregister(
33     PServiceWorkerRegistrationParent::UnregisterResolver&& aResolver,
34     bool aSuccess, nsresult aRv) {
35   aResolver(Tuple<const bool&, const CopyableErrorResult&>(
36       aSuccess, CopyableErrorResult(aRv)));
37 }
38 
39 }  // anonymous namespace
40 
RecvUnregister(UnregisterResolver && aResolver)41 IPCResult ServiceWorkerRegistrationParent::RecvUnregister(
42     UnregisterResolver&& aResolver) {
43   if (!mProxy) {
44     ResolveUnregister(std::move(aResolver), false,
45                       NS_ERROR_DOM_INVALID_STATE_ERR);
46     return IPC_OK();
47   }
48 
49   mProxy->Unregister()->Then(
50       GetCurrentSerialEventTarget(), __func__,
51       [aResolver](bool aSuccess) mutable {
52         ResolveUnregister(std::move(aResolver), aSuccess, NS_OK);
53       },
54       [aResolver](nsresult aRv) mutable {
55         ResolveUnregister(std::move(aResolver), false, aRv);
56       });
57 
58   return IPC_OK();
59 }
60 
RecvUpdate(const nsCString & aNewestWorkerScriptUrl,UpdateResolver && aResolver)61 IPCResult ServiceWorkerRegistrationParent::RecvUpdate(
62     const nsCString& aNewestWorkerScriptUrl, UpdateResolver&& aResolver) {
63   if (!mProxy) {
64     aResolver(CopyableErrorResult(NS_ERROR_DOM_INVALID_STATE_ERR));
65     return IPC_OK();
66   }
67 
68   mProxy->Update(aNewestWorkerScriptUrl)
69       ->Then(
70           GetCurrentSerialEventTarget(), __func__,
71           [aResolver](const ServiceWorkerRegistrationDescriptor& aDescriptor) {
72             aResolver(aDescriptor.ToIPC());
73           },
74           [aResolver](const CopyableErrorResult& aResult) {
75             aResolver(aResult);
76           });
77 
78   return IPC_OK();
79 }
80 
RecvSetNavigationPreloadEnabled(const bool & aEnabled,SetNavigationPreloadEnabledResolver && aResolver)81 IPCResult ServiceWorkerRegistrationParent::RecvSetNavigationPreloadEnabled(
82     const bool& aEnabled, SetNavigationPreloadEnabledResolver&& aResolver) {
83   if (!mProxy) {
84     aResolver(false);
85     return IPC_OK();
86   }
87 
88   mProxy->SetNavigationPreloadEnabled(aEnabled)->Then(
89       GetCurrentSerialEventTarget(), __func__,
90       [aResolver](bool) { aResolver(true); },
91       [aResolver](nsresult) { aResolver(false); });
92 
93   return IPC_OK();
94 }
95 
RecvSetNavigationPreloadHeader(const nsCString & aHeader,SetNavigationPreloadHeaderResolver && aResolver)96 IPCResult ServiceWorkerRegistrationParent::RecvSetNavigationPreloadHeader(
97     const nsCString& aHeader, SetNavigationPreloadHeaderResolver&& aResolver) {
98   if (!mProxy) {
99     aResolver(false);
100     return IPC_OK();
101   }
102 
103   mProxy->SetNavigationPreloadHeader(aHeader)->Then(
104       GetCurrentSerialEventTarget(), __func__,
105       [aResolver](bool) { aResolver(true); },
106       [aResolver](nsresult) { aResolver(false); });
107 
108   return IPC_OK();
109 }
110 
RecvGetNavigationPreloadState(GetNavigationPreloadStateResolver && aResolver)111 IPCResult ServiceWorkerRegistrationParent::RecvGetNavigationPreloadState(
112     GetNavigationPreloadStateResolver&& aResolver) {
113   if (!mProxy) {
114     aResolver(Nothing());
115     return IPC_OK();
116   }
117 
118   mProxy->GetNavigationPreloadState()->Then(
119       GetCurrentSerialEventTarget(), __func__,
120       [aResolver](const IPCNavigationPreloadState& aState) {
121         aResolver(Some(aState));
122       },
123       [aResolver](const CopyableErrorResult& aResult) {
124         aResolver(Nothing());
125       });
126 
127   return IPC_OK();
128 }
129 
ServiceWorkerRegistrationParent()130 ServiceWorkerRegistrationParent::ServiceWorkerRegistrationParent()
131     : mDeleteSent(false) {}
132 
~ServiceWorkerRegistrationParent()133 ServiceWorkerRegistrationParent::~ServiceWorkerRegistrationParent() {
134   MOZ_DIAGNOSTIC_ASSERT(!mProxy);
135 }
136 
Init(const IPCServiceWorkerRegistrationDescriptor & aDescriptor)137 void ServiceWorkerRegistrationParent::Init(
138     const IPCServiceWorkerRegistrationDescriptor& aDescriptor) {
139   MOZ_DIAGNOSTIC_ASSERT(!mProxy);
140   mProxy = new ServiceWorkerRegistrationProxy(
141       ServiceWorkerRegistrationDescriptor(aDescriptor));
142   mProxy->Init(this);
143 }
144 
MaybeSendDelete()145 void ServiceWorkerRegistrationParent::MaybeSendDelete() {
146   if (mDeleteSent) {
147     return;
148   }
149   mDeleteSent = true;
150   Unused << Send__delete__(this);
151 }
152 
153 }  // namespace dom
154 }  // namespace mozilla
155