LSObserver.cpp (1626B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=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 file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "LSObserver.h" 8 9 // Local includes 10 #include "ActorsChild.h" 11 12 // Global includes 13 14 #include "mozilla/StaticPtr.h" 15 #include "nsHashKeys.h" 16 #include "nsTHashMap.h" 17 18 namespace mozilla::dom { 19 20 namespace { 21 22 using LSObserverHashtable = nsTHashMap<nsCStringHashKey, LSObserver*>; 23 24 StaticAutoPtr<LSObserverHashtable> gLSObservers; 25 26 } // namespace 27 28 LSObserver::LSObserver(const nsACString& aOrigin) 29 : mActor(nullptr), mOrigin(aOrigin) { 30 AssertIsOnOwningThread(); 31 32 if (!gLSObservers) { 33 gLSObservers = new LSObserverHashtable(); 34 } 35 36 MOZ_ASSERT(!gLSObservers->Contains(mOrigin)); 37 gLSObservers->InsertOrUpdate(mOrigin, this); 38 } 39 40 LSObserver::~LSObserver() { 41 AssertIsOnOwningThread(); 42 43 if (mActor) { 44 mActor->SendDeleteMeInternal(); 45 MOZ_ASSERT(!mActor, "SendDeleteMeInternal should have cleared!"); 46 } 47 48 MOZ_ASSERT(gLSObservers); 49 MOZ_ASSERT(gLSObservers->Get(mOrigin)); 50 gLSObservers->Remove(mOrigin); 51 52 if (!gLSObservers->Count()) { 53 gLSObservers = nullptr; 54 } 55 } 56 57 // static 58 LSObserver* LSObserver::Get(const nsACString& aOrigin) { 59 return gLSObservers ? gLSObservers->Get(aOrigin) : nullptr; 60 } 61 62 void LSObserver::SetActor(LSObserverChild* aActor) { 63 AssertIsOnOwningThread(); 64 MOZ_ASSERT(aActor); 65 MOZ_ASSERT(!mActor); 66 67 mActor = aActor; 68 } 69 70 } // namespace mozilla::dom