MediaList.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
  3. * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibWeb/Bindings/Intrinsics.h>
  8. #include <LibWeb/Bindings/MediaListPrototype.h>
  9. #include <LibWeb/CSS/MediaList.h>
  10. #include <LibWeb/CSS/Parser/Parser.h>
  11. namespace Web::CSS {
  12. MediaList* MediaList::create(JS::Realm& realm, NonnullRefPtrVector<MediaQuery>&& media)
  13. {
  14. return realm.heap().allocate<MediaList>(realm, realm, move(media));
  15. }
  16. MediaList::MediaList(JS::Realm& realm, NonnullRefPtrVector<MediaQuery>&& media)
  17. : Bindings::LegacyPlatformObject(Bindings::ensure_web_prototype<Bindings::MediaListPrototype>(realm, "MediaList"))
  18. , m_media(move(media))
  19. {
  20. }
  21. // https://www.w3.org/TR/cssom-1/#dom-medialist-mediatext
  22. DeprecatedString MediaList::media_text() const
  23. {
  24. return serialize_a_media_query_list(m_media);
  25. }
  26. // https://www.w3.org/TR/cssom-1/#dom-medialist-mediatext
  27. void MediaList::set_media_text(DeprecatedString const& text)
  28. {
  29. m_media.clear();
  30. if (text.is_empty())
  31. return;
  32. m_media = parse_media_query_list({}, text);
  33. }
  34. bool MediaList::is_supported_property_index(u32 index) const
  35. {
  36. return index < length();
  37. }
  38. // https://www.w3.org/TR/cssom-1/#dom-medialist-item
  39. DeprecatedString MediaList::item(u32 index) const
  40. {
  41. if (!is_supported_property_index(index))
  42. return {};
  43. return m_media[index].to_deprecated_string();
  44. }
  45. // https://www.w3.org/TR/cssom-1/#dom-medialist-appendmedium
  46. void MediaList::append_medium(DeprecatedString medium)
  47. {
  48. auto m = parse_media_query({}, medium);
  49. if (!m)
  50. return;
  51. if (m_media.contains_slow(*m))
  52. return;
  53. m_media.append(m.release_nonnull());
  54. }
  55. // https://www.w3.org/TR/cssom-1/#dom-medialist-deletemedium
  56. void MediaList::delete_medium(DeprecatedString medium)
  57. {
  58. auto m = parse_media_query({}, medium);
  59. if (!m)
  60. return;
  61. m_media.remove_all_matching([&](auto& existing) -> bool {
  62. return m->to_deprecated_string() == existing->to_deprecated_string();
  63. });
  64. // FIXME: If nothing was removed, then throw a NotFoundError exception.
  65. }
  66. bool MediaList::evaluate(HTML::Window const& window)
  67. {
  68. for (auto& media : m_media)
  69. media.evaluate(window);
  70. return matches();
  71. }
  72. bool MediaList::matches() const
  73. {
  74. if (m_media.is_empty()) {
  75. return true;
  76. }
  77. for (auto& media : m_media) {
  78. if (media.matches())
  79. return true;
  80. }
  81. return false;
  82. }
  83. JS::Value MediaList::item_value(size_t index) const
  84. {
  85. if (index >= m_media.size())
  86. return JS::js_undefined();
  87. return JS::PrimitiveString::create(vm(), m_media[index].to_deprecated_string());
  88. }
  89. }