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