MediaList.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/CSS/MediaList.h>
  7. #include <LibWeb/CSS/Parser/Parser.h>
  8. namespace Web::CSS {
  9. MediaList::MediaList(NonnullRefPtrVector<MediaQuery>&& media)
  10. : m_media(move(media))
  11. {
  12. }
  13. MediaList::~MediaList()
  14. {
  15. }
  16. // https://www.w3.org/TR/cssom-1/#dom-medialist-mediatext
  17. String MediaList::media_text() const
  18. {
  19. return serialize_a_media_query_list(m_media);
  20. }
  21. // https://www.w3.org/TR/cssom-1/#dom-medialist-mediatext
  22. void MediaList::set_media_text(String const& text)
  23. {
  24. m_media.clear();
  25. if (text.is_empty())
  26. return;
  27. m_media = parse_media_query_list({}, text);
  28. }
  29. // https://www.w3.org/TR/cssom-1/#dom-medialist-item
  30. Optional<String> MediaList::item(size_t index) const
  31. {
  32. if (index >= length())
  33. return {};
  34. return m_media[index].to_string();
  35. }
  36. // https://www.w3.org/TR/cssom-1/#dom-medialist-appendmedium
  37. void MediaList::append_medium(String medium)
  38. {
  39. auto m = parse_media_query({}, medium);
  40. if (!m)
  41. return;
  42. if (m_media.contains_slow(*m))
  43. return;
  44. m_media.append(m.release_nonnull());
  45. }
  46. // https://www.w3.org/TR/cssom-1/#dom-medialist-deletemedium
  47. void MediaList::delete_medium(String medium)
  48. {
  49. auto m = parse_media_query({}, medium);
  50. if (!m)
  51. return;
  52. m_media.remove_all_matching([&](auto& existing) -> bool {
  53. return m->to_string() == existing->to_string();
  54. });
  55. // FIXME: If nothing was removed, then throw a NotFoundError exception.
  56. }
  57. bool MediaList::evaluate(DOM::Window const& window)
  58. {
  59. for (auto& media : m_media)
  60. media.evaluate(window);
  61. return matches();
  62. }
  63. bool MediaList::matches() const
  64. {
  65. for (auto& media : m_media) {
  66. if (media.matches())
  67. return true;
  68. }
  69. return false;
  70. }
  71. }