MediaQuery.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/FlyString.h>
  8. #include <AK/NonnullOwnPtrVector.h>
  9. #include <AK/NonnullRefPtr.h>
  10. #include <AK/Optional.h>
  11. #include <AK/OwnPtr.h>
  12. #include <AK/RefCounted.h>
  13. #include <LibWeb/CSS/GeneralEnclosed.h>
  14. #include <LibWeb/CSS/StyleValue.h>
  15. namespace Web::CSS {
  16. class MediaQuery : public RefCounted<MediaQuery> {
  17. friend class Parser;
  18. public:
  19. ~MediaQuery() = default;
  20. // https://www.w3.org/TR/mediaqueries-4/#media-types
  21. enum class MediaType {
  22. All,
  23. Print,
  24. Screen,
  25. // Deprecated, must never match:
  26. TTY,
  27. TV,
  28. Projection,
  29. Handheld,
  30. Braille,
  31. Embossed,
  32. Aural,
  33. Speech,
  34. };
  35. // https://www.w3.org/TR/mediaqueries-4/#mq-features
  36. struct MediaFeature {
  37. // FIXME: Implement range syntax: https://www.w3.org/TR/mediaqueries-4/#mq-ranges
  38. enum class Type {
  39. IsTrue,
  40. ExactValue,
  41. MinValue,
  42. MaxValue,
  43. };
  44. Type type;
  45. FlyString name;
  46. RefPtr<StyleValue> value { nullptr };
  47. bool evaluate(DOM::Window const&) const;
  48. String to_string() const;
  49. };
  50. // https://www.w3.org/TR/mediaqueries-4/#media-conditions
  51. struct MediaCondition {
  52. enum class Type {
  53. Single,
  54. And,
  55. Or,
  56. Not,
  57. GeneralEnclosed,
  58. };
  59. Type type;
  60. MediaFeature feature;
  61. NonnullOwnPtrVector<MediaCondition> conditions;
  62. Optional<GeneralEnclosed> general_enclosed;
  63. MatchResult evaluate(DOM::Window const&) const;
  64. String to_string() const;
  65. };
  66. static NonnullRefPtr<MediaQuery> create_not_all();
  67. static NonnullRefPtr<MediaQuery> create() { return adopt_ref(*new MediaQuery); }
  68. bool matches() const { return m_matches; }
  69. bool evaluate(DOM::Window const&);
  70. String to_string() const;
  71. private:
  72. MediaQuery() = default;
  73. // https://www.w3.org/TR/mediaqueries-4/#mq-not
  74. bool m_negated { false };
  75. MediaType m_media_type { MediaType::All };
  76. OwnPtr<MediaCondition> m_media_condition { nullptr };
  77. // Cached value, updated by evaluate()
  78. bool m_matches { false };
  79. };
  80. String serialize_a_media_query_list(NonnullRefPtrVector<MediaQuery> const&);
  81. }
  82. namespace AK {
  83. template<>
  84. struct Formatter<Web::CSS::MediaQuery::MediaFeature> : Formatter<StringView> {
  85. ErrorOr<void> format(FormatBuilder& builder, Web::CSS::MediaQuery::MediaFeature const& media_feature)
  86. {
  87. return Formatter<StringView>::format(builder, media_feature.to_string());
  88. }
  89. };
  90. template<>
  91. struct Formatter<Web::CSS::MediaQuery::MediaCondition> : Formatter<StringView> {
  92. ErrorOr<void> format(FormatBuilder& builder, Web::CSS::MediaQuery::MediaCondition const& media_condition)
  93. {
  94. return Formatter<StringView>::format(builder, media_condition.to_string());
  95. }
  96. };
  97. template<>
  98. struct Formatter<Web::CSS::MediaQuery> : Formatter<StringView> {
  99. ErrorOr<void> format(FormatBuilder& builder, Web::CSS::MediaQuery const& media_query)
  100. {
  101. return Formatter<StringView>::format(builder, media_query.to_string());
  102. }
  103. };
  104. }