summaryrefslogtreecommitdiffstats
path: root/dom/xul/XULBroadcastManager.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /dom/xul/XULBroadcastManager.h
parentInitial commit. (diff)
downloadfirefox-upstream.tar.xz
firefox-upstream.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/xul/XULBroadcastManager.h')
-rw-r--r--dom/xul/XULBroadcastManager.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/dom/xul/XULBroadcastManager.h b/dom/xul/XULBroadcastManager.h
new file mode 100644
index 0000000000..c5fcbf3bf7
--- /dev/null
+++ b/dom/xul/XULBroadcastManager.h
@@ -0,0 +1,90 @@
+/* -*- 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 mozilla_dom_XULBroadcastManager_h
+#define mozilla_dom_XULBroadcastManager_h
+
+#include "nsAtom.h"
+#include "nsTArray.h"
+
+class PLDHashTable;
+class nsXULElement;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class Document;
+class Element;
+
+class XULBroadcastManager final {
+ public:
+ explicit XULBroadcastManager(Document* aDocument);
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(XULBroadcastManager)
+
+ /**
+ * Checks whether an element uses any of the special broadcaster attributes
+ * or is an observes element. This mimics the logic in FindBroadcaster, but
+ * is intended to be a lighter weight check and doesn't actually guarantee
+ * that the element will need a listener.
+ */
+ static bool MayNeedListener(const Element& aElement);
+
+ nsresult AddListener(Element* aElement);
+ nsresult RemoveListener(Element* aElement);
+ void AttributeChanged(Element* aElement, int32_t aNameSpaceID,
+ nsAtom* aAttribute);
+ void MaybeBroadcast();
+ void DropDocumentReference(); // notification that doc is going away
+ protected:
+ enum HookupAction { eHookupAdd = 0, eHookupRemove };
+
+ nsresult UpdateListenerHookup(Element* aElement, HookupAction aAction);
+
+ void RemoveListenerFor(Element& aBroadcaster, Element& aListener,
+ const nsAString& aAttr);
+ void AddListenerFor(Element& aBroadcaster, Element& aListener,
+ const nsAString& aAttr, ErrorResult& aRv);
+
+ nsresult ExecuteOnBroadcastHandlerFor(Element* aBroadcaster,
+ Element* aListener, nsAtom* aAttr);
+ // The out params of FindBroadcaster only have values that make sense when
+ // the method returns NS_FINDBROADCASTER_FOUND. In all other cases, the
+ // values of the out params should not be relied on (though *aListener and
+ // *aBroadcaster do need to be released if non-null, of course).
+ nsresult FindBroadcaster(Element* aElement, Element** aListener,
+ nsString& aBroadcasterID, nsString& aAttribute,
+ Element** aBroadcaster);
+
+ void SynchronizeBroadcastListener(Element* aBroadcaster, Element* aListener,
+ const nsAString& aAttr);
+
+ // This reference is nulled by the Document in it's destructor through
+ // DropDocumentReference().
+ Document* MOZ_NON_OWNING_REF mDocument;
+
+ /**
+ * A map from a broadcaster element to a list of listener elements.
+ */
+ PLDHashTable* mBroadcasterMap;
+
+ class nsDelayedBroadcastUpdate;
+ nsTArray<nsDelayedBroadcastUpdate> mDelayedBroadcasters;
+ nsTArray<nsDelayedBroadcastUpdate> mDelayedAttrChangeBroadcasts;
+ bool mHandlingDelayedAttrChange;
+ bool mHandlingDelayedBroadcasters;
+
+ private:
+ ~XULBroadcastManager();
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_XULBroadcastManager_h