gecko-dev/xpcom/ds/nsObserverList.h
Gabriele Svelto 3521fc20c7 Bug 1502284 - Cleanup of the observer service code r=erahm
This refactors the observer service code to improve readability, uses MOZ_TRY
and other checking macros wherever possible to simplify error handling and
replaces the ObserverRef class with the more generic nsMaybeWeakPtr class.
This cuts away some code and halves the amount of memory needed to store an
event listener. The external behavior is almost unchanged save for some error
codes which are now more specific.

Differential Revision: https://phabricator.services.mozilla.com/D11646

--HG--
extra : source : 10d910aa9f31435116a718bafe8a2b71c61fe23d
2018-11-12 11:04:17 +01:00

76 lines
2.1 KiB
C++

/* -*- 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/. */
#ifndef nsObserverList_h___
#define nsObserverList_h___
#include "nsISupports.h"
#include "nsCOMPtr.h"
#include "nsCOMArray.h"
#include "nsIObserver.h"
#include "nsHashKeys.h"
#include "nsMaybeWeakPtr.h"
#include "nsSimpleEnumerator.h"
#include "mozilla/Attributes.h"
class nsObserverList : public nsCharPtrHashKey
{
friend class nsObserverService;
public:
explicit nsObserverList(const char* aKey) : nsCharPtrHashKey(aKey)
{
MOZ_COUNT_CTOR(nsObserverList);
}
nsObserverList(nsObserverList&& aOther)
: nsCharPtrHashKey(std::move(aOther))
, mObservers(std::move(aOther.mObservers))
{
}
~nsObserverList()
{
MOZ_COUNT_DTOR(nsObserverList);
}
MOZ_MUST_USE nsresult AddObserver(nsIObserver* aObserver, bool aOwnsWeak);
MOZ_MUST_USE nsresult RemoveObserver(nsIObserver* aObserver);
void NotifyObservers(nsISupports* aSubject,
const char* aTopic,
const char16_t* aSomeData);
void GetObserverList(nsISimpleEnumerator** aEnumerator);
// Fill an array with the observers of this category.
// The array is filled in last-added-first order.
void FillObserverArray(nsCOMArray<nsIObserver>& aArray);
// Like FillObserverArray(), but only for strongly held observers.
void AppendStrongObservers(nsCOMArray<nsIObserver>& aArray);
private:
nsMaybeWeakPtrArray<nsIObserver> mObservers;
};
class nsObserverEnumerator final : public nsSimpleEnumerator
{
public:
NS_DECL_NSISIMPLEENUMERATOR
explicit nsObserverEnumerator(nsObserverList* aObserverList);
const nsID& DefaultInterface() override { return NS_GET_IID(nsIObserver); }
private:
~nsObserverEnumerator() override = default;
int32_t mIndex; // Counts up from 0
nsCOMArray<nsIObserver> mObservers;
};
#endif /* nsObserverList_h___ */