Sfoglia il codice sorgente

LibWeb: Handle an error condition for "a" start tag during "in body"

If we have an <a> element on the list of active formatting elements
when hitting another "a" start tag, that's a parse error. Recover by
using the AAA.
Andreas Kling 5 anni fa
parent
commit
b9d5d45eff

+ 7 - 2
Libraries/LibWeb/Parser/HTMLDocumentParser.cpp

@@ -945,8 +945,13 @@ void HTMLDocumentParser::handle_in_body(HTMLToken& token)
     }
 
     if (token.is_start_tag() && token.tag_name() == "a") {
-        if (m_list_of_active_formatting_elements.last_element_with_tag_name_before_marker("a")) {
-            TODO();
+        if (auto* element = m_list_of_active_formatting_elements.last_element_with_tag_name_before_marker("a")) {
+            PARSE_ERROR();
+            run_the_adoption_agency_algorithm(token);
+            m_list_of_active_formatting_elements.remove(*element);
+            m_stack_of_open_elements.elements().remove_first_matching([&](auto& entry) {
+                return entry.ptr() == element;
+            });
         }
         reconstruct_the_active_formatting_elements();
         auto element = insert_html_element(token);

+ 1 - 0
Libraries/LibWeb/Parser/StackOfOpenElements.h

@@ -57,6 +57,7 @@ public:
     bool contains(const Element&) const;
 
     const NonnullRefPtrVector<Element>& elements() const { return m_elements; }
+    NonnullRefPtrVector<Element>& elements() { return m_elements; }
 
     void pop_until_an_element_with_tag_name_has_been_popped(const FlyString&);