ServiceWorkerRegistrationParent.cpp (4713B)
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::dom { 14 15 using mozilla::ipc::IPCResult; 16 17 void ServiceWorkerRegistrationParent::ActorDestroy(ActorDestroyReason aReason) { 18 if (mProxy) { 19 mProxy->RevokeActor(this); 20 mProxy = nullptr; 21 } 22 } 23 24 namespace { 25 26 void ResolveUnregister( 27 PServiceWorkerRegistrationParent::UnregisterResolver&& aResolver, 28 bool aSuccess, nsresult aRv) { 29 aResolver(std::tuple<const bool&, const CopyableErrorResult&>( 30 aSuccess, CopyableErrorResult(aRv))); 31 } 32 33 } // anonymous namespace 34 35 IPCResult ServiceWorkerRegistrationParent::RecvUnregister( 36 UnregisterResolver&& aResolver) { 37 if (!mProxy) { 38 ResolveUnregister(std::move(aResolver), false, 39 NS_ERROR_DOM_INVALID_STATE_ERR); 40 return IPC_OK(); 41 } 42 43 mProxy->Unregister()->Then( 44 GetCurrentSerialEventTarget(), __func__, 45 [aResolver](bool aSuccess) mutable { 46 ResolveUnregister(std::move(aResolver), aSuccess, NS_OK); 47 }, 48 [aResolver](nsresult aRv) mutable { 49 ResolveUnregister(std::move(aResolver), false, aRv); 50 }); 51 52 return IPC_OK(); 53 } 54 55 IPCResult ServiceWorkerRegistrationParent::RecvUpdate( 56 const nsACString& aNewestWorkerScriptUrl, UpdateResolver&& aResolver) { 57 if (!mProxy) { 58 aResolver(CopyableErrorResult(NS_ERROR_DOM_INVALID_STATE_ERR)); 59 return IPC_OK(); 60 } 61 62 mProxy->Update(aNewestWorkerScriptUrl) 63 ->Then( 64 GetCurrentSerialEventTarget(), __func__, 65 [aResolver](const ServiceWorkerRegistrationDescriptor& aDescriptor) { 66 aResolver(aDescriptor.ToIPC()); 67 }, 68 [aResolver](const CopyableErrorResult& aResult) { 69 aResolver(aResult); 70 }); 71 72 return IPC_OK(); 73 } 74 75 IPCResult ServiceWorkerRegistrationParent::RecvSetNavigationPreloadEnabled( 76 const bool& aEnabled, SetNavigationPreloadEnabledResolver&& aResolver) { 77 if (!mProxy) { 78 aResolver(false); 79 return IPC_OK(); 80 } 81 82 mProxy->SetNavigationPreloadEnabled(aEnabled)->Then( 83 GetCurrentSerialEventTarget(), __func__, 84 [aResolver](bool) { aResolver(true); }, 85 [aResolver](nsresult) { aResolver(false); }); 86 87 return IPC_OK(); 88 } 89 90 IPCResult ServiceWorkerRegistrationParent::RecvSetNavigationPreloadHeader( 91 const nsACString& aHeader, SetNavigationPreloadHeaderResolver&& aResolver) { 92 if (!mProxy) { 93 aResolver(false); 94 return IPC_OK(); 95 } 96 97 mProxy->SetNavigationPreloadHeader(aHeader)->Then( 98 GetCurrentSerialEventTarget(), __func__, 99 [aResolver](bool) { aResolver(true); }, 100 [aResolver](nsresult) { aResolver(false); }); 101 102 return IPC_OK(); 103 } 104 105 IPCResult ServiceWorkerRegistrationParent::RecvGetNavigationPreloadState( 106 GetNavigationPreloadStateResolver&& aResolver) { 107 if (!mProxy) { 108 aResolver(Nothing()); 109 return IPC_OK(); 110 } 111 112 mProxy->GetNavigationPreloadState()->Then( 113 GetCurrentSerialEventTarget(), __func__, 114 [aResolver](const IPCNavigationPreloadState& aState) { 115 aResolver(Some(aState)); 116 }, 117 [aResolver](const CopyableErrorResult& aResult) { 118 aResolver(Nothing()); 119 }); 120 121 return IPC_OK(); 122 } 123 124 IPCResult ServiceWorkerRegistrationParent::RecvGetNotifications( 125 const nsAString& aTag, GetNotificationsResolver&& aResolver) { 126 if (!mProxy) { 127 aResolver(NS_ERROR_DOM_INVALID_STATE_ERR); 128 return IPC_OK(); 129 } 130 131 mProxy->GetNotifications(aTag)->Then( 132 GetCurrentSerialEventTarget(), __func__, 133 [aResolver](const CopyableTArray<IPCNotification>& aNotifications) { 134 aResolver(aNotifications); 135 }, 136 [aResolver](nsresult) { aResolver(NS_ERROR_DOM_INVALID_STATE_ERR); }); 137 138 return IPC_OK(); 139 } 140 141 ServiceWorkerRegistrationParent::ServiceWorkerRegistrationParent() {} 142 143 ServiceWorkerRegistrationParent::~ServiceWorkerRegistrationParent() { 144 MOZ_DIAGNOSTIC_ASSERT(!mProxy); 145 } 146 147 void ServiceWorkerRegistrationParent::Init( 148 const IPCServiceWorkerRegistrationDescriptor& aDescriptor, 149 const IPCClientInfo& aForClient) { 150 MOZ_DIAGNOSTIC_ASSERT(!mProxy); 151 mProxy = new ServiceWorkerRegistrationProxy( 152 ServiceWorkerRegistrationDescriptor(aDescriptor), ClientInfo(aForClient)); 153 mProxy->Init(this); 154 } 155 156 void ServiceWorkerRegistrationParent::MaybeSendDelete() { 157 if (!CanSend()) { 158 return; 159 } 160 (void)Send__delete__(this); 161 } 162 163 } // namespace mozilla::dom