summaryrefslogtreecommitdiffstats
path: root/layout/style/MediaFeatureChange.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/MediaFeatureChange.h')
-rw-r--r--layout/style/MediaFeatureChange.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/layout/style/MediaFeatureChange.h b/layout/style/MediaFeatureChange.h
new file mode 100644
index 0000000000..70f81f7d1c
--- /dev/null
+++ b/layout/style/MediaFeatureChange.h
@@ -0,0 +1,94 @@
+/* -*- 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/. */
+
+/* A struct defining a media feature change. */
+
+#ifndef mozilla_MediaFeatureChange_h__
+#define mozilla_MediaFeatureChange_h__
+
+#include "nsChangeHint.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/TypedEnumBits.h"
+#include "mozilla/ServoStyleConsts.h"
+
+namespace mozilla {
+
+enum class MediaFeatureChangeReason : uint16_t {
+ // The viewport size the document has used has changed.
+ //
+ // This affects size media queries like min-width.
+ ViewportChange = 1 << 0,
+ // The effective text zoom has changed. This affects the meaning of em units,
+ // and thus affects any media query that uses a Length.
+ ZoomChange = 1 << 1,
+ // The resolution has changed. This can affect device-pixel-ratio media
+ // queries, for example.
+ ResolutionChange = 1 << 2,
+ // The medium has changed.
+ MediumChange = 1 << 3,
+ // The size-mode has changed.
+ SizeModeChange = 1 << 4,
+ // A system metric or multiple have changed. This affects all the media
+ // features that expose the presence of a system metric directly.
+ SystemMetricsChange = 1 << 5,
+ // The fact of whether the device size is the page size has changed, thus
+ // resolution media queries can change.
+ DeviceSizeIsPageSizeChange = 1 << 6,
+ // display-mode changed on the document, thus the display-mode media queries
+ // may have changed.
+ DisplayModeChange = 1 << 7,
+ // A preference that affects media query results has changed. For
+ // example, changes to document_color_use will affect
+ // prefers-contrast.
+ PreferenceChange = 1 << 8,
+};
+
+MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(MediaFeatureChangeReason)
+
+enum class MediaFeatureChangePropagation : uint8_t {
+ JustThisDocument = 0,
+ SubDocuments = 1 << 0,
+ Images = 1 << 1,
+ All = Images | SubDocuments,
+};
+
+MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(MediaFeatureChangePropagation)
+
+struct MediaFeatureChange {
+ static const auto kAllChanges = static_cast<MediaFeatureChangeReason>(~0);
+
+ RestyleHint mRestyleHint;
+ nsChangeHint mChangeHint;
+ MediaFeatureChangeReason mReason;
+
+ MOZ_IMPLICIT MediaFeatureChange(MediaFeatureChangeReason aReason)
+ : MediaFeatureChange(RestyleHint{0}, nsChangeHint(0), aReason) {}
+
+ MediaFeatureChange(RestyleHint aRestyleHint, nsChangeHint aChangeHint,
+ MediaFeatureChangeReason aReason)
+ : mRestyleHint(aRestyleHint),
+ mChangeHint(aChangeHint),
+ mReason(aReason) {}
+
+ inline MediaFeatureChange& operator|=(const MediaFeatureChange& aOther) {
+ mRestyleHint |= aOther.mRestyleHint;
+ mChangeHint |= aOther.mChangeHint;
+ mReason |= aOther.mReason;
+ return *this;
+ }
+
+ static MediaFeatureChange ForPreferredColorSchemeChange() {
+ // We need to restyle because not only media queries have changed, system
+ // colors may as well via the prefers-color-scheme meta tag / effective
+ // color-scheme property value.
+ return {RestyleHint::RecascadeSubtree(), nsChangeHint(0),
+ MediaFeatureChangeReason::SystemMetricsChange};
+ }
+};
+
+} // namespace mozilla
+
+#endif