LibWeb: Update parser with more insertion modes :^)

Implements handling of InHeadNoScript, InSelectInTable, InTemplate,
InFrameset, AfterFrameset, and AfterAfterFrameset.
This commit is contained in:
stelar7 2020-06-21 06:58:03 +02:00 committed by Andreas Kling
parent 8e24a17d0d
commit 5eb39a5f61
Notes: sideshowbarker 2024-07-19 05:29:53 +09:00
6 changed files with 471 additions and 30 deletions

View file

@ -118,12 +118,40 @@ public:
{
ASSERT(is_start_tag() || is_end_tag());
for (auto& attribute : m_tag.attributes) {
if (attribute_name == attribute.name_builder.string_view())
if (attribute_name == attribute.local_name_builder.string_view())
return attribute.value_builder.string_view();
}
return {};
}
void adjust_attribute_name(const FlyString& old_name, const FlyString& new_name)
{
ASSERT(is_start_tag() || is_end_tag());
for (auto& attribute : m_tag.attributes) {
if (old_name == attribute.local_name_builder.string_view()) {
attribute.local_name_builder.clear();
attribute.local_name_builder.append(new_name);
}
}
}
void adjust_foreign_attribute(const FlyString& old_name, const FlyString& prefix, const FlyString& local_name, const FlyString& namespace_)
{
ASSERT(is_start_tag() || is_end_tag());
for (auto& attribute : m_tag.attributes) {
if (old_name == attribute.local_name_builder.string_view()) {
attribute.prefix_builder.clear();
attribute.prefix_builder.append(prefix);
attribute.local_name_builder.clear();
attribute.local_name_builder.append(local_name);
attribute.namespace_builder.clear();
attribute.namespace_builder.append(namespace_);
}
}
}
void drop_attributes()
{
ASSERT(is_start_tag() || is_end_tag());
@ -136,7 +164,9 @@ public:
private:
struct AttributeBuilder {
StringBuilder name_builder;
StringBuilder prefix_builder;
StringBuilder local_name_builder;
StringBuilder namespace_builder;
StringBuilder value_builder;
};