ClientState.cpp (4908B)
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 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 20 ClientWindowState::ClientWindowState(const IPCClientWindowState& aData) 21 : mData(MakeUnique<IPCClientWindowState>(aData)) {} 22 23 ClientWindowState::ClientWindowState(const ClientWindowState& aRight) { 24 operator=(aRight); 25 } 26 27 ClientWindowState::ClientWindowState(ClientWindowState&& aRight) 28 : mData(std::move(aRight.mData)) {} 29 30 ClientWindowState& ClientWindowState::operator=( 31 const ClientWindowState& aRight) { 32 mData.reset(); 33 mData = MakeUnique<IPCClientWindowState>(*aRight.mData); 34 return *this; 35 } 36 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 45 mozilla::dom::VisibilityState ClientWindowState::VisibilityState() const { 46 return mData->visibilityState(); 47 } 48 49 const TimeStamp& ClientWindowState::LastFocusTime() const { 50 return mData->lastFocusTime(); 51 } 52 53 bool ClientWindowState::Focused() const { return mData->focused(); } 54 55 StorageAccess ClientWindowState::GetStorageAccess() const { 56 return mData->storageAccess(); 57 } 58 59 const IPCClientWindowState& ClientWindowState::ToIPC() const { return *mData; } 60 61 ClientWorkerState::ClientWorkerState(StorageAccess aStorageAccess) 62 : mData(MakeUnique<IPCClientWorkerState>(aStorageAccess)) {} 63 64 ClientWorkerState::ClientWorkerState(const IPCClientWorkerState& aData) 65 : mData(MakeUnique<IPCClientWorkerState>(aData)) {} 66 67 ClientWorkerState::ClientWorkerState(ClientWorkerState&& aRight) 68 : mData(std::move(aRight.mData)) {} 69 70 ClientWorkerState::ClientWorkerState(const ClientWorkerState& aRight) { 71 operator=(aRight); 72 } 73 74 ClientWorkerState& ClientWorkerState::operator=( 75 const ClientWorkerState& aRight) { 76 mData.reset(); 77 mData = MakeUnique<IPCClientWorkerState>(*aRight.mData); 78 return *this; 79 } 80 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 89 StorageAccess ClientWorkerState::GetStorageAccess() const { 90 return mData->storageAccess(); 91 } 92 93 const IPCClientWorkerState& ClientWorkerState::ToIPC() const { return *mData; } 94 95 ClientState::ClientState() = default; 96 97 ClientState::ClientState(const ClientWindowState& aWindowState) { 98 mData.emplace(AsVariant(aWindowState)); 99 } 100 101 ClientState::ClientState(const ClientWorkerState& aWorkerState) { 102 mData.emplace(AsVariant(aWorkerState)); 103 } 104 105 ClientState::ClientState(const IPCClientWindowState& aData) { 106 mData.emplace(AsVariant(ClientWindowState(aData))); 107 } 108 109 ClientState::ClientState(const IPCClientWorkerState& aData) { 110 mData.emplace(AsVariant(ClientWorkerState(aData))); 111 } 112 113 ClientState::ClientState(ClientState&& aRight) 114 : mData(std::move(aRight.mData)) {} 115 116 ClientState& ClientState::operator=(ClientState&& aRight) { 117 mData = std::move(aRight.mData); 118 return *this; 119 } 120 121 ClientState::~ClientState() = default; 122 123 // static 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 135 bool ClientState::IsWindowState() const { 136 return mData.isSome() && mData.ref().is<ClientWindowState>(); 137 } 138 139 const ClientWindowState& ClientState::AsWindowState() const { 140 return mData.ref().as<ClientWindowState>(); 141 } 142 143 bool ClientState::IsWorkerState() const { 144 return mData.isSome() && mData.ref().is<ClientWorkerState>(); 145 } 146 147 const ClientWorkerState& ClientState::AsWorkerState() const { 148 return mData.ref().as<ClientWorkerState>(); 149 } 150 151 StorageAccess ClientState::GetStorageAccess() const { 152 if (IsWindowState()) { 153 return AsWindowState().GetStorageAccess(); 154 } 155 156 return AsWorkerState().GetStorageAccess(); 157 } 158 159 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