summaryrefslogtreecommitdiffstats
path: root/layout/style/MediaQueryList.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 /layout/style/MediaQueryList.h
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'layout/style/MediaQueryList.h')
-rw-r--r--layout/style/MediaQueryList.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/layout/style/MediaQueryList.h b/layout/style/MediaQueryList.h
new file mode 100644
index 0000000000..9fd1b1ca19
--- /dev/null
+++ b/layout/style/MediaQueryList.h
@@ -0,0 +1,103 @@
+/* -*- 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/. */
+
+/* implements DOM interface for querying and observing media queries */
+
+#ifndef mozilla_dom_MediaQueryList_h
+#define mozilla_dom_MediaQueryList_h
+
+#include "nsISupports.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsCOMPtr.h"
+#include "nsTArray.h"
+#include "mozilla/LinkedList.h"
+#include "mozilla/Attributes.h"
+#include "nsWrapperCache.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/MediaQueryListBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+class MediaList;
+
+class MediaQueryList final : public DOMEventTargetHelper,
+ public LinkedListElement<MediaQueryList> {
+ public:
+ // The caller who constructs is responsible for calling Evaluate
+ // before calling any other methods.
+ MediaQueryList(Document* aDocument, const nsACString& aMediaQueryList,
+ CallerType aCallerType);
+
+ private:
+ ~MediaQueryList();
+
+ public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaQueryList, DOMEventTargetHelper)
+
+ nsISupports* GetParentObject() const;
+
+ // Returns whether we need to notify of the change event using
+ // FireChangeEvent().
+ [[nodiscard]] bool MediaFeatureValuesChanged();
+ void FireChangeEvent();
+
+ JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+
+ // WebIDL methods
+ void GetMedia(nsACString& aMedia);
+ bool Matches();
+ void AddListener(EventListener* aListener, ErrorResult& aRv);
+ void RemoveListener(EventListener* aListener, ErrorResult& aRv);
+
+ using DOMEventTargetHelper::EventListenerAdded;
+ void EventListenerAdded(nsAtom* aType) override;
+
+ IMPL_EVENT_HANDLER(change)
+
+ bool HasListeners();
+
+ void Disconnect();
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
+
+ private:
+ void LastRelease() final {
+ auto listElement = static_cast<LinkedListElement<MediaQueryList>*>(this);
+ if (listElement->isInList()) {
+ listElement->remove();
+ }
+ }
+
+ void RecomputeMatches();
+
+ // We only need a pointer to the document to support lazy
+ // reevaluation following dynamic changes. However, this lazy
+ // reevaluation is perhaps somewhat important, since some usage
+ // patterns may involve the creation of large numbers of
+ // MediaQueryList objects which almost immediately become garbage
+ // (after a single call to the .matches getter).
+ //
+ // This pointer does make us a little more dependent on cycle
+ // collection.
+ //
+ // We have a non-null mDocument for our entire lifetime except
+ // after cycle collection unlinking. Having a non-null mDocument
+ // is equivalent to being in that document's mDOMMediaQueryLists
+ // linked list.
+ RefPtr<Document> mDocument;
+
+ RefPtr<MediaList> mMediaList;
+ bool mMatches;
+ bool mMatchesValid;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* !defined(mozilla_dom_MediaQueryList_h) */