فهرست منبع

LibWeb: Parse "textarea" tags during the "in body" insertion mode

Had to handle some more cases in the tokenizer to support this.
Andreas Kling 5 سال پیش
والد
کامیت
756829555a
2فایلهای تغییر یافته به همراه45 افزوده شده و 11 حذف شده
  1. 18 1
      Libraries/LibWeb/Parser/HTMLDocumentParser.cpp
  2. 27 10
      Libraries/LibWeb/Parser/HTMLTokenizer.cpp

+ 18 - 1
Libraries/LibWeb/Parser/HTMLDocumentParser.cpp

@@ -1154,7 +1154,24 @@ void HTMLDocumentParser::handle_in_body(HTMLToken& token)
     }
 
     if (token.is_start_tag() && token.tag_name() == "textarea") {
-        TODO();
+        insert_html_element(token);
+
+        // If the next token is a U+000A LINE FEED (LF) character token,
+        // then ignore that token and move on to the next one.
+        // (Newlines at the start of pre blocks are ignored as an authoring convenience.)
+        auto next_token = m_tokenizer.next_token();
+
+        m_tokenizer.switch_to({}, HTMLTokenizer::State::RCDATA);
+        m_original_insertion_mode = m_insertion_mode;
+        m_frameset_ok = false;
+        m_insertion_mode = InsertionMode::Text;
+
+        if (next_token.has_value() && next_token.value().is_character() && next_token.value().codepoint() == '\n') {
+            // Ignore it.
+        } else {
+            process_using_the_rules_for(m_insertion_mode, next_token.value());
+        }
+        return;
     }
 
     if (token.is_start_tag() && token.tag_name() == "xmp") {

+ 27 - 10
Libraries/LibWeb/Parser/HTMLTokenizer.cpp

@@ -1029,11 +1029,13 @@ _StartOfFunction:
                 }
                 ON_EOF
                 {
-                    TODO();
+                    PARSE_ERROR();
+                    EMIT_EOF;
                 }
                 ANYTHING_ELSE
                 {
-                    TODO();
+                    PARSE_ERROR();
+                    RECONSUME_IN(BeforeAttributeName);
                 }
             }
             END_STATE
@@ -1521,7 +1523,9 @@ _StartOfFunction:
                 ANYTHING_ELSE
                 {
                     // FIXME: Emit a U+003C LESS-THAN SIGN character token and a U+002F SOLIDUS character token. Reconsume in the RCDATA state.
-                    TODO();
+                    m_queued_tokens.enqueue(HTMLToken::make_character('<'));
+                    m_queued_tokens.enqueue(HTMLToken::make_character('/'));
+                    RECONSUME_IN(RCDATA);
                 }
             }
             END_STATE
@@ -1531,24 +1535,33 @@ _StartOfFunction:
                 ON_WHITESPACE
                 {
                     if (!current_end_tag_token_is_appropriate()) {
-                        // FIXME: Otherwise, treat it as per the "anything else" entry below.
-                        TODO();
+                        m_queued_tokens.enqueue(HTMLToken::make_character('<'));
+                        m_queued_tokens.enqueue(HTMLToken::make_character('/'));
+                        for (auto codepoint : m_temporary_buffer)
+                            m_queued_tokens.enqueue(HTMLToken::make_character(codepoint));
+                        RECONSUME_IN(RCDATA);
                     }
                     SWITCH_TO(BeforeAttributeName);
                 }
                 ON('/')
                 {
                     if (!current_end_tag_token_is_appropriate()) {
-                        // FIXME: Otherwise, treat it as per the "anything else" entry below.
-                        TODO();
+                        m_queued_tokens.enqueue(HTMLToken::make_character('<'));
+                        m_queued_tokens.enqueue(HTMLToken::make_character('/'));
+                        for (auto codepoint : m_temporary_buffer)
+                            m_queued_tokens.enqueue(HTMLToken::make_character(codepoint));
+                        RECONSUME_IN(RCDATA);
                     }
                     SWITCH_TO(SelfClosingStartTag);
                 }
                 ON('>')
                 {
                     if (!current_end_tag_token_is_appropriate()) {
-                        // FIXME: Otherwise, treat it as per the "anything else" entry below.
-                        TODO();
+                        m_queued_tokens.enqueue(HTMLToken::make_character('<'));
+                        m_queued_tokens.enqueue(HTMLToken::make_character('/'));
+                        for (auto codepoint : m_temporary_buffer)
+                            m_queued_tokens.enqueue(HTMLToken::make_character(codepoint));
+                        RECONSUME_IN(RCDATA);
                     }
                     SWITCH_TO_AND_EMIT_CURRENT_TOKEN(Data);
                 }
@@ -1566,7 +1579,11 @@ _StartOfFunction:
                 }
                 ANYTHING_ELSE
                 {
-                    TODO();
+                    m_queued_tokens.enqueue(HTMLToken::make_character('<'));
+                    m_queued_tokens.enqueue(HTMLToken::make_character('/'));
+                    for (auto codepoint : m_temporary_buffer)
+                        m_queued_tokens.enqueue(HTMLToken::make_character(codepoint));
+                    RECONSUME_IN(RCDATA);
                 }
             }
             END_STATE