Supports.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (c) 2021-2022, Sam Atkins <atkinssj@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/NonnullOwnPtr.h>
  8. #include <AK/RefCounted.h>
  9. #include <AK/String.h>
  10. #include <AK/Variant.h>
  11. #include <AK/Vector.h>
  12. #include <LibWeb/CSS/GeneralEnclosed.h>
  13. #include <LibWeb/CSS/Parser/Declaration.h>
  14. namespace Web::CSS {
  15. // https://www.w3.org/TR/css-conditional-4/#at-supports
  16. class Supports final : public RefCounted<Supports> {
  17. friend class Parser::Parser;
  18. public:
  19. struct Declaration {
  20. String declaration;
  21. bool evaluate() const;
  22. String to_string() const;
  23. };
  24. struct Selector {
  25. String selector;
  26. bool evaluate() const;
  27. String to_string() const;
  28. };
  29. struct Feature {
  30. Variant<Declaration, Selector> value;
  31. bool evaluate() const;
  32. String to_string() const;
  33. };
  34. struct Condition;
  35. struct InParens {
  36. Variant<NonnullOwnPtr<Condition>, Feature, GeneralEnclosed> value;
  37. bool evaluate() const;
  38. String to_string() const;
  39. };
  40. struct Condition {
  41. enum class Type {
  42. Not,
  43. And,
  44. Or,
  45. };
  46. Type type;
  47. Vector<InParens> children;
  48. bool evaluate() const;
  49. String to_string() const;
  50. };
  51. static NonnullRefPtr<Supports> create(NonnullOwnPtr<Condition>&& condition)
  52. {
  53. return adopt_ref(*new Supports(move(condition)));
  54. }
  55. bool matches() const { return m_matches; }
  56. String to_string() const;
  57. private:
  58. Supports(NonnullOwnPtr<Condition>&&);
  59. NonnullOwnPtr<Condition> m_condition;
  60. bool m_matches { false };
  61. };
  62. }
  63. template<>
  64. struct AK::Formatter<Web::CSS::Supports::InParens> : AK::Formatter<StringView> {
  65. ErrorOr<void> format(FormatBuilder& builder, Web::CSS::Supports::InParens const& in_parens)
  66. {
  67. return Formatter<StringView>::format(builder, in_parens.to_string());
  68. }
  69. };