summaryrefslogtreecommitdiffstats
path: root/dom/clients/manager/ClientState.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/clients/manager/ClientState.cpp')
-rw-r--r--dom/clients/manager/ClientState.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/dom/clients/manager/ClientState.cpp b/dom/clients/manager/ClientState.cpp
new file mode 100644
index 0000000000..89e43465d7
--- /dev/null
+++ b/dom/clients/manager/ClientState.cpp
@@ -0,0 +1,167 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ClientState.h"
+
+#include "mozilla/dom/ClientIPCTypes.h"
+
+namespace mozilla::dom {
+
+ClientWindowState::ClientWindowState(
+ mozilla::dom::VisibilityState aVisibilityState,
+ const TimeStamp& aLastFocusTime, StorageAccess aStorageAccess,
+ bool aFocused)
+ : mData(MakeUnique<IPCClientWindowState>(aVisibilityState, aLastFocusTime,
+ aStorageAccess, aFocused)) {}
+
+ClientWindowState::ClientWindowState(const IPCClientWindowState& aData)
+ : mData(MakeUnique<IPCClientWindowState>(aData)) {}
+
+ClientWindowState::ClientWindowState(const ClientWindowState& aRight) {
+ operator=(aRight);
+}
+
+ClientWindowState::ClientWindowState(ClientWindowState&& aRight)
+ : mData(std::move(aRight.mData)) {}
+
+ClientWindowState& ClientWindowState::operator=(
+ const ClientWindowState& aRight) {
+ mData.reset();
+ mData = MakeUnique<IPCClientWindowState>(*aRight.mData);
+ return *this;
+}
+
+ClientWindowState& ClientWindowState::operator=(ClientWindowState&& aRight) {
+ mData.reset();
+ mData = std::move(aRight.mData);
+ return *this;
+}
+
+ClientWindowState::~ClientWindowState() = default;
+
+mozilla::dom::VisibilityState ClientWindowState::VisibilityState() const {
+ return mData->visibilityState();
+}
+
+const TimeStamp& ClientWindowState::LastFocusTime() const {
+ return mData->lastFocusTime();
+}
+
+bool ClientWindowState::Focused() const { return mData->focused(); }
+
+StorageAccess ClientWindowState::GetStorageAccess() const {
+ return mData->storageAccess();
+}
+
+const IPCClientWindowState& ClientWindowState::ToIPC() const { return *mData; }
+
+ClientWorkerState::ClientWorkerState(StorageAccess aStorageAccess)
+ : mData(MakeUnique<IPCClientWorkerState>(aStorageAccess)) {}
+
+ClientWorkerState::ClientWorkerState(const IPCClientWorkerState& aData)
+ : mData(MakeUnique<IPCClientWorkerState>(aData)) {}
+
+ClientWorkerState::ClientWorkerState(ClientWorkerState&& aRight)
+ : mData(std::move(aRight.mData)) {}
+
+ClientWorkerState::ClientWorkerState(const ClientWorkerState& aRight) {
+ operator=(aRight);
+}
+
+ClientWorkerState& ClientWorkerState::operator=(
+ const ClientWorkerState& aRight) {
+ mData.reset();
+ mData = MakeUnique<IPCClientWorkerState>(*aRight.mData);
+ return *this;
+}
+
+ClientWorkerState& ClientWorkerState::operator=(ClientWorkerState&& aRight) {
+ mData.reset();
+ mData = std::move(aRight.mData);
+ return *this;
+}
+
+ClientWorkerState::~ClientWorkerState() = default;
+
+StorageAccess ClientWorkerState::GetStorageAccess() const {
+ return mData->storageAccess();
+}
+
+const IPCClientWorkerState& ClientWorkerState::ToIPC() const { return *mData; }
+
+ClientState::ClientState() = default;
+
+ClientState::ClientState(const ClientWindowState& aWindowState) {
+ mData.emplace(AsVariant(aWindowState));
+}
+
+ClientState::ClientState(const ClientWorkerState& aWorkerState) {
+ mData.emplace(AsVariant(aWorkerState));
+}
+
+ClientState::ClientState(const IPCClientWindowState& aData) {
+ mData.emplace(AsVariant(ClientWindowState(aData)));
+}
+
+ClientState::ClientState(const IPCClientWorkerState& aData) {
+ mData.emplace(AsVariant(ClientWorkerState(aData)));
+}
+
+ClientState::ClientState(ClientState&& aRight)
+ : mData(std::move(aRight.mData)) {}
+
+ClientState& ClientState::operator=(ClientState&& aRight) {
+ mData = std::move(aRight.mData);
+ return *this;
+}
+
+ClientState::~ClientState() = default;
+
+// static
+ClientState ClientState::FromIPC(const IPCClientState& aData) {
+ switch (aData.type()) {
+ case IPCClientState::TIPCClientWindowState:
+ return ClientState(aData.get_IPCClientWindowState());
+ case IPCClientState::TIPCClientWorkerState:
+ return ClientState(aData.get_IPCClientWorkerState());
+ default:
+ MOZ_CRASH("unexpected IPCClientState type");
+ }
+}
+
+bool ClientState::IsWindowState() const {
+ return mData.isSome() && mData.ref().is<ClientWindowState>();
+}
+
+const ClientWindowState& ClientState::AsWindowState() const {
+ return mData.ref().as<ClientWindowState>();
+}
+
+bool ClientState::IsWorkerState() const {
+ return mData.isSome() && mData.ref().is<ClientWorkerState>();
+}
+
+const ClientWorkerState& ClientState::AsWorkerState() const {
+ return mData.ref().as<ClientWorkerState>();
+}
+
+StorageAccess ClientState::GetStorageAccess() const {
+ if (IsWindowState()) {
+ return AsWindowState().GetStorageAccess();
+ }
+
+ return AsWorkerState().GetStorageAccess();
+}
+
+const IPCClientState ClientState::ToIPC() const {
+ if (IsWindowState()) {
+ return IPCClientState(AsWindowState().ToIPC());
+ }
+
+ return IPCClientState(AsWorkerState().ToIPC());
+}
+
+} // namespace mozilla::dom