Explorar el Código

LibWeb: Treat '<' characters as part of the text inside <script>

When we encounter a '<' during HTML parsing, we now look ahead to see
if there is a full </script> coming, otherwise we treat it as text.

This makes it possible to use '<' in inline scripts. :^)
Andreas Kling hace 5 años
padre
commit
42f47da75d
Se han modificado 1 ficheros con 19 adiciones y 4 borrados
  1. 19 4
      Libraries/LibWeb/Parser/HTMLParser.cpp

+ 19 - 4
Libraries/LibWeb/Parser/HTMLParser.cpp

@@ -174,10 +174,26 @@ static bool parse_html_document(const StringView& html, Document& document, Pare
         switch (state) {
         switch (state) {
         case State::Free:
         case State::Free:
             if (ch == '<') {
             if (ch == '<') {
-                is_slash_tag = false;
-                move_to_state(State::BeforeTagName);
-                break;
+                bool should_treat_as_text = false;
+                if (node_stack.last().tag_name() == "script") {
+                    bool is_script_close_tag = peek(1) == '/'
+                        && tolower(peek(2)) == 's'
+                        && tolower(peek(3)) == 'c'
+                        && tolower(peek(4)) == 'r'
+                        && tolower(peek(5)) == 'i'
+                        && tolower(peek(6)) == 'p'
+                        && tolower(peek(7)) == 't'
+                        && tolower(peek(8)) == '>';
+                    if (!is_script_close_tag)
+                        should_treat_as_text = true;
+                }
+                if (!should_treat_as_text) {
+                    is_slash_tag = false;
+                    move_to_state(State::BeforeTagName);
+                    break;
+                }
             }
             }
+
             if (ch != '&') {
             if (ch != '&') {
                 text_buffer.append(ch);
                 text_buffer.append(ch);
             } else {
             } else {
@@ -394,5 +410,4 @@ RefPtr<Document> parse_html_document(const StringView& html, const URL& url)
 
 
     return document;
     return document;
 }
 }
-
 }
 }