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 "ClientState.h"
8 
9 #include "mozilla/dom/ClientIPCTypes.h"
10 
11 namespace mozilla::dom {
12 
ClientWindowState(mozilla::dom::VisibilityState aVisibilityState,const TimeStamp & aLastFocusTime,StorageAccess aStorageAccess,bool aFocused)13 ClientWindowState::ClientWindowState(
14     mozilla::dom::VisibilityState aVisibilityState,
15     const TimeStamp& aLastFocusTime, StorageAccess aStorageAccess,
16     bool aFocused)
17     : mData(MakeUnique<IPCClientWindowState>(aVisibilityState, aLastFocusTime,
18                                              aStorageAccess, aFocused)) {}
19 
ClientWindowState(const IPCClientWindowState & aData)20 ClientWindowState::ClientWindowState(const IPCClientWindowState& aData)
21     : mData(MakeUnique<IPCClientWindowState>(aData)) {}
22 
ClientWindowState(const ClientWindowState & aRight)23 ClientWindowState::ClientWindowState(const ClientWindowState& aRight) {
24   operator=(aRight);
25 }
26 
ClientWindowState(ClientWindowState && aRight)27 ClientWindowState::ClientWindowState(ClientWindowState&& aRight)
28     : mData(std::move(aRight.mData)) {}
29 
operator =(const ClientWindowState & aRight)30 ClientWindowState& ClientWindowState::operator=(
31     const ClientWindowState& aRight) {
32   mData.reset();
33   mData = MakeUnique<IPCClientWindowState>(*aRight.mData);
34   return *this;
35 }
36 
operator =(ClientWindowState && aRight)37 ClientWindowState& ClientWindowState::operator=(ClientWindowState&& aRight) {
38   mData.reset();
39   mData = std::move(aRight.mData);
40   return *this;
41 }
42 
43 ClientWindowState::~ClientWindowState() = default;
44 
VisibilityState() const45 mozilla::dom::VisibilityState ClientWindowState::VisibilityState() const {
46   return mData->visibilityState();
47 }
48 
LastFocusTime() const49 const TimeStamp& ClientWindowState::LastFocusTime() const {
50   return mData->lastFocusTime();
51 }
52 
Focused() const53 bool ClientWindowState::Focused() const { return mData->focused(); }
54 
GetStorageAccess() const55 StorageAccess ClientWindowState::GetStorageAccess() const {
56   return mData->storageAccess();
57 }
58 
ToIPC() const59 const IPCClientWindowState& ClientWindowState::ToIPC() const { return *mData; }
60 
ClientWorkerState(StorageAccess aStorageAccess)61 ClientWorkerState::ClientWorkerState(StorageAccess aStorageAccess)
62     : mData(MakeUnique<IPCClientWorkerState>(aStorageAccess)) {}
63 
ClientWorkerState(const IPCClientWorkerState & aData)64 ClientWorkerState::ClientWorkerState(const IPCClientWorkerState& aData)
65     : mData(MakeUnique<IPCClientWorkerState>(aData)) {}
66 
ClientWorkerState(ClientWorkerState && aRight)67 ClientWorkerState::ClientWorkerState(ClientWorkerState&& aRight)
68     : mData(std::move(aRight.mData)) {}
69 
ClientWorkerState(const ClientWorkerState & aRight)70 ClientWorkerState::ClientWorkerState(const ClientWorkerState& aRight) {
71   operator=(aRight);
72 }
73 
operator =(const ClientWorkerState & aRight)74 ClientWorkerState& ClientWorkerState::operator=(
75     const ClientWorkerState& aRight) {
76   mData.reset();
77   mData = MakeUnique<IPCClientWorkerState>(*aRight.mData);
78   return *this;
79 }
80 
operator =(ClientWorkerState && aRight)81 ClientWorkerState& ClientWorkerState::operator=(ClientWorkerState&& aRight) {
82   mData.reset();
83   mData = std::move(aRight.mData);
84   return *this;
85 }
86 
87 ClientWorkerState::~ClientWorkerState() = default;
88 
GetStorageAccess() const89 StorageAccess ClientWorkerState::GetStorageAccess() const {
90   return mData->storageAccess();
91 }
92 
ToIPC() const93 const IPCClientWorkerState& ClientWorkerState::ToIPC() const { return *mData; }
94 
95 ClientState::ClientState() = default;
96 
ClientState(const ClientWindowState & aWindowState)97 ClientState::ClientState(const ClientWindowState& aWindowState) {
98   mData.emplace(AsVariant(aWindowState));
99 }
100 
ClientState(const ClientWorkerState & aWorkerState)101 ClientState::ClientState(const ClientWorkerState& aWorkerState) {
102   mData.emplace(AsVariant(aWorkerState));
103 }
104 
ClientState(const IPCClientWindowState & aData)105 ClientState::ClientState(const IPCClientWindowState& aData) {
106   mData.emplace(AsVariant(ClientWindowState(aData)));
107 }
108 
ClientState(const IPCClientWorkerState & aData)109 ClientState::ClientState(const IPCClientWorkerState& aData) {
110   mData.emplace(AsVariant(ClientWorkerState(aData)));
111 }
112 
ClientState(ClientState && aRight)113 ClientState::ClientState(ClientState&& aRight)
114     : mData(std::move(aRight.mData)) {}
115 
operator =(ClientState && aRight)116 ClientState& ClientState::operator=(ClientState&& aRight) {
117   mData = std::move(aRight.mData);
118   return *this;
119 }
120 
121 ClientState::~ClientState() = default;
122 
123 // static
FromIPC(const IPCClientState & aData)124 ClientState ClientState::FromIPC(const IPCClientState& aData) {
125   switch (aData.type()) {
126     case IPCClientState::TIPCClientWindowState:
127       return ClientState(aData.get_IPCClientWindowState());
128     case IPCClientState::TIPCClientWorkerState:
129       return ClientState(aData.get_IPCClientWorkerState());
130     default:
131       MOZ_CRASH("unexpected IPCClientState type");
132   }
133 }
134 
IsWindowState() const135 bool ClientState::IsWindowState() const {
136   return mData.isSome() && mData.ref().is<ClientWindowState>();
137 }
138 
AsWindowState() const139 const ClientWindowState& ClientState::AsWindowState() const {
140   return mData.ref().as<ClientWindowState>();
141 }
142 
IsWorkerState() const143 bool ClientState::IsWorkerState() const {
144   return mData.isSome() && mData.ref().is<ClientWorkerState>();
145 }
146 
AsWorkerState() const147 const ClientWorkerState& ClientState::AsWorkerState() const {
148   return mData.ref().as<ClientWorkerState>();
149 }
150 
GetStorageAccess() const151 StorageAccess ClientState::GetStorageAccess() const {
152   if (IsWindowState()) {
153     return AsWindowState().GetStorageAccess();
154   }
155 
156   return AsWorkerState().GetStorageAccess();
157 }
158 
ToIPC() const159 const IPCClientState ClientState::ToIPC() const {
160   if (IsWindowState()) {
161     return IPCClientState(AsWindowState().ToIPC());
162   }
163 
164   return IPCClientState(AsWorkerState().ToIPC());
165 }
166 
167 }  // namespace mozilla::dom
168