diff options
Diffstat (limited to 'dom/presentation/ControllerConnectionCollection.cpp')
-rw-r--r-- | dom/presentation/ControllerConnectionCollection.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/dom/presentation/ControllerConnectionCollection.cpp b/dom/presentation/ControllerConnectionCollection.cpp new file mode 100644 index 0000000000..7d3ffe6845 --- /dev/null +++ b/dom/presentation/ControllerConnectionCollection.cpp @@ -0,0 +1,116 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* 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 "ControllerConnectionCollection.h" + +#include "mozilla/ClearOnShutdown.h" +#include "nsIPresentationService.h" +#include "PresentationConnection.h" + +namespace mozilla { +namespace dom { + +/* static */ +StaticAutoPtr<ControllerConnectionCollection> +ControllerConnectionCollection::sSingleton; + +/* static */ ControllerConnectionCollection* +ControllerConnectionCollection::GetSingleton() +{ + MOZ_ASSERT(NS_IsMainThread()); + + if (!sSingleton) { + sSingleton = new ControllerConnectionCollection(); + ClearOnShutdown(&sSingleton); + } + + return sSingleton; +} + +ControllerConnectionCollection::ControllerConnectionCollection() +{ + MOZ_COUNT_CTOR(ControllerConnectionCollection); +} + +ControllerConnectionCollection::~ControllerConnectionCollection() +{ + MOZ_COUNT_DTOR(ControllerConnectionCollection); +} + +void +ControllerConnectionCollection::AddConnection( + PresentationConnection* aConnection, + const uint8_t aRole) +{ + MOZ_ASSERT(NS_IsMainThread()); + if (aRole != nsIPresentationService::ROLE_CONTROLLER) { + MOZ_ASSERT(false, "This is allowed only to be called at controller side."); + return; + } + + if (!aConnection) { + return; + } + + WeakPtr<PresentationConnection> connection = aConnection; + if (mConnections.Contains(connection)) { + return; + } + + mConnections.AppendElement(connection); +} + +void +ControllerConnectionCollection::RemoveConnection( + PresentationConnection* aConnection, + const uint8_t aRole) +{ + MOZ_ASSERT(NS_IsMainThread()); + if (aRole != nsIPresentationService::ROLE_CONTROLLER) { + MOZ_ASSERT(false, "This is allowed only to be called at controller side."); + return; + } + + if (!aConnection) { + return; + } + + WeakPtr<PresentationConnection> connection = aConnection; + mConnections.RemoveElement(connection); +} + +already_AddRefed<PresentationConnection> +ControllerConnectionCollection::FindConnection( + uint64_t aWindowId, + const nsAString& aId, + const uint8_t aRole) +{ + MOZ_ASSERT(NS_IsMainThread()); + if (aRole != nsIPresentationService::ROLE_CONTROLLER) { + MOZ_ASSERT(false, "This is allowed only to be called at controller side."); + return nullptr; + } + + // Loop backwards to allow removing elements in the loop. + for (int i = mConnections.Length() - 1; i >= 0; --i) { + WeakPtr<PresentationConnection> connection = mConnections[i]; + if (!connection) { + // The connection was destroyed. Remove it from the list. + mConnections.RemoveElementAt(i); + continue; + } + + if (connection->Equals(aWindowId, aId)) { + RefPtr<PresentationConnection> matchedConnection = connection.get(); + return matchedConnection.forget(); + } + } + + return nullptr; +} + +} // namespace dom +} // namespace mozilla |