StackOfOpenElements.cpp 973 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include <LibWeb/DOM/Element.h>
  2. #include <LibWeb/Parser/StackOfOpenElements.h>
  3. namespace Web {
  4. static Vector<FlyString> s_base_list { "applet", "caption", "html", "table", "td", "th", "marquee", "object", "template" };
  5. StackOfOpenElements::~StackOfOpenElements()
  6. {
  7. }
  8. bool StackOfOpenElements::has_in_scope_impl(const FlyString& tag_name, const Vector<FlyString> &list) const
  9. {
  10. for (ssize_t i = m_elements.size() - 1; i >= 0; --i) {
  11. auto& node = m_elements.at(i);
  12. if (node.tag_name() == tag_name)
  13. return true;
  14. if (list.contains_slow(node.tag_name()))
  15. return false;
  16. }
  17. ASSERT_NOT_REACHED();
  18. }
  19. bool StackOfOpenElements::has_in_scope(const FlyString& tag_name) const
  20. {
  21. return has_in_scope_impl(tag_name, s_base_list);
  22. }
  23. bool StackOfOpenElements::has_in_button_scope(const FlyString& tag_name) const
  24. {
  25. auto list = s_base_list;
  26. list.append("button");
  27. return has_in_scope_impl(tag_name, list);
  28. }
  29. }