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 "ServiceWorkerDescriptor.h"
8 #include "mozilla/dom/IPCServiceWorkerDescriptor.h"
9 #include "mozilla/dom/ServiceWorkerBinding.h"
10 #include "mozilla/ipc/PBackgroundSharedTypes.h"
11 
12 namespace mozilla {
13 namespace dom {
14 
15 using mozilla::ipc::PrincipalInfo;
16 using mozilla::ipc::PrincipalInfoToPrincipal;
17 
ServiceWorkerDescriptor(uint64_t aId,uint64_t aRegistrationId,uint64_t aRegistrationVersion,nsIPrincipal * aPrincipal,const nsACString & aScope,const nsACString & aScriptURL,ServiceWorkerState aState)18 ServiceWorkerDescriptor::ServiceWorkerDescriptor(
19     uint64_t aId, uint64_t aRegistrationId, uint64_t aRegistrationVersion,
20     nsIPrincipal* aPrincipal, const nsACString& aScope,
21     const nsACString& aScriptURL, ServiceWorkerState aState)
22     : mData(MakeUnique<IPCServiceWorkerDescriptor>()) {
23   MOZ_ALWAYS_SUCCEEDS(
24       PrincipalToPrincipalInfo(aPrincipal, &mData->principalInfo()));
25 
26   mData->id() = aId;
27   mData->registrationId() = aRegistrationId;
28   mData->registrationVersion() = aRegistrationVersion;
29   mData->scope() = aScope;
30   mData->scriptURL() = aScriptURL;
31   mData->state() = aState;
32   // Set HandlesFetch as true in default
33   mData->handlesFetch() = true;
34 }
35 
ServiceWorkerDescriptor(uint64_t aId,uint64_t aRegistrationId,uint64_t aRegistrationVersion,const mozilla::ipc::PrincipalInfo & aPrincipalInfo,const nsACString & aScope,const nsACString & aScriptURL,ServiceWorkerState aState)36 ServiceWorkerDescriptor::ServiceWorkerDescriptor(
37     uint64_t aId, uint64_t aRegistrationId, uint64_t aRegistrationVersion,
38     const mozilla::ipc::PrincipalInfo& aPrincipalInfo, const nsACString& aScope,
39     const nsACString& aScriptURL, ServiceWorkerState aState)
40     : mData(MakeUnique<IPCServiceWorkerDescriptor>(
41           aId, aRegistrationId, aRegistrationVersion, aPrincipalInfo,
42           nsCString(aScriptURL), nsCString(aScope), aState, true)) {}
43 
ServiceWorkerDescriptor(const IPCServiceWorkerDescriptor & aDescriptor)44 ServiceWorkerDescriptor::ServiceWorkerDescriptor(
45     const IPCServiceWorkerDescriptor& aDescriptor)
46     : mData(MakeUnique<IPCServiceWorkerDescriptor>(aDescriptor)) {}
47 
ServiceWorkerDescriptor(const ServiceWorkerDescriptor & aRight)48 ServiceWorkerDescriptor::ServiceWorkerDescriptor(
49     const ServiceWorkerDescriptor& aRight) {
50   operator=(aRight);
51 }
52 
operator =(const ServiceWorkerDescriptor & aRight)53 ServiceWorkerDescriptor& ServiceWorkerDescriptor::operator=(
54     const ServiceWorkerDescriptor& aRight) {
55   if (this == &aRight) {
56     return *this;
57   }
58   mData.reset();
59   mData = MakeUnique<IPCServiceWorkerDescriptor>(*aRight.mData);
60   return *this;
61 }
62 
ServiceWorkerDescriptor(ServiceWorkerDescriptor && aRight)63 ServiceWorkerDescriptor::ServiceWorkerDescriptor(
64     ServiceWorkerDescriptor&& aRight)
65     : mData(std::move(aRight.mData)) {}
66 
operator =(ServiceWorkerDescriptor && aRight)67 ServiceWorkerDescriptor& ServiceWorkerDescriptor::operator=(
68     ServiceWorkerDescriptor&& aRight) {
69   mData.reset();
70   mData = std::move(aRight.mData);
71   return *this;
72 }
73 
74 ServiceWorkerDescriptor::~ServiceWorkerDescriptor() = default;
75 
operator ==(const ServiceWorkerDescriptor & aRight) const76 bool ServiceWorkerDescriptor::operator==(
77     const ServiceWorkerDescriptor& aRight) const {
78   return *mData == *aRight.mData;
79 }
80 
Id() const81 uint64_t ServiceWorkerDescriptor::Id() const { return mData->id(); }
82 
RegistrationId() const83 uint64_t ServiceWorkerDescriptor::RegistrationId() const {
84   return mData->registrationId();
85 }
86 
RegistrationVersion() const87 uint64_t ServiceWorkerDescriptor::RegistrationVersion() const {
88   return mData->registrationVersion();
89 }
90 
PrincipalInfo() const91 const mozilla::ipc::PrincipalInfo& ServiceWorkerDescriptor::PrincipalInfo()
92     const {
93   return mData->principalInfo();
94 }
95 
GetPrincipal() const96 Result<nsCOMPtr<nsIPrincipal>, nsresult> ServiceWorkerDescriptor::GetPrincipal()
97     const {
98   AssertIsOnMainThread();
99   return PrincipalInfoToPrincipal(mData->principalInfo());
100 }
101 
Scope() const102 const nsCString& ServiceWorkerDescriptor::Scope() const {
103   return mData->scope();
104 }
105 
ScriptURL() const106 const nsCString& ServiceWorkerDescriptor::ScriptURL() const {
107   return mData->scriptURL();
108 }
109 
State() const110 ServiceWorkerState ServiceWorkerDescriptor::State() const {
111   return mData->state();
112 }
113 
SetState(ServiceWorkerState aState)114 void ServiceWorkerDescriptor::SetState(ServiceWorkerState aState) {
115   mData->state() = aState;
116 }
117 
SetRegistrationVersion(uint64_t aVersion)118 void ServiceWorkerDescriptor::SetRegistrationVersion(uint64_t aVersion) {
119   MOZ_DIAGNOSTIC_ASSERT(aVersion > mData->registrationVersion());
120   mData->registrationVersion() = aVersion;
121 }
122 
HandlesFetch() const123 bool ServiceWorkerDescriptor::HandlesFetch() const {
124   return mData->handlesFetch();
125 }
126 
SetHandlesFetch(bool aHandlesFetch)127 void ServiceWorkerDescriptor::SetHandlesFetch(bool aHandlesFetch) {
128   mData->handlesFetch() = aHandlesFetch;
129 }
130 
Matches(const ServiceWorkerDescriptor & aDescriptor) const131 bool ServiceWorkerDescriptor::Matches(
132     const ServiceWorkerDescriptor& aDescriptor) const {
133   return Id() == aDescriptor.Id() && Scope() == aDescriptor.Scope() &&
134          ScriptURL() == aDescriptor.ScriptURL() &&
135          PrincipalInfo() == aDescriptor.PrincipalInfo();
136 }
137 
ToIPC() const138 const IPCServiceWorkerDescriptor& ServiceWorkerDescriptor::ToIPC() const {
139   return *mData;
140 }
141 
142 }  // namespace dom
143 }  // namespace mozilla
144