diff --git a/Libraries/LibWeb/Parser/HTMLTokenizer.cpp b/Libraries/LibWeb/Parser/HTMLTokenizer.cpp
index b1c2b8462e..a3bf9ffd4f 100644
--- a/Libraries/LibWeb/Parser/HTMLTokenizer.cpp
+++ b/Libraries/LibWeb/Parser/HTMLTokenizer.cpp
@@ -986,7 +986,11 @@ _StartOfFunction:
}
ON('=')
{
- TODO();
+ PARSE_ERROR();
+ auto new_attribute = HTMLToken::AttributeBuilder();
+ new_attribute.local_name_builder.append_codepoint(current_input_character.value());
+ m_current_token.m_tag.attributes.append(new_attribute);
+ SWITCH_TO(AttributeName);
}
ANYTHING_ELSE
{
@@ -1038,8 +1042,35 @@ _StartOfFunction:
{
SWITCH_TO(BeforeAttributeValue);
}
+ ON_ASCII_UPPER_ALPHA
+ {
+ m_current_token.m_tag.attributes.last().local_name_builder.append_codepoint(tolower(current_input_character.value()));
+ continue;
+ }
+ ON(0)
+ {
+ PARSE_ERROR();
+ m_current_token.m_tag.attributes.last().local_name_builder.append_codepoint(0xFFFD);
+ continue;
+ }
+ ON('"')
+ {
+ PARSE_ERROR();
+ goto AnythingElseAttributeName;
+ }
+ ON('\'')
+ {
+ PARSE_ERROR();
+ goto AnythingElseAttributeName;
+ }
+ ON('<')
+ {
+ PARSE_ERROR();
+ goto AnythingElseAttributeName;
+ }
ANYTHING_ELSE
{
+ AnythingElseAttributeName:
m_current_token.m_tag.attributes.last().local_name_builder.append_codepoint(current_input_character.value());
continue;
}
@@ -1116,7 +1147,9 @@ _StartOfFunction:
}
ON(0)
{
- TODO();
+ PARSE_ERROR();
+ m_current_token.m_tag.attributes.last().value_builder.append_codepoint(0xFFFD);
+ continue;
}
ON_EOF
{
@@ -1144,7 +1177,9 @@ _StartOfFunction:
}
ON(0)
{
- TODO();
+ PARSE_ERROR();
+ m_current_token.m_tag.attributes.last().value_builder.append_codepoint(0xFFFD);
+ continue;
}
ON_EOF
{
@@ -1176,7 +1211,34 @@ _StartOfFunction:
}
ON(0)
{
- TODO();
+ PARSE_ERROR();
+ m_current_token.m_tag.attributes.last().value_builder.append_codepoint(0xFFFD);
+ continue;
+ }
+ ON('"')
+ {
+ PARSE_ERROR();
+ goto AnythingElseAttributeValueUnquoted;
+ }
+ ON('\'')
+ {
+ PARSE_ERROR();
+ goto AnythingElseAttributeValueUnquoted;
+ }
+ ON('<')
+ {
+ PARSE_ERROR();
+ goto AnythingElseAttributeValueUnquoted;
+ }
+ ON('=')
+ {
+ PARSE_ERROR();
+ goto AnythingElseAttributeValueUnquoted;
+ }
+ ON('`')
+ {
+ PARSE_ERROR();
+ goto AnythingElseAttributeValueUnquoted;
}
ON_EOF
{
@@ -1185,6 +1247,7 @@ _StartOfFunction:
}
ANYTHING_ELSE
{
+ AnythingElseAttributeValueUnquoted:
m_current_token.m_tag.attributes.last().value_builder.append_codepoint(current_input_character.value());
continue;
}
@@ -1510,7 +1573,8 @@ _StartOfFunction:
}
ON(';')
{
- TODO();
+ PARSE_ERROR();
+ RECONSUME_IN_RETURN_STATE;
}
ANYTHING_ELSE
{
@@ -1548,7 +1612,9 @@ _StartOfFunction:
}
ANYTHING_ELSE
{
- TODO();
+ PARSE_ERROR();
+ FLUSH_CODEPOINTS_CONSUMED_AS_A_CHARACTER_REFERENCE;
+ RECONSUME_IN_RETURN_STATE;
}
}
END_STATE
@@ -1561,7 +1627,9 @@ _StartOfFunction:
}
ANYTHING_ELSE
{
- TODO();
+ PARSE_ERROR();
+ FLUSH_CODEPOINTS_CONSUMED_AS_A_CHARACTER_REFERENCE;
+ RECONSUME_IN_RETURN_STATE;
}
}
END_STATE
@@ -1592,7 +1660,8 @@ _StartOfFunction:
}
ANYTHING_ELSE
{
- TODO();
+ PARSE_ERROR();
+ RECONSUME_IN(NumericCharacterReferenceEnd);
}
}
END_STATE
@@ -1611,7 +1680,8 @@ _StartOfFunction:
}
ANYTHING_ELSE
{
- TODO();
+ PARSE_ERROR();
+ RECONSUME_IN(NumericCharacterReferenceEnd);
}
}
END_STATE
@@ -1621,22 +1691,22 @@ _StartOfFunction:
DONT_CONSUME_NEXT_INPUT_CHARACTER;
if (m_character_reference_code == 0) {
- TODO();
+ PARSE_ERROR();
+ m_character_reference_code = 0xFFFD;
}
if (m_character_reference_code > 0x10ffff) {
- TODO();
+ PARSE_ERROR();
+ m_character_reference_code = 0xFFFD;
}
if (is_surrogate(m_character_reference_code)) {
- TODO();
+ PARSE_ERROR();
+ m_character_reference_code = 0xFFFD;
}
if (is_noncharacter(m_character_reference_code)) {
- TODO();
+ PARSE_ERROR();
}
if (m_character_reference_code == 0xd || (is_control(m_character_reference_code) && !isspace(m_character_reference_code))) {
- TODO();
- }
-
- if (is_control(m_character_reference_code)) {
+ PARSE_ERROR();
constexpr struct {
u32 number;
u32 codepoint;