mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 06:58:11 +00:00
LibWeb: Make Web::Namespace::Foo strings be FlyString
This required dealing with a *lot* of fallout, but it's all basically just switching from DeprecatedFlyString to either FlyString or Optional<FlyString> in a hundred places to accommodate the change.
This commit is contained in:
parent
6b20a109c6
commit
3ff81dcb65
31 changed files with 184 additions and 185 deletions
|
@ -43,7 +43,7 @@ JS::ThrowCompletionOr<JS::NonnullGCPtr<JS::Object>> AudioConstructor::construct(
|
||||||
auto& document = window.associated_document();
|
auto& document = window.associated_document();
|
||||||
|
|
||||||
// 2. Let audio be the result of creating an element given document, audio, and the HTML namespace.
|
// 2. Let audio be the result of creating an element given document, audio, and the HTML namespace.
|
||||||
auto audio = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() { return DOM::create_element(document, HTML::TagNames::audio, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))); }));
|
auto audio = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() { return DOM::create_element(document, HTML::TagNames::audio, Namespace::HTML); }));
|
||||||
|
|
||||||
// 3. Set an attribute value for audio using "preload" and "auto".
|
// 3. Set an attribute value for audio using "preload" and "auto".
|
||||||
MUST(audio->set_attribute(HTML::AttributeNames::preload, "auto"_string));
|
MUST(audio->set_attribute(HTML::AttributeNames::preload, "auto"_string));
|
||||||
|
|
|
@ -43,7 +43,7 @@ JS::ThrowCompletionOr<JS::NonnullGCPtr<JS::Object>> ImageConstructor::construct(
|
||||||
auto& document = window.associated_document();
|
auto& document = window.associated_document();
|
||||||
|
|
||||||
// 2. Let img be the result of creating an element given document, img, and the HTML namespace.
|
// 2. Let img be the result of creating an element given document, img, and the HTML namespace.
|
||||||
auto image_element = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() { return DOM::create_element(document, HTML::TagNames::img, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))); }));
|
auto image_element = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() { return DOM::create_element(document, HTML::TagNames::img, Namespace::HTML); }));
|
||||||
|
|
||||||
// 3. If width is given, then set an attribute value for img using "width" and width.
|
// 3. If width is given, then set an attribute value for img using "width" and width.
|
||||||
if (vm.argument_count() > 0) {
|
if (vm.argument_count() > 0) {
|
||||||
|
|
|
@ -47,7 +47,7 @@ JS::ThrowCompletionOr<JS::NonnullGCPtr<JS::Object>> OptionConstructor::construct
|
||||||
auto& document = window.associated_document();
|
auto& document = window.associated_document();
|
||||||
|
|
||||||
// 2. Let option be the result of creating an element given document, option, and the HTML namespace.
|
// 2. Let option be the result of creating an element given document, option, and the HTML namespace.
|
||||||
auto element = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() { return DOM::create_element(document, HTML::TagNames::option, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))); }));
|
auto element = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() { return DOM::create_element(document, HTML::TagNames::option, Namespace::HTML); }));
|
||||||
JS::NonnullGCPtr<HTML::HTMLOptionElement> option_element = verify_cast<HTML::HTMLOptionElement>(*element);
|
JS::NonnullGCPtr<HTML::HTMLOptionElement> option_element = verify_cast<HTML::HTMLOptionElement>(*element);
|
||||||
|
|
||||||
// 3. If text is not the empty string, then append to option a new Text node whose data is text.
|
// 3. If text is not the empty string, then append to option a new Text node whose data is text.
|
||||||
|
|
|
@ -280,7 +280,7 @@ StyleComputer::RuleCache const& StyleComputer::rule_cache_for_cascade_origin(Cas
|
||||||
{
|
{
|
||||||
// FIXME: Filter out non-default namespace using prefixes
|
// FIXME: Filter out non-default namespace using prefixes
|
||||||
auto namespace_uri = rule.sheet->default_namespace();
|
auto namespace_uri = rule.sheet->default_namespace();
|
||||||
if (namespace_uri.has_value() && namespace_uri.value() != element.namespace_()) {
|
if (namespace_uri.has_value() && namespace_uri.value() != element.namespace_uri()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -2023,7 +2023,7 @@ void StyleComputer::transform_box_type_if_needed(StyleProperties& style, DOM::El
|
||||||
// https://w3c.github.io/mathml-core/#new-display-math-value
|
// https://w3c.github.io/mathml-core/#new-display-math-value
|
||||||
// For elements that are not MathML elements, if the specified value of display is inline math or block math
|
// For elements that are not MathML elements, if the specified value of display is inline math or block math
|
||||||
// then the computed value is block flow and inline flow respectively.
|
// then the computed value is block flow and inline flow respectively.
|
||||||
if (element.namespace_() != Namespace::MathML)
|
if (element.namespace_uri() != Namespace::MathML)
|
||||||
new_display = CSS::Display { display.outside(), CSS::DisplayInside::Flow };
|
new_display = CSS::Display { display.outside(), CSS::DisplayInside::Flow };
|
||||||
// For the mtable element the computed value is block table and inline table respectively.
|
// For the mtable element the computed value is block table and inline table respectively.
|
||||||
else if (element.tag_name().equals_ignoring_ascii_case("mtable"sv))
|
else if (element.tag_name().equals_ignoring_ascii_case("mtable"sv))
|
||||||
|
|
|
@ -70,12 +70,15 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Document>> DOMImplementation::create_docume
|
||||||
xml_document->set_origin(document().origin());
|
xml_document->set_origin(document().origin());
|
||||||
|
|
||||||
// 7. document’s content type is determined by namespace:
|
// 7. document’s content type is determined by namespace:
|
||||||
auto deprecated_namespace = namespace_.has_value() ? namespace_->to_deprecated_string() : DeprecatedString::empty();
|
// FIXME: This conversion is ugly
|
||||||
|
Optional<FlyString> namespace_to_use;
|
||||||
|
if (namespace_.has_value())
|
||||||
|
namespace_to_use = namespace_.value();
|
||||||
|
|
||||||
if (deprecated_namespace == Namespace::HTML) {
|
if (namespace_to_use == Namespace::HTML) {
|
||||||
// -> HTML namespace
|
// -> HTML namespace
|
||||||
xml_document->set_content_type("application/xhtml+xml"_string);
|
xml_document->set_content_type("application/xhtml+xml"_string);
|
||||||
} else if (deprecated_namespace == Namespace::SVG) {
|
} else if (namespace_to_use == Namespace::SVG) {
|
||||||
// -> SVG namespace
|
// -> SVG namespace
|
||||||
xml_document->set_content_type("image/svg+xml"_string);
|
xml_document->set_content_type("image/svg+xml"_string);
|
||||||
} else {
|
} else {
|
||||||
|
@ -104,17 +107,17 @@ JS::NonnullGCPtr<Document> DOMImplementation::create_html_document(Optional<Stri
|
||||||
MUST(html_document->append_child(*doctype));
|
MUST(html_document->append_child(*doctype));
|
||||||
|
|
||||||
// 4. Append the result of creating an element given doc, html, and the HTML namespace, to doc.
|
// 4. Append the result of creating an element given doc, html, and the HTML namespace, to doc.
|
||||||
auto html_element = create_element(html_document, HTML::TagNames::html, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto html_element = create_element(html_document, HTML::TagNames::html, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_document->append_child(html_element));
|
MUST(html_document->append_child(html_element));
|
||||||
|
|
||||||
// 5. Append the result of creating an element given doc, head, and the HTML namespace, to the html element created earlier.
|
// 5. Append the result of creating an element given doc, head, and the HTML namespace, to the html element created earlier.
|
||||||
auto head_element = create_element(html_document, HTML::TagNames::head, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto head_element = create_element(html_document, HTML::TagNames::head, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(head_element));
|
MUST(html_element->append_child(head_element));
|
||||||
|
|
||||||
// 6. If title is given:
|
// 6. If title is given:
|
||||||
if (title.has_value()) {
|
if (title.has_value()) {
|
||||||
// 1. Append the result of creating an element given doc, title, and the HTML namespace, to the head element created earlier.
|
// 1. Append the result of creating an element given doc, title, and the HTML namespace, to the head element created earlier.
|
||||||
auto title_element = create_element(html_document, HTML::TagNames::title, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto title_element = create_element(html_document, HTML::TagNames::title, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(head_element->append_child(title_element));
|
MUST(head_element->append_child(title_element));
|
||||||
|
|
||||||
// 2. Append a new Text node, with its data set to title (which could be the empty string) and its node document set to doc, to the title element created earlier.
|
// 2. Append a new Text node, with its data set to title (which could be the empty string) and its node document set to doc, to the title element created earlier.
|
||||||
|
@ -123,7 +126,7 @@ JS::NonnullGCPtr<Document> DOMImplementation::create_html_document(Optional<Stri
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7. Append the result of creating an element given doc, body, and the HTML namespace, to the html element created earlier.
|
// 7. Append the result of creating an element given doc, body, and the HTML namespace, to the html element created earlier.
|
||||||
auto body_element = create_element(html_document, HTML::TagNames::body, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto body_element = create_element(html_document, HTML::TagNames::body, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(body_element));
|
MUST(html_element->append_child(body_element));
|
||||||
|
|
||||||
// 8. doc’s origin is this’s associated document’s origin.
|
// 8. doc’s origin is this’s associated document’s origin.
|
||||||
|
|
|
@ -741,7 +741,7 @@ WebIDL::ExceptionOr<void> Document::set_title(String const& title)
|
||||||
else {
|
else {
|
||||||
// 1. Let element be the result of creating an element given the document element's node document, title,
|
// 1. Let element be the result of creating an element given the document element's node document, title,
|
||||||
// and the SVG namespace.
|
// and the SVG namespace.
|
||||||
element = TRY(DOM::create_element(*this, HTML::TagNames::title, MUST(FlyString::from_deprecated_fly_string(Namespace::SVG))));
|
element = TRY(DOM::create_element(*this, HTML::TagNames::title, Namespace::SVG));
|
||||||
|
|
||||||
// 2. Insert element as the first child of the document element.
|
// 2. Insert element as the first child of the document element.
|
||||||
document_element->insert_before(*element, nullptr);
|
document_element->insert_before(*element, nullptr);
|
||||||
|
@ -752,7 +752,7 @@ WebIDL::ExceptionOr<void> Document::set_title(String const& title)
|
||||||
}
|
}
|
||||||
|
|
||||||
// -> If the document element is in the HTML namespace
|
// -> If the document element is in the HTML namespace
|
||||||
else if (document_element && document_element->namespace_() == Namespace::HTML) {
|
else if (document_element && document_element->namespace_uri() == Namespace::HTML) {
|
||||||
auto title_element = this->title_element();
|
auto title_element = this->title_element();
|
||||||
auto* head_element = this->head();
|
auto* head_element = this->head();
|
||||||
|
|
||||||
|
@ -770,7 +770,7 @@ WebIDL::ExceptionOr<void> Document::set_title(String const& title)
|
||||||
else {
|
else {
|
||||||
// 1. Let element be the result of creating an element given the document element's node document, title,
|
// 1. Let element be the result of creating an element given the document element's node document, title,
|
||||||
// and the HTML namespace.
|
// and the HTML namespace.
|
||||||
element = TRY(DOM::create_element(*this, HTML::TagNames::title, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
element = TRY(DOM::create_element(*this, HTML::TagNames::title, Namespace::HTML));
|
||||||
|
|
||||||
// 2. Append element to the head element.
|
// 2. Append element to the head element.
|
||||||
TRY(head_element->append_child(*element));
|
TRY(head_element->append_child(*element));
|
||||||
|
@ -1358,7 +1358,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Element>> Document::create_element(String c
|
||||||
// 5. Let namespace be the HTML namespace, if this is an HTML document or this’s content type is "application/xhtml+xml"; otherwise null.
|
// 5. Let namespace be the HTML namespace, if this is an HTML document or this’s content type is "application/xhtml+xml"; otherwise null.
|
||||||
Optional<FlyString> namespace_;
|
Optional<FlyString> namespace_;
|
||||||
if (document_type() == Type::HTML || content_type() == "application/xhtml+xml"sv)
|
if (document_type() == Type::HTML || content_type() == "application/xhtml+xml"sv)
|
||||||
namespace_ = MUST(FlyString::from_deprecated_fly_string(Namespace::HTML));
|
namespace_ = Namespace::HTML;
|
||||||
|
|
||||||
// 6. Return the result of creating an element given this, localName, namespace, null, is, and with the synchronous custom elements flag set.
|
// 6. Return the result of creating an element given this, localName, namespace, null, is, and with the synchronous custom elements flag set.
|
||||||
return TRY(DOM::create_element(*this, MUST(FlyString::from_deprecated_fly_string(local_name)), move(namespace_), {}, move(is_value), true));
|
return TRY(DOM::create_element(*this, MUST(FlyString::from_deprecated_fly_string(local_name)), move(namespace_), {}, move(is_value), true));
|
||||||
|
@ -1369,12 +1369,12 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Element>> Document::create_element(String c
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<Element>> Document::create_element_ns(Optional<String> const& namespace_, String const& qualified_name, Variant<String, ElementCreationOptions> const& options)
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<Element>> Document::create_element_ns(Optional<String> const& namespace_, String const& qualified_name, Variant<String, ElementCreationOptions> const& options)
|
||||||
{
|
{
|
||||||
// FIXME: This conversion is ugly
|
// FIXME: This conversion is ugly
|
||||||
StringView namespace_view;
|
Optional<FlyString> namespace_to_use;
|
||||||
if (namespace_.has_value())
|
if (namespace_.has_value())
|
||||||
namespace_view = namespace_->bytes_as_string_view();
|
namespace_to_use = namespace_.value();
|
||||||
|
|
||||||
// 1. Let namespace, prefix, and localName be the result of passing namespace and qualifiedName to validate and extract.
|
// 1. Let namespace, prefix, and localName be the result of passing namespace and qualifiedName to validate and extract.
|
||||||
auto extracted_qualified_name = TRY(validate_and_extract(realm(), namespace_view, qualified_name.to_deprecated_string()));
|
auto extracted_qualified_name = TRY(validate_and_extract(realm(), namespace_to_use, qualified_name.to_deprecated_string()));
|
||||||
|
|
||||||
// 2. Let is be null.
|
// 2. Let is be null.
|
||||||
Optional<String> is_value;
|
Optional<String> is_value;
|
||||||
|
@ -2435,7 +2435,7 @@ void Document::set_window(HTML::Window& window)
|
||||||
JS::GCPtr<HTML::CustomElementDefinition> Document::lookup_custom_element_definition(Optional<FlyString> const& namespace_, FlyString const& local_name, Optional<String> const& is) const
|
JS::GCPtr<HTML::CustomElementDefinition> Document::lookup_custom_element_definition(Optional<FlyString> const& namespace_, FlyString const& local_name, Optional<String> const& is) const
|
||||||
{
|
{
|
||||||
// 1. If namespace is not the HTML namespace, return null.
|
// 1. If namespace is not the HTML namespace, return null.
|
||||||
if (namespace_ != MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)))
|
if (namespace_ != Namespace::HTML)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// 2. If document's browsing context is null, return null.
|
// 2. If document's browsing context is null, return null.
|
||||||
|
@ -3005,12 +3005,12 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Attr>> Document::create_attribute(String co
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<Attr>> Document::create_attribute_ns(Optional<String> const& namespace_, String const& qualified_name)
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<Attr>> Document::create_attribute_ns(Optional<String> const& namespace_, String const& qualified_name)
|
||||||
{
|
{
|
||||||
// FIXME: This conversion is ugly
|
// FIXME: This conversion is ugly
|
||||||
StringView namespace_view;
|
Optional<FlyString> namespace_to_use;
|
||||||
if (namespace_.has_value())
|
if (namespace_.has_value())
|
||||||
namespace_view = namespace_->bytes_as_string_view();
|
namespace_to_use = namespace_.value();
|
||||||
|
|
||||||
// 1. Let namespace, prefix, and localName be the result of passing namespace and qualifiedName to validate and extract.
|
// 1. Let namespace, prefix, and localName be the result of passing namespace and qualifiedName to validate and extract.
|
||||||
auto extracted_qualified_name = TRY(validate_and_extract(realm(), namespace_view, qualified_name.to_deprecated_string()));
|
auto extracted_qualified_name = TRY(validate_and_extract(realm(), namespace_to_use, qualified_name.to_deprecated_string()));
|
||||||
|
|
||||||
// 2. Return a new attribute whose namespace is namespace, namespace prefix is prefix, local name is localName, and node document is this.
|
// 2. Return a new attribute whose namespace is namespace, namespace prefix is prefix, local name is localName, and node document is this.
|
||||||
|
|
||||||
|
|
|
@ -79,21 +79,21 @@ static bool build_markdown_document(DOM::Document& document, ByteBuffer const& d
|
||||||
|
|
||||||
static bool build_text_document(DOM::Document& document, ByteBuffer const& data)
|
static bool build_text_document(DOM::Document& document, ByteBuffer const& data)
|
||||||
{
|
{
|
||||||
auto html_element = DOM::create_element(document, HTML::TagNames::html, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto html_element = DOM::create_element(document, HTML::TagNames::html, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(document.append_child(html_element));
|
MUST(document.append_child(html_element));
|
||||||
|
|
||||||
auto head_element = DOM::create_element(document, HTML::TagNames::head, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto head_element = DOM::create_element(document, HTML::TagNames::head, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(head_element));
|
MUST(html_element->append_child(head_element));
|
||||||
auto title_element = DOM::create_element(document, HTML::TagNames::title, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto title_element = DOM::create_element(document, HTML::TagNames::title, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(head_element->append_child(title_element));
|
MUST(head_element->append_child(title_element));
|
||||||
|
|
||||||
auto title_text = document.create_text_node(MUST(String::from_deprecated_string(document.url().basename())));
|
auto title_text = document.create_text_node(MUST(String::from_deprecated_string(document.url().basename())));
|
||||||
MUST(title_element->append_child(title_text));
|
MUST(title_element->append_child(title_text));
|
||||||
|
|
||||||
auto body_element = DOM::create_element(document, HTML::TagNames::body, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto body_element = DOM::create_element(document, HTML::TagNames::body, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(body_element));
|
MUST(html_element->append_child(body_element));
|
||||||
|
|
||||||
auto pre_element = DOM::create_element(document, HTML::TagNames::pre, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto pre_element = DOM::create_element(document, HTML::TagNames::pre, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(body_element->append_child(pre_element));
|
MUST(body_element->append_child(pre_element));
|
||||||
|
|
||||||
MUST(pre_element->append_child(document.create_text_node(String::from_utf8(StringView { data }).release_value_but_fixme_should_propagate_errors())));
|
MUST(pre_element->append_child(document.create_text_node(String::from_utf8(StringView { data }).release_value_but_fixme_should_propagate_errors())));
|
||||||
|
@ -110,22 +110,22 @@ static bool build_image_document(DOM::Document& document, ByteBuffer const& data
|
||||||
if (!bitmap)
|
if (!bitmap)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto html_element = DOM::create_element(document, HTML::TagNames::html, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto html_element = DOM::create_element(document, HTML::TagNames::html, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(document.append_child(html_element));
|
MUST(document.append_child(html_element));
|
||||||
|
|
||||||
auto head_element = DOM::create_element(document, HTML::TagNames::head, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto head_element = DOM::create_element(document, HTML::TagNames::head, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(head_element));
|
MUST(html_element->append_child(head_element));
|
||||||
auto title_element = DOM::create_element(document, HTML::TagNames::title, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto title_element = DOM::create_element(document, HTML::TagNames::title, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(head_element->append_child(title_element));
|
MUST(head_element->append_child(title_element));
|
||||||
|
|
||||||
auto basename = LexicalPath::basename(document.url().serialize_path());
|
auto basename = LexicalPath::basename(document.url().serialize_path());
|
||||||
auto title_text = document.heap().allocate<DOM::Text>(document.realm(), document, MUST(String::formatted("{} [{}x{}]", basename, bitmap->width(), bitmap->height())));
|
auto title_text = document.heap().allocate<DOM::Text>(document.realm(), document, MUST(String::formatted("{} [{}x{}]", basename, bitmap->width(), bitmap->height())));
|
||||||
MUST(title_element->append_child(*title_text));
|
MUST(title_element->append_child(*title_text));
|
||||||
|
|
||||||
auto body_element = DOM::create_element(document, HTML::TagNames::body, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto body_element = DOM::create_element(document, HTML::TagNames::body, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(body_element));
|
MUST(html_element->append_child(body_element));
|
||||||
|
|
||||||
auto image_element = DOM::create_element(document, HTML::TagNames::img, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto image_element = DOM::create_element(document, HTML::TagNames::img, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(image_element->set_attribute(HTML::AttributeNames::src, MUST(document.url().to_string())));
|
MUST(image_element->set_attribute(HTML::AttributeNames::src, MUST(document.url().to_string())));
|
||||||
MUST(body_element->append_child(image_element));
|
MUST(body_element->append_child(image_element));
|
||||||
|
|
||||||
|
@ -160,16 +160,16 @@ bool build_xml_document(DOM::Document& document, ByteBuffer const& data)
|
||||||
|
|
||||||
static bool build_video_document(DOM::Document& document)
|
static bool build_video_document(DOM::Document& document)
|
||||||
{
|
{
|
||||||
auto html_element = DOM::create_element(document, HTML::TagNames::html, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto html_element = DOM::create_element(document, HTML::TagNames::html, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(document.append_child(html_element));
|
MUST(document.append_child(html_element));
|
||||||
|
|
||||||
auto head_element = DOM::create_element(document, HTML::TagNames::head, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto head_element = DOM::create_element(document, HTML::TagNames::head, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(head_element));
|
MUST(html_element->append_child(head_element));
|
||||||
|
|
||||||
auto body_element = DOM::create_element(document, HTML::TagNames::body, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto body_element = DOM::create_element(document, HTML::TagNames::body, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(body_element));
|
MUST(html_element->append_child(body_element));
|
||||||
|
|
||||||
auto video_element = DOM::create_element(document, HTML::TagNames::video, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto video_element = DOM::create_element(document, HTML::TagNames::video, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(video_element->set_attribute(HTML::AttributeNames::src, MUST(document.url().to_string())));
|
MUST(video_element->set_attribute(HTML::AttributeNames::src, MUST(document.url().to_string())));
|
||||||
MUST(video_element->set_attribute(HTML::AttributeNames::autoplay, String {}));
|
MUST(video_element->set_attribute(HTML::AttributeNames::autoplay, String {}));
|
||||||
MUST(video_element->set_attribute(HTML::AttributeNames::controls, String {}));
|
MUST(video_element->set_attribute(HTML::AttributeNames::controls, String {}));
|
||||||
|
@ -180,16 +180,16 @@ static bool build_video_document(DOM::Document& document)
|
||||||
|
|
||||||
static bool build_audio_document(DOM::Document& document)
|
static bool build_audio_document(DOM::Document& document)
|
||||||
{
|
{
|
||||||
auto html_element = DOM::create_element(document, HTML::TagNames::html, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto html_element = DOM::create_element(document, HTML::TagNames::html, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(document.append_child(html_element));
|
MUST(document.append_child(html_element));
|
||||||
|
|
||||||
auto head_element = DOM::create_element(document, HTML::TagNames::head, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto head_element = DOM::create_element(document, HTML::TagNames::head, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(head_element));
|
MUST(html_element->append_child(head_element));
|
||||||
|
|
||||||
auto body_element = DOM::create_element(document, HTML::TagNames::body, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto body_element = DOM::create_element(document, HTML::TagNames::body, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(html_element->append_child(body_element));
|
MUST(html_element->append_child(body_element));
|
||||||
|
|
||||||
auto video_element = DOM::create_element(document, HTML::TagNames::audio, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto video_element = DOM::create_element(document, HTML::TagNames::audio, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(video_element->set_attribute(HTML::AttributeNames::src, MUST(document.url().to_string())));
|
MUST(video_element->set_attribute(HTML::AttributeNames::src, MUST(document.url().to_string())));
|
||||||
MUST(video_element->set_attribute(HTML::AttributeNames::autoplay, String {}));
|
MUST(video_element->set_attribute(HTML::AttributeNames::autoplay, String {}));
|
||||||
MUST(video_element->set_attribute(HTML::AttributeNames::controls, String {}));
|
MUST(video_element->set_attribute(HTML::AttributeNames::controls, String {}));
|
||||||
|
|
|
@ -185,7 +185,7 @@ WebIDL::ExceptionOr<void> Element::set_attribute(DeprecatedFlyString const& name
|
||||||
|
|
||||||
// 2. If this is in the HTML namespace and its node document is an HTML document, then set qualifiedName to qualifiedName in ASCII lowercase.
|
// 2. If this is in the HTML namespace and its node document is an HTML document, then set qualifiedName to qualifiedName in ASCII lowercase.
|
||||||
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
||||||
bool insert_as_lowercase = namespace_() == Namespace::HTML;
|
bool insert_as_lowercase = namespace_uri() == Namespace::HTML;
|
||||||
|
|
||||||
// 3. Let attribute be the first attribute in this’s attribute list whose qualified name is qualifiedName, and null otherwise.
|
// 3. Let attribute be the first attribute in this’s attribute list whose qualified name is qualifiedName, and null otherwise.
|
||||||
auto* attribute = m_attributes->get_attribute(name);
|
auto* attribute = m_attributes->get_attribute(name);
|
||||||
|
@ -211,10 +211,10 @@ WebIDL::ExceptionOr<void> Element::set_attribute(DeprecatedFlyString const& name
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#validate-and-extract
|
// https://dom.spec.whatwg.org/#validate-and-extract
|
||||||
WebIDL::ExceptionOr<QualifiedName> validate_and_extract(JS::Realm& realm, DeprecatedFlyString namespace_, DeprecatedFlyString qualified_name)
|
WebIDL::ExceptionOr<QualifiedName> validate_and_extract(JS::Realm& realm, Optional<FlyString> namespace_, DeprecatedFlyString qualified_name)
|
||||||
{
|
{
|
||||||
// 1. If namespace is the empty string, then set it to null.
|
// 1. If namespace is the empty string, then set it to null.
|
||||||
if (namespace_.is_empty())
|
if (namespace_.has_value() && namespace_.value().is_empty())
|
||||||
namespace_ = {};
|
namespace_ = {};
|
||||||
|
|
||||||
// 2. Validate qualifiedName.
|
// 2. Validate qualifiedName.
|
||||||
|
@ -234,7 +234,7 @@ WebIDL::ExceptionOr<QualifiedName> validate_and_extract(JS::Realm& realm, Deprec
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. If prefix is non-null and namespace is null, then throw a "NamespaceError" DOMException.
|
// 6. If prefix is non-null and namespace is null, then throw a "NamespaceError" DOMException.
|
||||||
if (prefix.has_value() && namespace_.is_null())
|
if (prefix.has_value() && !namespace_.has_value())
|
||||||
return WebIDL::NamespaceError::create(realm, "Prefix is non-null and namespace is null."_fly_string);
|
return WebIDL::NamespaceError::create(realm, "Prefix is non-null and namespace is null."_fly_string);
|
||||||
|
|
||||||
// 7. If prefix is "xml" and namespace is not the XML namespace, then throw a "NamespaceError" DOMException.
|
// 7. If prefix is "xml" and namespace is not the XML namespace, then throw a "NamespaceError" DOMException.
|
||||||
|
@ -256,12 +256,13 @@ WebIDL::ExceptionOr<QualifiedName> validate_and_extract(JS::Realm& realm, Deprec
|
||||||
// https://dom.spec.whatwg.org/#dom-element-setattributens
|
// https://dom.spec.whatwg.org/#dom-element-setattributens
|
||||||
WebIDL::ExceptionOr<void> Element::set_attribute_ns(Optional<String> const& namespace_, FlyString const& qualified_name, FlyString const& value)
|
WebIDL::ExceptionOr<void> Element::set_attribute_ns(Optional<String> const& namespace_, FlyString const& qualified_name, FlyString const& value)
|
||||||
{
|
{
|
||||||
DeprecatedFlyString deprecated_namespace;
|
// FIXME: This conversion is ugly
|
||||||
|
Optional<FlyString> namespace_to_use;
|
||||||
if (namespace_.has_value())
|
if (namespace_.has_value())
|
||||||
deprecated_namespace = namespace_->to_deprecated_string();
|
namespace_to_use = namespace_.value();
|
||||||
|
|
||||||
// 1. Let namespace, prefix, and localName be the result of passing namespace and qualifiedName to validate and extract.
|
// 1. Let namespace, prefix, and localName be the result of passing namespace and qualifiedName to validate and extract.
|
||||||
auto extracted_qualified_name = TRY(validate_and_extract(realm(), deprecated_namespace, qualified_name.to_deprecated_fly_string()));
|
auto extracted_qualified_name = TRY(validate_and_extract(realm(), namespace_to_use, qualified_name.to_deprecated_fly_string()));
|
||||||
|
|
||||||
// 2. Set an attribute value for this using localName, value, and also prefix and namespace.
|
// 2. Set an attribute value for this using localName, value, and also prefix and namespace.
|
||||||
set_attribute_value(extracted_qualified_name.local_name(), value.to_deprecated_fly_string(), extracted_qualified_name.prefix(), extracted_qualified_name.deprecated_namespace_());
|
set_attribute_value(extracted_qualified_name.local_name(), value.to_deprecated_fly_string(), extracted_qualified_name.prefix(), extracted_qualified_name.deprecated_namespace_());
|
||||||
|
@ -343,7 +344,7 @@ WebIDL::ExceptionOr<bool> Element::toggle_attribute(FlyString const& name, Optio
|
||||||
|
|
||||||
// 2. If this is in the HTML namespace and its node document is an HTML document, then set qualifiedName to qualifiedName in ASCII lowercase.
|
// 2. If this is in the HTML namespace and its node document is an HTML document, then set qualifiedName to qualifiedName in ASCII lowercase.
|
||||||
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
||||||
bool insert_as_lowercase = namespace_() == Namespace::HTML;
|
bool insert_as_lowercase = namespace_uri() == Namespace::HTML;
|
||||||
|
|
||||||
// 3. Let attribute be the first attribute in this’s attribute list whose qualified name is qualifiedName, and null otherwise.
|
// 3. Let attribute be the first attribute in this’s attribute list whose qualified name is qualifiedName, and null otherwise.
|
||||||
auto* attribute = m_attributes->get_attribute(name);
|
auto* attribute = m_attributes->get_attribute(name);
|
||||||
|
@ -632,7 +633,7 @@ DOMTokenList* Element::class_list()
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<ShadowRoot>> Element::attach_shadow(ShadowRootInit init)
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<ShadowRoot>> Element::attach_shadow(ShadowRootInit init)
|
||||||
{
|
{
|
||||||
// 1. If this’s namespace is not the HTML namespace, then throw a "NotSupportedError" DOMException.
|
// 1. If this’s namespace is not the HTML namespace, then throw a "NotSupportedError" DOMException.
|
||||||
if (namespace_() != Namespace::HTML)
|
if (namespace_uri() != Namespace::HTML)
|
||||||
return WebIDL::NotSupportedError::create(realm(), "Element's namespace is not the HTML namespace"_fly_string);
|
return WebIDL::NotSupportedError::create(realm(), "Element's namespace is not the HTML namespace"_fly_string);
|
||||||
|
|
||||||
// 2. If this’s local name is not one of the following:
|
// 2. If this’s local name is not one of the following:
|
||||||
|
@ -823,7 +824,7 @@ CSS::CSSStyleDeclaration* Element::style_for_bindings()
|
||||||
void Element::make_html_uppercased_qualified_name()
|
void Element::make_html_uppercased_qualified_name()
|
||||||
{
|
{
|
||||||
// This is allowed by the spec: "User agents could optimize qualified name and HTML-uppercased qualified name by storing them in internal slots."
|
// This is allowed by the spec: "User agents could optimize qualified name and HTML-uppercased qualified name by storing them in internal slots."
|
||||||
if (namespace_() == Namespace::HTML && document().document_type() == Document::Type::HTML)
|
if (namespace_uri() == Namespace::HTML && document().document_type() == Document::Type::HTML)
|
||||||
m_html_uppercased_qualified_name = MUST(Infra::to_ascii_uppercase(qualified_name()));
|
m_html_uppercased_qualified_name = MUST(Infra::to_ascii_uppercase(qualified_name()));
|
||||||
else
|
else
|
||||||
m_html_uppercased_qualified_name = qualified_name();
|
m_html_uppercased_qualified_name = qualified_name();
|
||||||
|
@ -1413,7 +1414,7 @@ WebIDL::ExceptionOr<void> Element::insert_adjacent_html(String const& position,
|
||||||
if (!is<Element>(*context)
|
if (!is<Element>(*context)
|
||||||
|| (context->document().document_type() == Document::Type::HTML
|
|| (context->document().document_type() == Document::Type::HTML
|
||||||
&& static_cast<Element const&>(*context).local_name() == "html"sv
|
&& static_cast<Element const&>(*context).local_name() == "html"sv
|
||||||
&& static_cast<Element const&>(*context).namespace_() == Namespace::HTML)) {
|
&& static_cast<Element const&>(*context).namespace_uri() == Namespace::HTML)) {
|
||||||
// FIXME: let context be a new Element with
|
// FIXME: let context be a new Element with
|
||||||
// - body as its local name,
|
// - body as its local name,
|
||||||
// - The HTML namespace as its namespace, and
|
// - The HTML namespace as its namespace, and
|
||||||
|
|
|
@ -441,6 +441,6 @@ private:
|
||||||
template<>
|
template<>
|
||||||
inline bool Node::fast_is<Element>() const { return is_element(); }
|
inline bool Node::fast_is<Element>() const { return is_element(); }
|
||||||
|
|
||||||
WebIDL::ExceptionOr<QualifiedName> validate_and_extract(JS::Realm&, DeprecatedFlyString namespace_, DeprecatedFlyString qualified_name);
|
WebIDL::ExceptionOr<QualifiedName> validate_and_extract(JS::Realm&, Optional<FlyString> namespace_, DeprecatedFlyString qualified_name);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -624,7 +624,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Element>> create_element(Document& document
|
||||||
|
|
||||||
auto qualified_name = QualifiedName { local_name, prefix, namespace_ };
|
auto qualified_name = QualifiedName { local_name, prefix, namespace_ };
|
||||||
|
|
||||||
if (namespace_ == MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))) {
|
if (namespace_ == Namespace::HTML) {
|
||||||
auto element = create_html_element(realm, document, move(qualified_name));
|
auto element = create_html_element(realm, document, move(qualified_name));
|
||||||
element->set_is_value(move(is_value));
|
element->set_is_value(move(is_value));
|
||||||
element->set_custom_element_state(CustomElementState::Uncustomized);
|
element->set_custom_element_state(CustomElementState::Uncustomized);
|
||||||
|
@ -637,7 +637,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Element>> create_element(Document& document
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (namespace_ == MUST(FlyString::from_deprecated_fly_string(Namespace::SVG))) {
|
if (namespace_ == Namespace::SVG) {
|
||||||
auto element = create_svg_element(realm, document, qualified_name);
|
auto element = create_svg_element(realm, document, qualified_name);
|
||||||
if (element) {
|
if (element) {
|
||||||
element->set_is_value(move(is_value));
|
element->set_is_value(move(is_value));
|
||||||
|
@ -646,7 +646,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Element>> create_element(Document& document
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (namespace_ == MUST(FlyString::from_deprecated_fly_string(Namespace::MathML))) {
|
if (namespace_ == Namespace::MathML) {
|
||||||
auto element = create_mathml_element(realm, document, qualified_name);
|
auto element = create_mathml_element(realm, document, qualified_name);
|
||||||
if (element) {
|
if (element) {
|
||||||
element->set_is_value(move(is_value));
|
element->set_is_value(move(is_value));
|
||||||
|
|
|
@ -90,7 +90,7 @@ Element* HTMLCollection::named_item(FlyString const& name_) const
|
||||||
if (auto it = elements.find_if([&](auto& entry) { return entry->deprecated_attribute(HTML::AttributeNames::id) == name; }); it != elements.end())
|
if (auto it = elements.find_if([&](auto& entry) { return entry->deprecated_attribute(HTML::AttributeNames::id) == name; }); it != elements.end())
|
||||||
return *it;
|
return *it;
|
||||||
// - it is in the HTML namespace and has a name attribute whose value is key;
|
// - it is in the HTML namespace and has a name attribute whose value is key;
|
||||||
if (auto it = elements.find_if([&](auto& entry) { return entry->namespace_() == Namespace::HTML && entry->name() == name; }); it != elements.end())
|
if (auto it = elements.find_if([&](auto& entry) { return entry->namespace_uri() == Namespace::HTML && entry->name() == name; }); it != elements.end())
|
||||||
return *it;
|
return *it;
|
||||||
// or null if there is no such element.
|
// or null if there is no such element.
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -115,7 +115,7 @@ Vector<DeprecatedString> HTMLCollection::supported_property_names() const
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. If element is in the HTML namespace and has a name attribute whose value is neither the empty string nor is in result, append element’s name attribute value to result.
|
// 2. If element is in the HTML namespace and has a name attribute whose value is neither the empty string nor is in result, append element’s name attribute value to result.
|
||||||
if (element->namespace_() == Namespace::HTML && element->has_attribute(HTML::AttributeNames::name)) {
|
if (element->namespace_uri() == Namespace::HTML && element->has_attribute(HTML::AttributeNames::name)) {
|
||||||
auto name = element->deprecated_attribute(HTML::AttributeNames::name);
|
auto name = element->deprecated_attribute(HTML::AttributeNames::name);
|
||||||
|
|
||||||
if (!name.is_empty() && !result.contains_slow(name))
|
if (!name.is_empty() && !result.contains_slow(name))
|
||||||
|
|
|
@ -60,7 +60,7 @@ Vector<DeprecatedString> NamedNodeMap::supported_property_names() const
|
||||||
|
|
||||||
// 2. If this NamedNodeMap object’s element is in the HTML namespace and its node document is an HTML document, then for each name in names:
|
// 2. If this NamedNodeMap object’s element is in the HTML namespace and its node document is an HTML document, then for each name in names:
|
||||||
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
||||||
if (associated_element().namespace_() == Namespace::HTML) {
|
if (associated_element().namespace_uri() == Namespace::HTML) {
|
||||||
// 1. Let lowercaseName be name, in ASCII lowercase.
|
// 1. Let lowercaseName be name, in ASCII lowercase.
|
||||||
// 2. If lowercaseName is not equal to name, remove name from names.
|
// 2. If lowercaseName is not equal to name, remove name from names.
|
||||||
names.remove_all_matching([](auto const& name) { return name != name.to_lowercase(); });
|
names.remove_all_matching([](auto const& name) { return name != name.to_lowercase(); });
|
||||||
|
@ -157,7 +157,7 @@ Attr const* NamedNodeMap::get_attribute(StringView qualified_name, size_t* item_
|
||||||
|
|
||||||
// 1. If element is in the HTML namespace and its node document is an HTML document, then set qualifiedName to qualifiedName in ASCII lowercase.
|
// 1. If element is in the HTML namespace and its node document is an HTML document, then set qualifiedName to qualifiedName in ASCII lowercase.
|
||||||
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
// FIXME: Handle the second condition, assume it is an HTML document for now.
|
||||||
bool compare_as_lowercase = associated_element().namespace_() == Namespace::HTML;
|
bool compare_as_lowercase = associated_element().namespace_uri() == Namespace::HTML;
|
||||||
|
|
||||||
// 2. Return the first attribute in element’s attribute list whose qualified name is qualifiedName; otherwise null.
|
// 2. Return the first attribute in element’s attribute list whose qualified name is qualifiedName; otherwise null.
|
||||||
for (auto const& attribute : m_attributes) {
|
for (auto const& attribute : m_attributes) {
|
||||||
|
|
|
@ -149,7 +149,7 @@ JS::NonnullGCPtr<HTMLCollection> ParentNode::get_elements_by_tag_name(Deprecated
|
||||||
auto qualified_name_in_ascii_lowercase = MUST(FlyString::from_deprecated_fly_string(qualified_name.to_lowercase()));
|
auto qualified_name_in_ascii_lowercase = MUST(FlyString::from_deprecated_fly_string(qualified_name.to_lowercase()));
|
||||||
return HTMLCollection::create(*this, HTMLCollection::Scope::Descendants, [qualified_name, qualified_name_in_ascii_lowercase](Element const& element) {
|
return HTMLCollection::create(*this, HTMLCollection::Scope::Descendants, [qualified_name, qualified_name_in_ascii_lowercase](Element const& element) {
|
||||||
// - Whose namespace is the HTML namespace and whose qualified name is qualifiedName, in ASCII lowercase.
|
// - Whose namespace is the HTML namespace and whose qualified name is qualifiedName, in ASCII lowercase.
|
||||||
if (element.namespace_() == Namespace::HTML)
|
if (element.namespace_uri() == Namespace::HTML)
|
||||||
return element.qualified_name() == qualified_name_in_ascii_lowercase;
|
return element.qualified_name() == qualified_name_in_ascii_lowercase;
|
||||||
|
|
||||||
// - Whose namespace is not the HTML namespace and whose qualified name is qualifiedName.
|
// - Whose namespace is not the HTML namespace and whose qualified name is qualifiedName.
|
||||||
|
|
|
@ -1181,7 +1181,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<DocumentFragment>> Range::create_contextual
|
||||||
// - "body" as its local name,
|
// - "body" as its local name,
|
||||||
// - The HTML namespace as its namespace, and
|
// - The HTML namespace as its namespace, and
|
||||||
// - The context object's node document as its node document.
|
// - The context object's node document as its node document.
|
||||||
element = TRY(DOM::create_element(node->document(), HTML::TagNames::body, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
element = TRY(DOM::create_element(node->document(), HTML::TagNames::body, Namespace::HTML));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Let fragment node be the result of invoking the fragment parsing algorithm with fragment as markup, and element as the context element.
|
// 3. Let fragment node be the result of invoking the fragment parsing algorithm with fragment as markup, and element as the context element.
|
||||||
|
|
|
@ -49,16 +49,16 @@ WebIDL::ExceptionOr<DeprecatedString> XMLSerializer::serialize_to_string(JS::Non
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-add
|
// https://w3c.github.io/DOM-Parsing/#dfn-add
|
||||||
static void add_prefix_to_namespace_prefix_map(HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& prefix_map, DeprecatedString const& prefix, DeprecatedFlyString const& namespace_)
|
static void add_prefix_to_namespace_prefix_map(HashMap<FlyString, Vector<Optional<FlyString>>>& prefix_map, Optional<FlyString> const& prefix, Optional<FlyString> const& namespace_)
|
||||||
{
|
{
|
||||||
// 1. Let candidates list be the result of retrieving a list from map where there exists a key in map that matches the value of ns or if there is no such key, then let candidates list be null.
|
// 1. Let candidates list be the result of retrieving a list from map where there exists a key in map that matches the value of ns or if there is no such key, then let candidates list be null.
|
||||||
auto candidates_list_iterator = prefix_map.find(namespace_);
|
auto candidates_list_iterator = namespace_.has_value() ? prefix_map.find(*namespace_) : prefix_map.end();
|
||||||
|
|
||||||
// 2. If candidates list is null, then create a new list with prefix as the only item in the list, and associate that list with a new key ns in map.
|
// 2. If candidates list is null, then create a new list with prefix as the only item in the list, and associate that list with a new key ns in map.
|
||||||
if (candidates_list_iterator == prefix_map.end()) {
|
if (candidates_list_iterator == prefix_map.end()) {
|
||||||
Vector<DeprecatedString> new_list;
|
Vector<Optional<FlyString>> new_list;
|
||||||
new_list.append(prefix);
|
new_list.append(prefix);
|
||||||
prefix_map.set(namespace_, move(new_list));
|
prefix_map.set(*namespace_, move(new_list));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,11 +67,13 @@ static void add_prefix_to_namespace_prefix_map(HashMap<DeprecatedFlyString, Vect
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-retrieving-a-preferred-prefix-string
|
// https://w3c.github.io/DOM-Parsing/#dfn-retrieving-a-preferred-prefix-string
|
||||||
static Optional<DeprecatedString> retrieve_a_preferred_prefix_string(DeprecatedString const& preferred_prefix, HashMap<DeprecatedFlyString, Vector<DeprecatedString>> const& namespace_prefix_map, DeprecatedFlyString const& namespace_)
|
static Optional<FlyString> retrieve_a_preferred_prefix_string(Optional<FlyString> const& preferred_prefix, HashMap<FlyString, Vector<Optional<FlyString>>> const& namespace_prefix_map, Optional<FlyString> const& namespace_)
|
||||||
{
|
{
|
||||||
// 1. Let candidates list be the result of retrieving a list from map where there exists a key in map that matches the value of ns or if there is no such key,
|
// 1. Let candidates list be the result of retrieving a list from map where there exists a key in map that matches the value of ns or if there is no such key,
|
||||||
// then stop running these steps, and return the null value.
|
// then stop running these steps, and return the null value.
|
||||||
auto candidates_list_iterator = namespace_prefix_map.find(namespace_);
|
if (!namespace_.has_value())
|
||||||
|
return {};
|
||||||
|
auto candidates_list_iterator = namespace_prefix_map.find(*namespace_);
|
||||||
if (candidates_list_iterator == namespace_prefix_map.end())
|
if (candidates_list_iterator == namespace_prefix_map.end())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -93,10 +95,10 @@ static Optional<DeprecatedString> retrieve_a_preferred_prefix_string(DeprecatedS
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-generating-a-prefix
|
// https://w3c.github.io/DOM-Parsing/#dfn-generating-a-prefix
|
||||||
static DeprecatedString generate_a_prefix(HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, DeprecatedFlyString const& new_namespace, u64& prefix_index)
|
static FlyString generate_a_prefix(HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, Optional<FlyString> const& new_namespace, u64& prefix_index)
|
||||||
{
|
{
|
||||||
// 1. Let generated prefix be the concatenation of the string "ns" and the current numerical value of prefix index.
|
// 1. Let generated prefix be the concatenation of the string "ns" and the current numerical value of prefix index.
|
||||||
auto generated_prefix = DeprecatedString::formatted("ns{}", prefix_index);
|
auto generated_prefix = FlyString(MUST(String::formatted("ns{}", prefix_index)));
|
||||||
|
|
||||||
// 2. Let the value of prefix index be incremented by one.
|
// 2. Let the value of prefix index be incremented by one.
|
||||||
++prefix_index;
|
++prefix_index;
|
||||||
|
@ -109,11 +111,13 @@ static DeprecatedString generate_a_prefix(HashMap<DeprecatedFlyString, Vector<De
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-found
|
// https://w3c.github.io/DOM-Parsing/#dfn-found
|
||||||
static bool prefix_is_in_prefix_map(DeprecatedString const& prefix, HashMap<DeprecatedFlyString, Vector<DeprecatedString>> const& namespace_prefix_map, DeprecatedFlyString const& namespace_)
|
static bool prefix_is_in_prefix_map(FlyString const& prefix, HashMap<FlyString, Vector<Optional<FlyString>>> const& namespace_prefix_map, Optional<FlyString> const& namespace_)
|
||||||
{
|
{
|
||||||
// 1. Let candidates list be the result of retrieving a list from map where there exists a key in map that matches the value of ns
|
// 1. Let candidates list be the result of retrieving a list from map where there exists a key in map that matches the value of ns
|
||||||
// or if there is no such key, then stop running these steps, and return false.
|
// or if there is no such key, then stop running these steps, and return false.
|
||||||
auto candidates_list_iterator = namespace_prefix_map.find(namespace_);
|
if (!namespace_.has_value())
|
||||||
|
return false;
|
||||||
|
auto candidates_list_iterator = namespace_prefix_map.find(*namespace_);
|
||||||
if (candidates_list_iterator == namespace_prefix_map.end())
|
if (candidates_list_iterator == namespace_prefix_map.end())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -121,7 +125,7 @@ static bool prefix_is_in_prefix_map(DeprecatedString const& prefix, HashMap<Depr
|
||||||
return candidates_list_iterator->value.contains_slow(prefix);
|
return candidates_list_iterator->value.contains_slow(prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string_impl(JS::NonnullGCPtr<DOM::Node const> root, Optional<DeprecatedFlyString>& namespace_, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed);
|
WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string_impl(JS::NonnullGCPtr<DOM::Node const> root, Optional<FlyString>& namespace_, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed);
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-xml-serialization
|
// https://w3c.github.io/DOM-Parsing/#dfn-xml-serialization
|
||||||
WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string(JS::NonnullGCPtr<DOM::Node const> root, RequireWellFormed require_well_formed)
|
WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string(JS::NonnullGCPtr<DOM::Node const> root, RequireWellFormed require_well_formed)
|
||||||
|
@ -129,13 +133,13 @@ WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string(JS::NonnullGC
|
||||||
// 1. Let namespace be a context namespace with value null. The context namespace tracks the XML serialization algorithm's current default namespace.
|
// 1. Let namespace be a context namespace with value null. The context namespace tracks the XML serialization algorithm's current default namespace.
|
||||||
// The context namespace is changed when either an Element Node has a default namespace declaration, or the algorithm generates a default namespace declaration
|
// The context namespace is changed when either an Element Node has a default namespace declaration, or the algorithm generates a default namespace declaration
|
||||||
// for the Element Node to match its own namespace. The algorithm assumes no namespace (null) to start.
|
// for the Element Node to match its own namespace. The algorithm assumes no namespace (null) to start.
|
||||||
Optional<DeprecatedFlyString> namespace_;
|
Optional<FlyString> namespace_;
|
||||||
|
|
||||||
// 2. Let prefix map be a new namespace prefix map.
|
// 2. Let prefix map be a new namespace prefix map.
|
||||||
HashMap<DeprecatedFlyString, Vector<DeprecatedString>> prefix_map;
|
HashMap<FlyString, Vector<Optional<FlyString>>> prefix_map;
|
||||||
|
|
||||||
// 3. Add the XML namespace with prefix value "xml" to prefix map.
|
// 3. Add the XML namespace with prefix value "xml" to prefix map.
|
||||||
add_prefix_to_namespace_prefix_map(prefix_map, "xml"sv, Namespace::XML);
|
add_prefix_to_namespace_prefix_map(prefix_map, "xml"_fly_string, Namespace::XML);
|
||||||
|
|
||||||
// 4. Let prefix index be a generated namespace prefix index with value 1. The generated namespace prefix index is used to generate a new unique prefix value
|
// 4. Let prefix index be a generated namespace prefix index with value 1. The generated namespace prefix index is used to generate a new unique prefix value
|
||||||
// when no suitable existing namespace prefix is available to serialize a node's namespaceURI (or the namespaceURI of one of node's attributes).
|
// when no suitable existing namespace prefix is available to serialize a node's namespaceURI (or the namespaceURI of one of node's attributes).
|
||||||
|
@ -148,16 +152,16 @@ WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string(JS::NonnullGC
|
||||||
return serialize_node_to_xml_string_impl(root, namespace_, prefix_map, prefix_index, require_well_formed);
|
return serialize_node_to_xml_string_impl(root, namespace_, prefix_map, prefix_index, require_well_formed);
|
||||||
}
|
}
|
||||||
|
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element const& element, Optional<DeprecatedFlyString>& namespace_, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed);
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element const& element, Optional<FlyString>& namespace_, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed);
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_document(DOM::Document const& document, Optional<DeprecatedFlyString>& namespace_, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed);
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_document(DOM::Document const& document, Optional<FlyString>& namespace_, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed);
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_comment(DOM::Comment const& comment, RequireWellFormed require_well_formed);
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_comment(DOM::Comment const& comment, RequireWellFormed require_well_formed);
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_text(DOM::Text const& text, RequireWellFormed require_well_formed);
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_text(DOM::Text const& text, RequireWellFormed require_well_formed);
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_document_fragment(DOM::DocumentFragment const& document_fragment, Optional<DeprecatedFlyString>& namespace_, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed);
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_document_fragment(DOM::DocumentFragment const& document_fragment, Optional<FlyString>& namespace_, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed);
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_document_type(DOM::DocumentType const& document_type, RequireWellFormed require_well_formed);
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_document_type(DOM::DocumentType const& document_type, RequireWellFormed require_well_formed);
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_processing_instruction(DOM::ProcessingInstruction const& processing_instruction, RequireWellFormed require_well_formed);
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_processing_instruction(DOM::ProcessingInstruction const& processing_instruction, RequireWellFormed require_well_formed);
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-xml-serialization-algorithm
|
// https://w3c.github.io/DOM-Parsing/#dfn-xml-serialization-algorithm
|
||||||
WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string_impl(JS::NonnullGCPtr<DOM::Node const> root, Optional<DeprecatedFlyString>& namespace_, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed)
|
WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string_impl(JS::NonnullGCPtr<DOM::Node const> root, Optional<FlyString>& namespace_, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed)
|
||||||
{
|
{
|
||||||
// Each of the following algorithms for producing an XML serialization of a DOM node take as input a node to serialize and the following arguments:
|
// Each of the following algorithms for producing an XML serialization of a DOM node take as input a node to serialize and the following arguments:
|
||||||
// - A context namespace namespace
|
// - A context namespace namespace
|
||||||
|
@ -224,10 +228,10 @@ WebIDL::ExceptionOr<DeprecatedString> serialize_node_to_xml_string_impl(JS::Nonn
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-recording-the-namespace-information
|
// https://w3c.github.io/DOM-Parsing/#dfn-recording-the-namespace-information
|
||||||
static Optional<DeprecatedString> record_namespace_information(DOM::Element const& element, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, HashMap<DeprecatedString, DeprecatedString>& local_prefix_map)
|
static Optional<FlyString> record_namespace_information(DOM::Element const& element, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, HashMap<FlyString, Optional<FlyString>>& local_prefix_map)
|
||||||
{
|
{
|
||||||
// 1. Let default namespace attr value be null.
|
// 1. Let default namespace attr value be null.
|
||||||
Optional<DeprecatedString> default_namespace_attribute_value;
|
Optional<FlyString> default_namespace_attribute_value;
|
||||||
|
|
||||||
// 2. Main: For each attribute attr in element's attributes, in the order they are specified in the element's attribute list:
|
// 2. Main: For each attribute attr in element's attributes, in the order they are specified in the element's attribute list:
|
||||||
for (size_t attribute_index = 0; attribute_index < element.attributes()->length(); ++attribute_index) {
|
for (size_t attribute_index = 0; attribute_index < element.attributes()->length(); ++attribute_index) {
|
||||||
|
@ -236,28 +240,25 @@ static Optional<DeprecatedString> record_namespace_information(DOM::Element cons
|
||||||
|
|
||||||
// 1. Let attribute namespace be the value of attr's namespaceURI value.
|
// 1. Let attribute namespace be the value of attr's namespaceURI value.
|
||||||
auto const& attribute_namespace = attribute->namespace_uri();
|
auto const& attribute_namespace = attribute->namespace_uri();
|
||||||
DeprecatedFlyString deprecated_attribute_namespace;
|
|
||||||
if (attribute_namespace.has_value())
|
|
||||||
deprecated_attribute_namespace = attribute_namespace->to_deprecated_fly_string();
|
|
||||||
|
|
||||||
// 2. Let attribute prefix be the value of attr's prefix.
|
// 2. Let attribute prefix be the value of attr's prefix.
|
||||||
auto const& attribute_prefix = attribute->prefix();
|
auto const& attribute_prefix = attribute->prefix();
|
||||||
|
|
||||||
// 3. If the attribute namespace is the XMLNS namespace, then:
|
// 3. If the attribute namespace is the XMLNS namespace, then:
|
||||||
if (deprecated_attribute_namespace == Namespace::XMLNS) {
|
if (attribute_namespace == Namespace::XMLNS) {
|
||||||
// 1. If attribute prefix is null, then attr is a default namespace declaration. Set the default namespace attr value to attr's value and stop running these steps,
|
// 1. If attribute prefix is null, then attr is a default namespace declaration. Set the default namespace attr value to attr's value and stop running these steps,
|
||||||
// returning to Main to visit the next attribute.
|
// returning to Main to visit the next attribute.
|
||||||
if (!attribute_prefix.has_value()) {
|
if (!attribute_prefix.has_value()) {
|
||||||
default_namespace_attribute_value = attribute->value().to_deprecated_string();
|
default_namespace_attribute_value = attribute->value();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Otherwise, the attribute prefix is not null and attr is a namespace prefix definition. Run the following steps:
|
// 2. Otherwise, the attribute prefix is not null and attr is a namespace prefix definition. Run the following steps:
|
||||||
// 1. Let prefix definition be the value of attr's localName.
|
// 1. Let prefix definition be the value of attr's localName.
|
||||||
auto const& prefix_definition = attribute->local_name().to_deprecated_fly_string();
|
auto const& prefix_definition = attribute->local_name();
|
||||||
|
|
||||||
// 2. Let namespace definition be the value of attr's value.
|
// 2. Let namespace definition be the value of attr's value.
|
||||||
DeprecatedFlyString namespace_definition = attribute->value().to_deprecated_string();
|
Optional<FlyString> namespace_definition = attribute->value();
|
||||||
|
|
||||||
// 3. If namespace definition is the XML namespace, then stop running these steps, and return to Main to visit the next attribute.
|
// 3. If namespace definition is the XML namespace, then stop running these steps, and return to Main to visit the next attribute.
|
||||||
if (namespace_definition == Namespace::XML)
|
if (namespace_definition == Namespace::XML)
|
||||||
|
@ -275,7 +276,7 @@ static Optional<DeprecatedString> record_namespace_information(DOM::Element cons
|
||||||
add_prefix_to_namespace_prefix_map(namespace_prefix_map, prefix_definition, namespace_definition);
|
add_prefix_to_namespace_prefix_map(namespace_prefix_map, prefix_definition, namespace_definition);
|
||||||
|
|
||||||
// 7. Add the value of prefix definition as a new key to the local prefixes map, with the namespace definition as the key's value replacing the value of null with the empty string if applicable.
|
// 7. Add the value of prefix definition as a new key to the local prefixes map, with the namespace definition as the key's value replacing the value of null with the empty string if applicable.
|
||||||
local_prefix_map.set(prefix_definition, namespace_definition.is_null() ? DeprecatedString::empty() : DeprecatedString { namespace_definition });
|
local_prefix_map.set(prefix_definition, namespace_definition.value_or(FlyString {}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,42 +285,40 @@ static Optional<DeprecatedString> record_namespace_information(DOM::Element cons
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-serializing-an-attribute-value
|
// https://w3c.github.io/DOM-Parsing/#dfn-serializing-an-attribute-value
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_an_attribute_value(OneOf<DeprecatedString, DeprecatedFlyString> auto const& attribute_value, [[maybe_unused]] RequireWellFormed require_well_formed)
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_an_attribute_value(Optional<FlyString> const& attribute_value, [[maybe_unused]] RequireWellFormed require_well_formed)
|
||||||
{
|
{
|
||||||
// FIXME: 1. If the require well-formed flag is set (its value is true), and attribute value contains characters that are not matched by the XML Char production,
|
// FIXME: 1. If the require well-formed flag is set (its value is true), and attribute value contains characters that are not matched by the XML Char production,
|
||||||
// then throw an exception; the serialization of this attribute value would fail to produce a well-formed element serialization.
|
// then throw an exception; the serialization of this attribute value would fail to produce a well-formed element serialization.
|
||||||
|
|
||||||
// 2. If attribute value is null, then return the empty string.
|
// 2. If attribute value is null, then return the empty string.
|
||||||
if constexpr (requires { attribute_value.is_null(); }) {
|
if (!attribute_value.has_value())
|
||||||
if (attribute_value.is_null())
|
return DeprecatedString::empty();
|
||||||
return DeprecatedString::empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Otherwise, attribute value is a string. Return the value of attribute value, first replacing any occurrences of the following:
|
// 3. Otherwise, attribute value is a string. Return the value of attribute value, first replacing any occurrences of the following:
|
||||||
DeprecatedString final_attribute_value = attribute_value;
|
auto final_attribute_value = attribute_value->to_string();
|
||||||
|
|
||||||
// 1. "&" with "&"
|
// 1. "&" with "&"
|
||||||
final_attribute_value = final_attribute_value.replace("&"sv, "&"sv, ReplaceMode::All);
|
final_attribute_value = MUST(final_attribute_value.replace("&"sv, "&"sv, ReplaceMode::All));
|
||||||
|
|
||||||
// 2. """ with """
|
// 2. """ with """
|
||||||
final_attribute_value = final_attribute_value.replace("\""sv, """sv, ReplaceMode::All);
|
final_attribute_value = MUST(final_attribute_value.replace("\""sv, """sv, ReplaceMode::All));
|
||||||
|
|
||||||
// 3. "<" with "<"
|
// 3. "<" with "<"
|
||||||
final_attribute_value = final_attribute_value.replace("<"sv, "<"sv, ReplaceMode::All);
|
final_attribute_value = MUST(final_attribute_value.replace("<"sv, "<"sv, ReplaceMode::All));
|
||||||
|
|
||||||
// 4. ">" with ">"
|
// 4. ">" with ">"
|
||||||
final_attribute_value = final_attribute_value.replace(">"sv, ">"sv, ReplaceMode::All);
|
final_attribute_value = MUST(final_attribute_value.replace(">"sv, ">"sv, ReplaceMode::All));
|
||||||
|
|
||||||
return final_attribute_value;
|
return final_attribute_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LocalNameSetEntry {
|
struct LocalNameSetEntry {
|
||||||
DeprecatedString namespace_uri;
|
Optional<FlyString> namespace_uri;
|
||||||
DeprecatedString local_name;
|
FlyString local_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-xml-serialization-of-the-attributes
|
// https://w3c.github.io/DOM-Parsing/#dfn-xml-serialization-of-the-attributes
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::Element const& element, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, HashMap<DeprecatedString, DeprecatedString> const& local_prefixes_map, bool ignore_namespace_definition_attribute, RequireWellFormed require_well_formed)
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::Element const& element, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, HashMap<FlyString, Optional<FlyString>> const& local_prefixes_map, bool ignore_namespace_definition_attribute, RequireWellFormed require_well_formed)
|
||||||
{
|
{
|
||||||
auto& realm = element.realm();
|
auto& realm = element.realm();
|
||||||
|
|
||||||
|
@ -336,15 +335,11 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
auto const* attribute = element.attributes()->item(attribute_index);
|
auto const* attribute = element.attributes()->item(attribute_index);
|
||||||
VERIFY(attribute);
|
VERIFY(attribute);
|
||||||
|
|
||||||
DeprecatedFlyString deprecated_attribute_namespace;
|
|
||||||
if (attribute->namespace_uri().has_value())
|
|
||||||
deprecated_attribute_namespace = attribute->namespace_uri()->to_deprecated_fly_string();
|
|
||||||
|
|
||||||
// 1. If the require well-formed flag is set (its value is true), and the localname set contains a tuple whose values match those of a new tuple consisting of attr's namespaceURI attribute and localName attribute,
|
// 1. If the require well-formed flag is set (its value is true), and the localname set contains a tuple whose values match those of a new tuple consisting of attr's namespaceURI attribute and localName attribute,
|
||||||
// then throw an exception; the serialization of this attr would fail to produce a well-formed element serialization.
|
// then throw an exception; the serialization of this attr would fail to produce a well-formed element serialization.
|
||||||
if (require_well_formed == RequireWellFormed::Yes) {
|
if (require_well_formed == RequireWellFormed::Yes) {
|
||||||
auto local_name_set_iterator = local_name_set.find_if([&attribute, &deprecated_attribute_namespace](LocalNameSetEntry const& entry) {
|
auto local_name_set_iterator = local_name_set.find_if([&attribute](LocalNameSetEntry const& entry) {
|
||||||
return entry.namespace_uri == deprecated_attribute_namespace && entry.local_name == attribute->local_name().to_deprecated_fly_string();
|
return entry.namespace_uri == attribute->namespace_uri() && entry.local_name == attribute->local_name();
|
||||||
});
|
});
|
||||||
|
|
||||||
if (local_name_set_iterator != local_name_set.end())
|
if (local_name_set_iterator != local_name_set.end())
|
||||||
|
@ -353,8 +348,8 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
|
|
||||||
// 2. Create a new tuple consisting of attr's namespaceURI attribute and localName attribute, and add it to the localname set.
|
// 2. Create a new tuple consisting of attr's namespaceURI attribute and localName attribute, and add it to the localname set.
|
||||||
LocalNameSetEntry new_local_name_set_entry {
|
LocalNameSetEntry new_local_name_set_entry {
|
||||||
.namespace_uri = deprecated_attribute_namespace,
|
.namespace_uri = attribute->namespace_uri(),
|
||||||
.local_name = attribute->local_name().to_deprecated_fly_string(),
|
.local_name = attribute->local_name(),
|
||||||
};
|
};
|
||||||
|
|
||||||
local_name_set.append(move(new_local_name_set_entry));
|
local_name_set.append(move(new_local_name_set_entry));
|
||||||
|
@ -363,7 +358,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
auto const& attribute_namespace = attribute->namespace_uri();
|
auto const& attribute_namespace = attribute->namespace_uri();
|
||||||
|
|
||||||
// 4. Let candidate prefix be null.
|
// 4. Let candidate prefix be null.
|
||||||
Optional<DeprecatedString> candidate_prefix;
|
Optional<FlyString> candidate_prefix;
|
||||||
|
|
||||||
// 5. If attribute namespace is not null, then run these sub-steps:
|
// 5. If attribute namespace is not null, then run these sub-steps:
|
||||||
if (attribute_namespace.has_value()) {
|
if (attribute_namespace.has_value()) {
|
||||||
|
@ -372,13 +367,13 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
if (attribute->prefix().has_value())
|
if (attribute->prefix().has_value())
|
||||||
deprecated_prefix = attribute->prefix()->to_deprecated_fly_string();
|
deprecated_prefix = attribute->prefix()->to_deprecated_fly_string();
|
||||||
|
|
||||||
candidate_prefix = retrieve_a_preferred_prefix_string(deprecated_prefix, namespace_prefix_map, deprecated_attribute_namespace);
|
candidate_prefix = retrieve_a_preferred_prefix_string(attribute->prefix(), namespace_prefix_map, attribute->namespace_uri());
|
||||||
|
|
||||||
// 2. If the value of attribute namespace is the XMLNS namespace, then run these steps:
|
// 2. If the value of attribute namespace is the XMLNS namespace, then run these steps:
|
||||||
if (deprecated_attribute_namespace == Namespace::XMLNS) {
|
if (attribute_namespace == Namespace::XMLNS) {
|
||||||
// 1. If any of the following are true, then stop running these steps and goto Loop to visit the next attribute:
|
// 1. If any of the following are true, then stop running these steps and goto Loop to visit the next attribute:
|
||||||
// - the attr's value is the XML namespace;
|
// - the attr's value is the XML namespace;
|
||||||
if (attribute->value().to_deprecated_string() == Namespace::XML)
|
if (attribute->value() == Namespace::XML)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// - the attr's prefix is null and the ignore namespace definition attribute flag is true (the Element's default namespace attribute should be skipped);
|
// - the attr's prefix is null and the ignore namespace definition attribute flag is true (the Element's default namespace attribute should be skipped);
|
||||||
|
@ -388,23 +383,23 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
// - the attr's prefix is not null and either
|
// - the attr's prefix is not null and either
|
||||||
if (attribute->prefix().has_value()) {
|
if (attribute->prefix().has_value()) {
|
||||||
// - the attr's localName is not a key contained in the local prefixes map, or
|
// - the attr's localName is not a key contained in the local prefixes map, or
|
||||||
auto name_in_local_prefix_map_iterator = local_prefixes_map.find(attribute->local_name().to_deprecated_fly_string());
|
auto name_in_local_prefix_map_iterator = local_prefixes_map.find(attribute->local_name());
|
||||||
if (name_in_local_prefix_map_iterator == local_prefixes_map.end())
|
if (name_in_local_prefix_map_iterator == local_prefixes_map.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// - the attr's localName is present in the local prefixes map but the value of the key does not match attr's value
|
// - the attr's localName is present in the local prefixes map but the value of the key does not match attr's value
|
||||||
if (name_in_local_prefix_map_iterator->value != attribute->value().to_deprecated_string())
|
if (name_in_local_prefix_map_iterator->value != attribute->value())
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// and furthermore that the attr's localName (as the prefix to find) is found in the namespace prefix map given the namespace consisting of the attr's value
|
// and furthermore that the attr's localName (as the prefix to find) is found in the namespace prefix map given the namespace consisting of the attr's value
|
||||||
// (the current namespace prefix definition was exactly defined previously--on an ancestor element not the current element whose attributes are being processed).
|
// (the current namespace prefix definition was exactly defined previously--on an ancestor element not the current element whose attributes are being processed).
|
||||||
if (prefix_is_in_prefix_map(attribute->local_name().to_deprecated_fly_string(), namespace_prefix_map, attribute->value().to_deprecated_string()))
|
if (prefix_is_in_prefix_map(attribute->local_name(), namespace_prefix_map, attribute->value()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// 2. If the require well-formed flag is set (its value is true), and the value of attr's value attribute matches the XMLNS namespace,
|
// 2. If the require well-formed flag is set (its value is true), and the value of attr's value attribute matches the XMLNS namespace,
|
||||||
// then throw an exception; the serialization of this attribute would produce invalid XML because the XMLNS namespace is reserved and cannot be applied as an element's namespace via XML parsing.
|
// then throw an exception; the serialization of this attribute would produce invalid XML because the XMLNS namespace is reserved and cannot be applied as an element's namespace via XML parsing.
|
||||||
if (require_well_formed == RequireWellFormed::Yes && attribute->value().to_deprecated_string() == Namespace::XMLNS)
|
if (require_well_formed == RequireWellFormed::Yes && attribute->value() == Namespace::XMLNS)
|
||||||
return WebIDL::InvalidStateError::create(realm, "The XMLNS namespace cannot be used as an element's namespace"_fly_string);
|
return WebIDL::InvalidStateError::create(realm, "The XMLNS namespace cannot be used as an element's namespace"_fly_string);
|
||||||
|
|
||||||
// 3. If the require well-formed flag is set (its value is true), and the value of attr's value attribute is the empty string,
|
// 3. If the require well-formed flag is set (its value is true), and the value of attr's value attribute is the empty string,
|
||||||
|
@ -414,13 +409,13 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
|
|
||||||
// 4. [If] the attr's prefix matches the string "xmlns", then let candidate prefix be the string "xmlns".
|
// 4. [If] the attr's prefix matches the string "xmlns", then let candidate prefix be the string "xmlns".
|
||||||
if (attribute->prefix() == "xmlns"sv)
|
if (attribute->prefix() == "xmlns"sv)
|
||||||
candidate_prefix = "xmlns"sv;
|
candidate_prefix = "xmlns"_fly_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Otherwise, the attribute namespace in not the XMLNS namespace. Run these steps:
|
// 3. Otherwise, the attribute namespace in not the XMLNS namespace. Run these steps:
|
||||||
else {
|
else {
|
||||||
// 1. Let candidate prefix be the result of generating a prefix providing map, attribute namespace, and prefix index as input.
|
// 1. Let candidate prefix be the result of generating a prefix providing map, attribute namespace, and prefix index as input.
|
||||||
candidate_prefix = generate_a_prefix(namespace_prefix_map, deprecated_attribute_namespace, prefix_index);
|
candidate_prefix = generate_a_prefix(namespace_prefix_map, attribute->namespace_uri(), prefix_index);
|
||||||
|
|
||||||
// 2. Append the following to result, in the order listed:
|
// 2. Append the following to result, in the order listed:
|
||||||
// 1. " " (U+0020 SPACE);
|
// 1. " " (U+0020 SPACE);
|
||||||
|
@ -435,7 +430,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
result.append("=\""sv);
|
result.append("=\""sv);
|
||||||
|
|
||||||
// 5. The result of serializing an attribute value given attribute namespace and the require well-formed flag as input
|
// 5. The result of serializing an attribute value given attribute namespace and the require well-formed flag as input
|
||||||
result.append(TRY(serialize_an_attribute_value(deprecated_attribute_namespace, require_well_formed)));
|
result.append(TRY(serialize_an_attribute_value(attribute->namespace_uri(), require_well_formed)));
|
||||||
|
|
||||||
// 6. """ (U+0022 QUOTATION MARK).
|
// 6. """ (U+0022 QUOTATION MARK).
|
||||||
result.append('"');
|
result.append('"');
|
||||||
|
@ -457,7 +452,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
|
|
||||||
// FIXME: Check attribute's local name against the XML Name production.
|
// FIXME: Check attribute's local name against the XML Name production.
|
||||||
|
|
||||||
if (attribute->local_name() == "xmlns"sv && deprecated_attribute_namespace.is_null())
|
if (attribute->local_name() == "xmlns"sv && !attribute->namespace_uri().has_value())
|
||||||
return WebIDL::InvalidStateError::create(realm, "Attribute's local name is 'xmlns' and the attribute has no namespace"_fly_string);
|
return WebIDL::InvalidStateError::create(realm, "Attribute's local name is 'xmlns' and the attribute has no namespace"_fly_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,7 +464,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
result.append("=\""sv);
|
result.append("=\""sv);
|
||||||
|
|
||||||
// 3. The result of serializing an attribute value given attr's value attribute and the require well-formed flag as input;
|
// 3. The result of serializing an attribute value given attr's value attribute and the require well-formed flag as input;
|
||||||
result.append(TRY(serialize_an_attribute_value(attribute->value().to_deprecated_string(), require_well_formed)));
|
result.append(TRY(serialize_an_attribute_value(attribute->value(), require_well_formed)));
|
||||||
|
|
||||||
// 4. """ (U+0022 QUOTATION MARK).
|
// 4. """ (U+0022 QUOTATION MARK).
|
||||||
result.append('"');
|
result.append('"');
|
||||||
|
@ -480,7 +475,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element_attributes(DOM::E
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#xml-serializing-an-element-node
|
// https://w3c.github.io/DOM-Parsing/#xml-serializing-an-element-node
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element const& element, Optional<DeprecatedFlyString>& namespace_, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed)
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element const& element, Optional<FlyString>& namespace_, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed)
|
||||||
{
|
{
|
||||||
auto& realm = element.realm();
|
auto& realm = element.realm();
|
||||||
|
|
||||||
|
@ -507,7 +502,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element cons
|
||||||
bool ignore_namespace_definition_attribute = false;
|
bool ignore_namespace_definition_attribute = false;
|
||||||
|
|
||||||
// 6. Given prefix map, copy a namespace prefix map and let map be the result.
|
// 6. Given prefix map, copy a namespace prefix map and let map be the result.
|
||||||
HashMap<DeprecatedFlyString, Vector<DeprecatedString>> map;
|
HashMap<FlyString, Vector<Optional<FlyString>>> map;
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#dfn-copy-a-namespace-prefix-map
|
// https://w3c.github.io/DOM-Parsing/#dfn-copy-a-namespace-prefix-map
|
||||||
// NOTE: This is only used here.
|
// NOTE: This is only used here.
|
||||||
|
@ -519,7 +514,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element cons
|
||||||
|
|
||||||
// 7. Let local prefixes map be an empty map. The map has unique Node prefix strings as its keys, with corresponding namespaceURI Node values
|
// 7. Let local prefixes map be an empty map. The map has unique Node prefix strings as its keys, with corresponding namespaceURI Node values
|
||||||
// as the map's key values (in this map, the null namespace is represented by the empty string).
|
// as the map's key values (in this map, the null namespace is represented by the empty string).
|
||||||
HashMap<DeprecatedString, DeprecatedString> local_prefixes_map;
|
HashMap<FlyString, Optional<FlyString>> local_prefixes_map;
|
||||||
|
|
||||||
// 8. Let local default namespace be the result of recording the namespace information for node given map and local prefixes map.
|
// 8. Let local default namespace be the result of recording the namespace information for node given map and local prefixes map.
|
||||||
auto local_default_namespace = record_namespace_information(element, map, local_prefixes_map);
|
auto local_default_namespace = record_namespace_information(element, map, local_prefixes_map);
|
||||||
|
@ -528,7 +523,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element cons
|
||||||
auto inherited_ns = namespace_;
|
auto inherited_ns = namespace_;
|
||||||
|
|
||||||
// 10. Let ns be the value of node's namespaceURI attribute.
|
// 10. Let ns be the value of node's namespaceURI attribute.
|
||||||
auto const& ns = element.namespace_();
|
auto const& ns = element.namespace_uri();
|
||||||
|
|
||||||
// 11. If inherited ns is equal to ns, then:
|
// 11. If inherited ns is equal to ns, then:
|
||||||
if (inherited_ns == ns) {
|
if (inherited_ns == ns) {
|
||||||
|
@ -551,7 +546,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element cons
|
||||||
// 12. Otherwise, inherited ns is not equal to ns (the node's own namespace is different from the context namespace of its parent). Run these sub-steps:
|
// 12. Otherwise, inherited ns is not equal to ns (the node's own namespace is different from the context namespace of its parent). Run these sub-steps:
|
||||||
else {
|
else {
|
||||||
// 1. Let prefix be the value of node's prefix attribute.
|
// 1. Let prefix be the value of node's prefix attribute.
|
||||||
auto prefix = element.deprecated_prefix();
|
auto prefix = element.prefix();
|
||||||
|
|
||||||
// 2. Let candidate prefix be the result of retrieving a preferred prefix string prefix from map given namespace ns.
|
// 2. Let candidate prefix be the result of retrieving a preferred prefix string prefix from map given namespace ns.
|
||||||
auto candidate_prefix = retrieve_a_preferred_prefix_string(prefix, map, ns);
|
auto candidate_prefix = retrieve_a_preferred_prefix_string(prefix, map, ns);
|
||||||
|
@ -586,9 +581,9 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element cons
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. Otherwise, if prefix is not null, then:
|
// 5. Otherwise, if prefix is not null, then:
|
||||||
else if (!prefix.is_null()) {
|
else if (prefix.has_value()) {
|
||||||
// 1. If the local prefixes map contains a key matching prefix, then let prefix be the result of generating a prefix providing as input map, ns, and prefix index.
|
// 1. If the local prefixes map contains a key matching prefix, then let prefix be the result of generating a prefix providing as input map, ns, and prefix index.
|
||||||
if (local_prefixes_map.contains(prefix))
|
if (local_prefixes_map.contains(*prefix))
|
||||||
prefix = generate_a_prefix(map, ns, prefix_index);
|
prefix = generate_a_prefix(map, ns, prefix_index);
|
||||||
|
|
||||||
// 2. Add prefix to map given namespace ns.
|
// 2. Add prefix to map given namespace ns.
|
||||||
|
@ -606,7 +601,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element cons
|
||||||
markup.append(" xmlns:"sv);
|
markup.append(" xmlns:"sv);
|
||||||
|
|
||||||
// 3. The value of prefix;
|
// 3. The value of prefix;
|
||||||
markup.append(prefix);
|
markup.append(prefix.value());
|
||||||
|
|
||||||
// 4. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
|
// 4. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
|
||||||
markup.append("=\""sv);
|
markup.append("=\""sv);
|
||||||
|
@ -722,7 +717,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_element(DOM::Element cons
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#xml-serializing-a-document-node
|
// https://w3c.github.io/DOM-Parsing/#xml-serializing-a-document-node
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_document(DOM::Document const& document, Optional<DeprecatedFlyString>& namespace_, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed)
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_document(DOM::Document const& document, Optional<FlyString>& namespace_, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed)
|
||||||
{
|
{
|
||||||
// If the require well-formed flag is set (its value is true), and this node has no documentElement (the documentElement attribute's value is null),
|
// If the require well-formed flag is set (its value is true), and this node has no documentElement (the documentElement attribute's value is null),
|
||||||
// then throw an exception; the serialization of this node would not be a well-formed document.
|
// then throw an exception; the serialization of this node would not be a well-formed document.
|
||||||
|
@ -784,7 +779,7 @@ static WebIDL::ExceptionOr<DeprecatedString> serialize_text(DOM::Text const& tex
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/DOM-Parsing/#xml-serializing-a-documentfragment-node
|
// https://w3c.github.io/DOM-Parsing/#xml-serializing-a-documentfragment-node
|
||||||
static WebIDL::ExceptionOr<DeprecatedString> serialize_document_fragment(DOM::DocumentFragment const& document_fragment, Optional<DeprecatedFlyString>& namespace_, HashMap<DeprecatedFlyString, Vector<DeprecatedString>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed)
|
static WebIDL::ExceptionOr<DeprecatedString> serialize_document_fragment(DOM::DocumentFragment const& document_fragment, Optional<FlyString>& namespace_, HashMap<FlyString, Vector<Optional<FlyString>>>& namespace_prefix_map, u64& prefix_index, RequireWellFormed require_well_formed)
|
||||||
{
|
{
|
||||||
// 1. Let markup the empty string.
|
// 1. Let markup the empty string.
|
||||||
StringBuilder markup;
|
StringBuilder markup;
|
||||||
|
|
|
@ -244,10 +244,10 @@ WebIDL::ExceptionOr<BrowsingContext::BrowsingContextAndDocument> BrowsingContext
|
||||||
document->set_ready_for_post_load_tasks(true);
|
document->set_ready_for_post_load_tasks(true);
|
||||||
|
|
||||||
// 18. Ensure that document has a single child html node, which itself has two empty child nodes: a head element, and a body element.
|
// 18. Ensure that document has a single child html node, which itself has two empty child nodes: a head element, and a body element.
|
||||||
auto html_node = TRY(DOM::create_element(document, HTML::TagNames::html, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
auto html_node = TRY(DOM::create_element(document, HTML::TagNames::html, Namespace::HTML));
|
||||||
auto head_element = TRY(DOM::create_element(document, HTML::TagNames::head, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
auto head_element = TRY(DOM::create_element(document, HTML::TagNames::head, Namespace::HTML));
|
||||||
TRY(html_node->append_child(head_element));
|
TRY(html_node->append_child(head_element));
|
||||||
auto body_element = TRY(DOM::create_element(document, HTML::TagNames::body, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
auto body_element = TRY(DOM::create_element(document, HTML::TagNames::body, Namespace::HTML));
|
||||||
TRY(html_node->append_child(body_element));
|
TRY(html_node->append_child(body_element));
|
||||||
TRY(document->append_child(html_node));
|
TRY(document->append_child(html_node));
|
||||||
|
|
||||||
|
|
|
@ -286,7 +286,7 @@ JS::ThrowCompletionOr<void> CustomElementRegistry::define(String const& name, We
|
||||||
|
|
||||||
auto& inclusive_descendant_element = static_cast<DOM::Element&>(inclusive_descendant);
|
auto& inclusive_descendant_element = static_cast<DOM::Element&>(inclusive_descendant);
|
||||||
|
|
||||||
if (inclusive_descendant_element.namespace_() == Namespace::HTML && inclusive_descendant_element.local_name() == local_name && (!extends.has_value() || inclusive_descendant_element.is_value() == name))
|
if (inclusive_descendant_element.namespace_uri() == Namespace::HTML && inclusive_descendant_element.local_name() == local_name && (!extends.has_value() || inclusive_descendant_element.is_value() == name))
|
||||||
upgrade_candidates.append(JS::make_handle(inclusive_descendant_element));
|
upgrade_candidates.append(JS::make_handle(inclusive_descendant_element));
|
||||||
|
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
|
|
|
@ -112,11 +112,11 @@ WebIDL::ExceptionOr<void> HTMLDetailsElement::create_shadow_tree(JS::Realm& real
|
||||||
shadow_root->set_slot_assignment(Bindings::SlotAssignmentMode::Manual);
|
shadow_root->set_slot_assignment(Bindings::SlotAssignmentMode::Manual);
|
||||||
|
|
||||||
// The first slot is expected to take the details element's first summary element child, if any.
|
// The first slot is expected to take the details element's first summary element child, if any.
|
||||||
auto summary_slot = TRY(DOM::create_element(document(), HTML::TagNames::slot, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
auto summary_slot = TRY(DOM::create_element(document(), HTML::TagNames::slot, Namespace::HTML));
|
||||||
MUST(shadow_root->append_child(summary_slot));
|
MUST(shadow_root->append_child(summary_slot));
|
||||||
|
|
||||||
// The second slot is expected to take the details element's remaining descendants, if any.
|
// The second slot is expected to take the details element's remaining descendants, if any.
|
||||||
auto descendants_slot = TRY(DOM::create_element(document(), HTML::TagNames::slot, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
auto descendants_slot = TRY(DOM::create_element(document(), HTML::TagNames::slot, Namespace::HTML));
|
||||||
MUST(shadow_root->append_child(descendants_slot));
|
MUST(shadow_root->append_child(descendants_slot));
|
||||||
|
|
||||||
m_summary_slot = static_cast<HTML::HTMLSlotElement&>(*summary_slot);
|
m_summary_slot = static_cast<HTML::HTMLSlotElement&>(*summary_slot);
|
||||||
|
|
|
@ -536,7 +536,7 @@ void HTMLInputElement::create_text_input_shadow_tree()
|
||||||
{
|
{
|
||||||
auto shadow_root = heap().allocate<DOM::ShadowRoot>(realm(), document(), *this, Bindings::ShadowRootMode::Closed);
|
auto shadow_root = heap().allocate<DOM::ShadowRoot>(realm(), document(), *this, Bindings::ShadowRootMode::Closed);
|
||||||
auto initial_value = m_value;
|
auto initial_value = m_value;
|
||||||
auto element = DOM::create_element(document(), HTML::TagNames::div, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto element = DOM::create_element(document(), HTML::TagNames::div, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(element->set_attribute(HTML::AttributeNames::style, R"~~~(
|
MUST(element->set_attribute(HTML::AttributeNames::style, R"~~~(
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
@ -555,7 +555,7 @@ void HTMLInputElement::create_text_input_shadow_tree()
|
||||||
MUST(m_placeholder_element->append_child(*m_placeholder_text_node));
|
MUST(m_placeholder_element->append_child(*m_placeholder_text_node));
|
||||||
MUST(element->append_child(*m_placeholder_element));
|
MUST(element->append_child(*m_placeholder_element));
|
||||||
|
|
||||||
m_inner_text_element = DOM::create_element(document(), HTML::TagNames::div, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
m_inner_text_element = DOM::create_element(document(), HTML::TagNames::div, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(m_inner_text_element->style_for_bindings()->set_property(CSS::PropertyID::Height, "1lh"sv));
|
MUST(m_inner_text_element->style_for_bindings()->set_property(CSS::PropertyID::Height, "1lh"sv));
|
||||||
|
|
||||||
m_text_node = heap().allocate<DOM::Text>(realm(), document(), MUST(String::from_deprecated_string(initial_value)));
|
m_text_node = heap().allocate<DOM::Text>(realm(), document(), MUST(String::from_deprecated_string(initial_value)));
|
||||||
|
@ -587,7 +587,7 @@ void HTMLInputElement::create_color_input_shadow_tree()
|
||||||
|
|
||||||
auto color = value_sanitization_algorithm(m_value);
|
auto color = value_sanitization_algorithm(m_value);
|
||||||
|
|
||||||
auto border = DOM::create_element(document(), HTML::TagNames::div, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto border = DOM::create_element(document(), HTML::TagNames::div, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(border->set_attribute(HTML::AttributeNames::style, R"~~~(
|
MUST(border->set_attribute(HTML::AttributeNames::style, R"~~~(
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
|
@ -596,7 +596,7 @@ void HTMLInputElement::create_color_input_shadow_tree()
|
||||||
background-color: ButtonFace;
|
background-color: ButtonFace;
|
||||||
)~~~"_string));
|
)~~~"_string));
|
||||||
|
|
||||||
m_color_well_element = DOM::create_element(document(), HTML::TagNames::div, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
m_color_well_element = DOM::create_element(document(), HTML::TagNames::div, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(m_color_well_element->set_attribute(HTML::AttributeNames::style, R"~~~(
|
MUST(m_color_well_element->set_attribute(HTML::AttributeNames::style, R"~~~(
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
|
|
|
@ -118,7 +118,7 @@ JS::NonnullGCPtr<HTMLTableCaptionElement> HTMLTableElement::create_caption()
|
||||||
return *maybe_caption;
|
return *maybe_caption;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto caption = DOM::create_element(document(), TagNames::caption, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto caption = DOM::create_element(document(), TagNames::caption, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(pre_insert(caption, first_child()));
|
MUST(pre_insert(caption, first_child()));
|
||||||
return static_cast<HTMLTableCaptionElement&>(*caption);
|
return static_cast<HTMLTableCaptionElement&>(*caption);
|
||||||
}
|
}
|
||||||
|
@ -196,7 +196,7 @@ JS::NonnullGCPtr<HTMLTableSectionElement> HTMLTableElement::create_t_head()
|
||||||
if (maybe_thead)
|
if (maybe_thead)
|
||||||
return *maybe_thead;
|
return *maybe_thead;
|
||||||
|
|
||||||
auto thead = DOM::create_element(document(), TagNames::thead, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto thead = DOM::create_element(document(), TagNames::thead, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
|
|
||||||
// We insert the new thead after any <caption> or <colgroup> elements
|
// We insert the new thead after any <caption> or <colgroup> elements
|
||||||
DOM::Node* child_to_insert_before = nullptr;
|
DOM::Node* child_to_insert_before = nullptr;
|
||||||
|
@ -272,7 +272,7 @@ JS::NonnullGCPtr<HTMLTableSectionElement> HTMLTableElement::create_t_foot()
|
||||||
if (maybe_tfoot)
|
if (maybe_tfoot)
|
||||||
return *maybe_tfoot;
|
return *maybe_tfoot;
|
||||||
|
|
||||||
auto tfoot = DOM::create_element(document(), TagNames::tfoot, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto tfoot = DOM::create_element(document(), TagNames::tfoot, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(append_child(tfoot));
|
MUST(append_child(tfoot));
|
||||||
return static_cast<HTMLTableSectionElement&>(*tfoot);
|
return static_cast<HTMLTableSectionElement&>(*tfoot);
|
||||||
}
|
}
|
||||||
|
@ -302,7 +302,7 @@ JS::NonnullGCPtr<DOM::HTMLCollection> HTMLTableElement::t_bodies()
|
||||||
// https://html.spec.whatwg.org/multipage/tables.html#dom-table-createtbody
|
// https://html.spec.whatwg.org/multipage/tables.html#dom-table-createtbody
|
||||||
JS::NonnullGCPtr<HTMLTableSectionElement> HTMLTableElement::create_t_body()
|
JS::NonnullGCPtr<HTMLTableSectionElement> HTMLTableElement::create_t_body()
|
||||||
{
|
{
|
||||||
auto tbody = DOM::create_element(document(), TagNames::tbody, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto tbody = DOM::create_element(document(), TagNames::tbody, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
|
|
||||||
// We insert the new tbody after the last <tbody> element
|
// We insert the new tbody after the last <tbody> element
|
||||||
DOM::Node* child_to_insert_before = nullptr;
|
DOM::Node* child_to_insert_before = nullptr;
|
||||||
|
@ -365,9 +365,9 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<HTMLTableRowElement>> HTMLTableElement::ins
|
||||||
if (index < -1 || index > (long)rows_length) {
|
if (index < -1 || index > (long)rows_length) {
|
||||||
return WebIDL::IndexSizeError::create(realm(), "Index is negative or greater than the number of rows"_fly_string);
|
return WebIDL::IndexSizeError::create(realm(), "Index is negative or greater than the number of rows"_fly_string);
|
||||||
}
|
}
|
||||||
auto& tr = static_cast<HTMLTableRowElement&>(*TRY(DOM::create_element(document(), TagNames::tr, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)))));
|
auto& tr = static_cast<HTMLTableRowElement&>(*TRY(DOM::create_element(document(), TagNames::tr, Namespace::HTML)));
|
||||||
if (rows_length == 0 && !has_child_of_type<HTMLTableRowElement>()) {
|
if (rows_length == 0 && !has_child_of_type<HTMLTableRowElement>()) {
|
||||||
auto tbody = TRY(DOM::create_element(document(), TagNames::tbody, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
auto tbody = TRY(DOM::create_element(document(), TagNames::tbody, Namespace::HTML));
|
||||||
TRY(tbody->append_child(tr));
|
TRY(tbody->append_child(tr));
|
||||||
TRY(append_child(tbody));
|
TRY(append_child(tbody));
|
||||||
} else if (rows_length == 0) {
|
} else if (rows_length == 0) {
|
||||||
|
|
|
@ -132,7 +132,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<HTMLTableCellElement>> HTMLTableRowElement:
|
||||||
return WebIDL::IndexSizeError::create(realm(), "Index is negative or greater than the number of cells"_fly_string);
|
return WebIDL::IndexSizeError::create(realm(), "Index is negative or greater than the number of cells"_fly_string);
|
||||||
|
|
||||||
// 2. Let table cell be the result of creating an element given this tr element's node document, td, and the HTML namespace.
|
// 2. Let table cell be the result of creating an element given this tr element's node document, td, and the HTML namespace.
|
||||||
auto& table_cell = static_cast<HTMLTableCellElement&>(*TRY(DOM::create_element(document(), HTML::TagNames::td, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)))));
|
auto& table_cell = static_cast<HTMLTableCellElement&>(*TRY(DOM::create_element(document(), HTML::TagNames::td, Namespace::HTML)));
|
||||||
|
|
||||||
// 3. If index is equal to −1 or equal to the number of items in cells collection, then append table cell to this tr element.
|
// 3. If index is equal to −1 or equal to the number of items in cells collection, then append table cell to this tr element.
|
||||||
if (index == -1 || index == cells_collection_size)
|
if (index == -1 || index == cells_collection_size)
|
||||||
|
|
|
@ -57,7 +57,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<HTMLTableRowElement>> HTMLTableSectionEleme
|
||||||
return WebIDL::IndexSizeError::create(realm(), "Index is negative or greater than the number of rows"_fly_string);
|
return WebIDL::IndexSizeError::create(realm(), "Index is negative or greater than the number of rows"_fly_string);
|
||||||
|
|
||||||
// 2. Let table row be the result of creating an element given this element's node document, tr, and the HTML namespace.
|
// 2. Let table row be the result of creating an element given this element's node document, tr, and the HTML namespace.
|
||||||
auto& table_row = static_cast<HTMLTableRowElement&>(*TRY(DOM::create_element(document(), TagNames::tr, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)))));
|
auto& table_row = static_cast<HTMLTableRowElement&>(*TRY(DOM::create_element(document(), TagNames::tr, Namespace::HTML)));
|
||||||
|
|
||||||
// 3. If index is −1 or equal to the number of items in the rows collection, then append table row to this element.
|
// 3. If index is −1 or equal to the number of items in the rows collection, then append table row to this element.
|
||||||
if (index == -1 || index == rows_collection_size)
|
if (index == -1 || index == rows_collection_size)
|
||||||
|
|
|
@ -97,9 +97,9 @@ void HTMLTextAreaElement::create_shadow_tree_if_needed()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto shadow_root = heap().allocate<DOM::ShadowRoot>(realm(), document(), *this, Bindings::ShadowRootMode::Closed);
|
auto shadow_root = heap().allocate<DOM::ShadowRoot>(realm(), document(), *this, Bindings::ShadowRootMode::Closed);
|
||||||
auto element = MUST(DOM::create_element(document(), HTML::TagNames::div, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
auto element = MUST(DOM::create_element(document(), HTML::TagNames::div, Namespace::HTML));
|
||||||
|
|
||||||
m_inner_text_element = MUST(DOM::create_element(document(), HTML::TagNames::div, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))));
|
m_inner_text_element = MUST(DOM::create_element(document(), HTML::TagNames::div, Namespace::HTML));
|
||||||
|
|
||||||
m_text_node = heap().allocate<DOM::Text>(realm(), document(), String {});
|
m_text_node = heap().allocate<DOM::Text>(realm(), document(), String {});
|
||||||
m_text_node->set_always_editable(true);
|
m_text_node->set_always_editable(true);
|
||||||
|
|
|
@ -181,7 +181,7 @@ void HTMLParser::run()
|
||||||
// https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
|
// https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
|
||||||
// As each token is emitted from the tokenizer, the user agent must follow the appropriate steps from the following list, known as the tree construction dispatcher:
|
// As each token is emitted from the tokenizer, the user agent must follow the appropriate steps from the following list, known as the tree construction dispatcher:
|
||||||
if (m_stack_of_open_elements.is_empty()
|
if (m_stack_of_open_elements.is_empty()
|
||||||
|| adjusted_current_node().namespace_() == Namespace::HTML
|
|| adjusted_current_node().namespace_uri() == Namespace::HTML
|
||||||
|| (is_html_integration_point(adjusted_current_node()) && (token.is_start_tag() || token.is_character()))
|
|| (is_html_integration_point(adjusted_current_node()) && (token.is_start_tag() || token.is_character()))
|
||||||
|| token.is_end_of_file()) {
|
|| token.is_end_of_file()) {
|
||||||
// -> If the stack of open elements is empty
|
// -> If the stack of open elements is empty
|
||||||
|
@ -539,7 +539,7 @@ void HTMLParser::handle_before_html(HTMLToken& token)
|
||||||
// -> A start tag whose tag name is "html"
|
// -> A start tag whose tag name is "html"
|
||||||
if (token.is_start_tag() && token.tag_name() == HTML::TagNames::html) {
|
if (token.is_start_tag() && token.tag_name() == HTML::TagNames::html) {
|
||||||
// Create an element for the token in the HTML namespace, with the Document as the intended parent. Append it to the Document object. Put this element in the stack of open elements.
|
// Create an element for the token in the HTML namespace, with the Document as the intended parent. Append it to the Document object. Put this element in the stack of open elements.
|
||||||
auto element = create_element_for(token, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)), document());
|
auto element = create_element_for(token, Namespace::HTML, document());
|
||||||
MUST(document().append_child(*element));
|
MUST(document().append_child(*element));
|
||||||
m_stack_of_open_elements.push(move(element));
|
m_stack_of_open_elements.push(move(element));
|
||||||
|
|
||||||
|
@ -564,7 +564,7 @@ void HTMLParser::handle_before_html(HTMLToken& token)
|
||||||
// -> Anything else
|
// -> Anything else
|
||||||
AnythingElse:
|
AnythingElse:
|
||||||
// Create an html element whose node document is the Document object. Append it to the Document object. Put this element in the stack of open elements.
|
// Create an html element whose node document is the Document object. Append it to the Document object. Put this element in the stack of open elements.
|
||||||
auto element = create_element(document(), HTML::TagNames::html, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto element = create_element(document(), HTML::TagNames::html, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
MUST(document().append_child(element));
|
MUST(document().append_child(element));
|
||||||
m_stack_of_open_elements.push(element);
|
m_stack_of_open_elements.push(element);
|
||||||
|
|
||||||
|
@ -772,7 +772,7 @@ JS::NonnullGCPtr<DOM::Element> HTMLParser::insert_foreign_element(HTMLToken cons
|
||||||
|
|
||||||
JS::NonnullGCPtr<DOM::Element> HTMLParser::insert_html_element(HTMLToken const& token)
|
JS::NonnullGCPtr<DOM::Element> HTMLParser::insert_html_element(HTMLToken const& token)
|
||||||
{
|
{
|
||||||
return insert_foreign_element(token, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)));
|
return insert_foreign_element(token, Namespace::HTML);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLParser::handle_before_head(HTMLToken& token)
|
void HTMLParser::handle_before_head(HTMLToken& token)
|
||||||
|
@ -882,7 +882,7 @@ void HTMLParser::handle_in_head(HTMLToken& token)
|
||||||
|
|
||||||
if (token.is_start_tag() && token.tag_name() == HTML::TagNames::script) {
|
if (token.is_start_tag() && token.tag_name() == HTML::TagNames::script) {
|
||||||
auto adjusted_insertion_location = find_appropriate_place_for_inserting_node();
|
auto adjusted_insertion_location = find_appropriate_place_for_inserting_node();
|
||||||
auto element = create_element_for(token, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)), *adjusted_insertion_location.parent);
|
auto element = create_element_for(token, Namespace::HTML, *adjusted_insertion_location.parent);
|
||||||
auto& script_element = verify_cast<HTMLScriptElement>(*element);
|
auto& script_element = verify_cast<HTMLScriptElement>(*element);
|
||||||
script_element.set_parser_document(Badge<HTMLParser> {}, document());
|
script_element.set_parser_document(Badge<HTMLParser> {}, document());
|
||||||
script_element.set_force_async(Badge<HTMLParser> {}, false);
|
script_element.set_force_async(Badge<HTMLParser> {}, false);
|
||||||
|
@ -1383,7 +1383,7 @@ HTMLParser::AdoptionAgencyAlgorithmOutcome HTMLParser::run_the_adoption_agency_a
|
||||||
// 6. Create an element for the token for which the element node was created,
|
// 6. Create an element for the token for which the element node was created,
|
||||||
// in the HTML namespace, with common ancestor as the intended parent;
|
// in the HTML namespace, with common ancestor as the intended parent;
|
||||||
// FIXME: hold onto the real token
|
// FIXME: hold onto the real token
|
||||||
auto element = create_element_for(HTMLToken::make_start_tag(node->local_name()), MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)), *common_ancestor);
|
auto element = create_element_for(HTMLToken::make_start_tag(node->local_name()), Namespace::HTML, *common_ancestor);
|
||||||
// replace the entry for node in the list of active formatting elements with an entry for the new element,
|
// replace the entry for node in the list of active formatting elements with an entry for the new element,
|
||||||
m_list_of_active_formatting_elements.replace(*node, *element);
|
m_list_of_active_formatting_elements.replace(*node, *element);
|
||||||
// replace the entry for node in the stack of open elements with an entry for the new element,
|
// replace the entry for node in the stack of open elements with an entry for the new element,
|
||||||
|
@ -1412,7 +1412,7 @@ HTMLParser::AdoptionAgencyAlgorithmOutcome HTMLParser::run_the_adoption_agency_a
|
||||||
// 15. Create an element for the token for which formatting element was created,
|
// 15. Create an element for the token for which formatting element was created,
|
||||||
// in the HTML namespace, with furthest block as the intended parent.
|
// in the HTML namespace, with furthest block as the intended parent.
|
||||||
// FIXME: hold onto the real token
|
// FIXME: hold onto the real token
|
||||||
auto element = create_element_for(HTMLToken::make_start_tag(formatting_element->local_name()), MUST(FlyString::from_deprecated_fly_string(Namespace::HTML)), *furthest_block);
|
auto element = create_element_for(HTMLToken::make_start_tag(formatting_element->local_name()), Namespace::HTML, *furthest_block);
|
||||||
|
|
||||||
// 16. Take all of the child nodes of furthest block and append them to the element created in the last step.
|
// 16. Take all of the child nodes of furthest block and append them to the element created in the last step.
|
||||||
for (auto& child : furthest_block->children_as_vector())
|
for (auto& child : furthest_block->children_as_vector())
|
||||||
|
@ -1439,7 +1439,7 @@ HTMLParser::AdoptionAgencyAlgorithmOutcome HTMLParser::run_the_adoption_agency_a
|
||||||
// https://html.spec.whatwg.org/multipage/parsing.html#special
|
// https://html.spec.whatwg.org/multipage/parsing.html#special
|
||||||
bool HTMLParser::is_special_tag(FlyString const& tag_name, Optional<FlyString> const& namespace_)
|
bool HTMLParser::is_special_tag(FlyString const& tag_name, Optional<FlyString> const& namespace_)
|
||||||
{
|
{
|
||||||
if (namespace_ == MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))) {
|
if (namespace_ == Namespace::HTML) {
|
||||||
return tag_name.is_one_of(
|
return tag_name.is_one_of(
|
||||||
HTML::TagNames::address,
|
HTML::TagNames::address,
|
||||||
HTML::TagNames::applet,
|
HTML::TagNames::applet,
|
||||||
|
@ -1523,12 +1523,12 @@ bool HTMLParser::is_special_tag(FlyString const& tag_name, Optional<FlyString> c
|
||||||
HTML::TagNames::ul,
|
HTML::TagNames::ul,
|
||||||
HTML::TagNames::wbr,
|
HTML::TagNames::wbr,
|
||||||
HTML::TagNames::xmp);
|
HTML::TagNames::xmp);
|
||||||
} else if (namespace_ == MUST(FlyString::from_deprecated_fly_string(Namespace::SVG))) {
|
} else if (namespace_ == Namespace::SVG) {
|
||||||
return tag_name.is_one_of(
|
return tag_name.is_one_of(
|
||||||
SVG::TagNames::desc,
|
SVG::TagNames::desc,
|
||||||
SVG::TagNames::foreignObject,
|
SVG::TagNames::foreignObject,
|
||||||
SVG::TagNames::title);
|
SVG::TagNames::title);
|
||||||
} else if (namespace_ == MUST(FlyString::from_deprecated_fly_string(Namespace::MathML))) {
|
} else if (namespace_ == Namespace::MathML) {
|
||||||
return tag_name.is_one_of(
|
return tag_name.is_one_of(
|
||||||
MathML::TagNames::mi,
|
MathML::TagNames::mi,
|
||||||
MathML::TagNames::mo,
|
MathML::TagNames::mo,
|
||||||
|
@ -2127,7 +2127,7 @@ void HTMLParser::handle_in_body(HTMLToken& token)
|
||||||
adjust_mathml_attributes(token);
|
adjust_mathml_attributes(token);
|
||||||
adjust_foreign_attributes(token);
|
adjust_foreign_attributes(token);
|
||||||
|
|
||||||
(void)insert_foreign_element(token, MUST(FlyString::from_deprecated_fly_string(Namespace::MathML)));
|
(void)insert_foreign_element(token, Namespace::MathML);
|
||||||
|
|
||||||
if (token.is_self_closing()) {
|
if (token.is_self_closing()) {
|
||||||
(void)m_stack_of_open_elements.pop();
|
(void)m_stack_of_open_elements.pop();
|
||||||
|
@ -2141,7 +2141,7 @@ void HTMLParser::handle_in_body(HTMLToken& token)
|
||||||
adjust_svg_attributes(token);
|
adjust_svg_attributes(token);
|
||||||
adjust_foreign_attributes(token);
|
adjust_foreign_attributes(token);
|
||||||
|
|
||||||
(void)insert_foreign_element(token, MUST(FlyString::from_deprecated_fly_string(Namespace::SVG)));
|
(void)insert_foreign_element(token, Namespace::SVG);
|
||||||
|
|
||||||
if (token.is_self_closing()) {
|
if (token.is_self_closing()) {
|
||||||
(void)m_stack_of_open_elements.pop();
|
(void)m_stack_of_open_elements.pop();
|
||||||
|
@ -3480,7 +3480,7 @@ void HTMLParser::process_using_the_rules_for_foreign_content(HTMLToken& token)
|
||||||
// While the current node is not a MathML text integration point, an HTML integration point, or an element in the HTML namespace, pop elements from the stack of open elements.
|
// While the current node is not a MathML text integration point, an HTML integration point, or an element in the HTML namespace, pop elements from the stack of open elements.
|
||||||
while (!is_mathml_text_integration_point(current_node())
|
while (!is_mathml_text_integration_point(current_node())
|
||||||
&& !is_html_integration_point(current_node())
|
&& !is_html_integration_point(current_node())
|
||||||
&& current_node().namespace_() != Namespace::HTML) {
|
&& current_node().namespace_uri() != Namespace::HTML) {
|
||||||
(void)m_stack_of_open_elements.pop();
|
(void)m_stack_of_open_elements.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3492,13 +3492,13 @@ void HTMLParser::process_using_the_rules_for_foreign_content(HTMLToken& token)
|
||||||
// Any other start tag
|
// Any other start tag
|
||||||
if (token.is_start_tag()) {
|
if (token.is_start_tag()) {
|
||||||
// If the adjusted current node is an element in the MathML namespace, adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
|
// If the adjusted current node is an element in the MathML namespace, adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
|
||||||
if (adjusted_current_node().namespace_() == Namespace::MathML) {
|
if (adjusted_current_node().namespace_uri() == Namespace::MathML) {
|
||||||
adjust_mathml_attributes(token);
|
adjust_mathml_attributes(token);
|
||||||
}
|
}
|
||||||
// If the adjusted current node is an element in the SVG namespace, and the token's tag name is one of the ones in the first column of the
|
// If the adjusted current node is an element in the SVG namespace, and the token's tag name is one of the ones in the first column of the
|
||||||
// following table, change the tag name to the name given in the corresponding cell in the second column. (This fixes the case of SVG
|
// following table, change the tag name to the name given in the corresponding cell in the second column. (This fixes the case of SVG
|
||||||
// elements that are not all lowercase.)
|
// elements that are not all lowercase.)
|
||||||
else if (adjusted_current_node().namespace_() == Namespace::SVG) {
|
else if (adjusted_current_node().namespace_uri() == Namespace::SVG) {
|
||||||
adjust_svg_tag_names(token);
|
adjust_svg_tag_names(token);
|
||||||
// If the adjusted current node is an element in the SVG namespace, adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
|
// If the adjusted current node is an element in the SVG namespace, adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
|
||||||
adjust_svg_attributes(token);
|
adjust_svg_attributes(token);
|
||||||
|
@ -3514,7 +3514,7 @@ void HTMLParser::process_using_the_rules_for_foreign_content(HTMLToken& token)
|
||||||
if (token.is_self_closing()) {
|
if (token.is_self_closing()) {
|
||||||
|
|
||||||
// -> If the token's tag name is "script", and the new current node is in the SVG namespace
|
// -> If the token's tag name is "script", and the new current node is in the SVG namespace
|
||||||
if (token.tag_name() == SVG::TagNames::script && current_node().namespace_() == Namespace::SVG) {
|
if (token.tag_name() == SVG::TagNames::script && current_node().namespace_uri() == Namespace::SVG) {
|
||||||
// Acknowledge the token's self-closing flag, and then act as described in the steps for a "script" end tag below.
|
// Acknowledge the token's self-closing flag, and then act as described in the steps for a "script" end tag below.
|
||||||
token.acknowledge_self_closing_flag_if_set();
|
token.acknowledge_self_closing_flag_if_set();
|
||||||
goto ScriptEndTag;
|
goto ScriptEndTag;
|
||||||
|
@ -3531,7 +3531,7 @@ void HTMLParser::process_using_the_rules_for_foreign_content(HTMLToken& token)
|
||||||
}
|
}
|
||||||
|
|
||||||
// -> An end tag whose tag name is "script", if the current node is an SVG script element
|
// -> An end tag whose tag name is "script", if the current node is an SVG script element
|
||||||
if (token.is_end_tag() && current_node().namespace_() == Namespace::SVG && current_node().tag_name() == SVG::TagNames::script) {
|
if (token.is_end_tag() && current_node().namespace_uri() == Namespace::SVG && current_node().tag_name() == SVG::TagNames::script) {
|
||||||
ScriptEndTag:
|
ScriptEndTag:
|
||||||
// Pop the current node off the stack of open elements.
|
// Pop the current node off the stack of open elements.
|
||||||
(void)m_stack_of_open_elements.pop();
|
(void)m_stack_of_open_elements.pop();
|
||||||
|
@ -3587,7 +3587,7 @@ void HTMLParser::process_using_the_rules_for_foreign_content(HTMLToken& token)
|
||||||
node = m_stack_of_open_elements.elements().at(i - 1).ptr();
|
node = m_stack_of_open_elements.elements().at(i - 1).ptr();
|
||||||
|
|
||||||
// 6. If node is not an element in the HTML namespace, return to the step labeled loop.
|
// 6. If node is not an element in the HTML namespace, return to the step labeled loop.
|
||||||
if (node->namespace_() != Namespace::HTML)
|
if (node->namespace_uri() != Namespace::HTML)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// 7. Otherwise, process the token according to the rules given in the section corresponding to the current insertion mode in HTML content.
|
// 7. Otherwise, process the token according to the rules given in the section corresponding to the current insertion mode in HTML content.
|
||||||
|
@ -3772,7 +3772,7 @@ Vector<JS::Handle<DOM::Node>> HTMLParser::parse_html_fragment(DOM::Element& cont
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. Let root be a new html element with no attributes.
|
// 5. Let root be a new html element with no attributes.
|
||||||
auto root = create_element(context_element.document(), HTML::TagNames::html, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto root = create_element(context_element.document(), HTML::TagNames::html, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
|
|
||||||
// 6. Append the element root to the Document node created above.
|
// 6. Append the element root to the Document node created above.
|
||||||
MUST(temp_document->append_child(root));
|
MUST(temp_document->append_child(root));
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
struct Attribute {
|
struct Attribute {
|
||||||
DeprecatedString prefix;
|
DeprecatedString prefix;
|
||||||
FlyString local_name;
|
FlyString local_name;
|
||||||
DeprecatedString namespace_;
|
FlyString namespace_;
|
||||||
String value;
|
String value;
|
||||||
Position name_start_position;
|
Position name_start_position;
|
||||||
Position value_start_position;
|
Position value_start_position;
|
||||||
|
@ -290,7 +290,7 @@ public:
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void adjust_foreign_attribute(FlyString const& old_name, DeprecatedFlyString const& prefix, FlyString const& local_name, DeprecatedFlyString const& namespace_)
|
void adjust_foreign_attribute(FlyString const& old_name, DeprecatedFlyString const& prefix, FlyString const& local_name, FlyString const& namespace_)
|
||||||
{
|
{
|
||||||
VERIFY(is_start_tag() || is_end_tag());
|
VERIFY(is_start_tag() || is_end_tag());
|
||||||
for_each_attribute([&](Attribute& attribute) {
|
for_each_attribute([&](Attribute& attribute) {
|
||||||
|
|
|
@ -421,7 +421,7 @@ _StartOfFunction:
|
||||||
if (consume_next_if_match("[CDATA["sv)) {
|
if (consume_next_if_match("[CDATA["sv)) {
|
||||||
// We keep the parser optional so that syntax highlighting can be lexer-only.
|
// We keep the parser optional so that syntax highlighting can be lexer-only.
|
||||||
// The parser registers itself with the lexer it creates.
|
// The parser registers itself with the lexer it creates.
|
||||||
if (m_parser != nullptr && m_parser->adjusted_current_node().namespace_() != Namespace::HTML) {
|
if (m_parser != nullptr && m_parser->adjusted_current_node().namespace_uri() != Namespace::HTML) {
|
||||||
SWITCH_TO(CDATASection);
|
SWITCH_TO(CDATASection);
|
||||||
} else {
|
} else {
|
||||||
create_new_token(HTMLToken::Type::Comment);
|
create_new_token(HTMLToken::Type::Comment);
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
namespace Web::Namespace {
|
namespace Web::Namespace {
|
||||||
|
|
||||||
#define __ENUMERATE_NAMESPACE(name, namespace_) DeprecatedFlyString name;
|
#define __ENUMERATE_NAMESPACE(name, namespace_) FlyString name;
|
||||||
ENUMERATE_NAMESPACES
|
ENUMERATE_NAMESPACES
|
||||||
#undef __ENUMERATE_NAMESPACE
|
#undef __ENUMERATE_NAMESPACE
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ void initialize_strings()
|
||||||
VERIFY(!s_initialized);
|
VERIFY(!s_initialized);
|
||||||
|
|
||||||
#define __ENUMERATE_NAMESPACE(name, namespace_) \
|
#define __ENUMERATE_NAMESPACE(name, namespace_) \
|
||||||
name = namespace_;
|
name = namespace_##_fly_string;
|
||||||
ENUMERATE_NAMESPACES
|
ENUMERATE_NAMESPACES
|
||||||
#undef __ENUMERATE_NAMESPACE
|
#undef __ENUMERATE_NAMESPACE
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <AK/DeprecatedFlyString.h>
|
|
||||||
#include <AK/Error.h>
|
#include <AK/Error.h>
|
||||||
|
#include <AK/FlyString.h>
|
||||||
|
|
||||||
namespace Web::Namespace {
|
namespace Web::Namespace {
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ namespace Web::Namespace {
|
||||||
__ENUMERATE_NAMESPACE(XML, "http://www.w3.org/XML/1998/namespace") \
|
__ENUMERATE_NAMESPACE(XML, "http://www.w3.org/XML/1998/namespace") \
|
||||||
__ENUMERATE_NAMESPACE(XMLNS, "http://www.w3.org/2000/xmlns/")
|
__ENUMERATE_NAMESPACE(XMLNS, "http://www.w3.org/2000/xmlns/")
|
||||||
|
|
||||||
#define __ENUMERATE_NAMESPACE(name, namespace_) extern DeprecatedFlyString name;
|
#define __ENUMERATE_NAMESPACE(name, namespace_) extern FlyString name;
|
||||||
ENUMERATE_NAMESPACES
|
ENUMERATE_NAMESPACES
|
||||||
#undef __ENUMERATE_NAMESPACE
|
#undef __ENUMERATE_NAMESPACE
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ Response capture_element_screenshot(Painter const& painter, Page& page, DOM::Ele
|
||||||
auto viewport_rect = page.top_level_traversable()->viewport_rect();
|
auto viewport_rect = page.top_level_traversable()->viewport_rect();
|
||||||
rect.intersect(page.enclosing_device_rect(viewport_rect).to_type<int>());
|
rect.intersect(page.enclosing_device_rect(viewport_rect).to_type<int>());
|
||||||
|
|
||||||
auto canvas_element = DOM::create_element(element.document(), HTML::TagNames::canvas, MUST(FlyString::from_deprecated_fly_string(Namespace::HTML))).release_value_but_fixme_should_propagate_errors();
|
auto canvas_element = DOM::create_element(element.document(), HTML::TagNames::canvas, Namespace::HTML).release_value_but_fixme_should_propagate_errors();
|
||||||
auto& canvas = verify_cast<HTML::HTMLCanvasElement>(*canvas_element);
|
auto& canvas = verify_cast<HTML::HTMLCanvasElement>(*canvas_element);
|
||||||
|
|
||||||
if (!canvas.create_bitmap(rect.width(), rect.height())) {
|
if (!canvas.create_bitmap(rect.width(), rect.height())) {
|
||||||
|
|
|
@ -57,7 +57,7 @@ void XMLDocumentBuilder::element_start(const XML::Name& name, HashMap<XML::Name,
|
||||||
|
|
||||||
if (auto it = attributes.find("xmlns"); it != attributes.end()) {
|
if (auto it = attributes.find("xmlns"); it != attributes.end()) {
|
||||||
m_namespace_stack.append({ m_namespace, 1 });
|
m_namespace_stack.append({ m_namespace, 1 });
|
||||||
m_namespace = it->value;
|
m_namespace = MUST(FlyString::from_deprecated_fly_string(it->value));
|
||||||
} else {
|
} else {
|
||||||
m_namespace_stack.last().depth += 1;
|
m_namespace_stack.last().depth += 1;
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ void XMLDocumentBuilder::element_start(const XML::Name& name, HashMap<XML::Name,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto node = DOM::create_element(m_document, MUST(FlyString::from_deprecated_fly_string(name)), MUST(FlyString::from_deprecated_fly_string(m_namespace))).release_value_but_fixme_should_propagate_errors();
|
auto node = DOM::create_element(m_document, MUST(FlyString::from_deprecated_fly_string(name)), m_namespace).release_value_but_fixme_should_propagate_errors();
|
||||||
|
|
||||||
// When an XML parser with XML scripting support enabled creates a script element,
|
// When an XML parser with XML scripting support enabled creates a script element,
|
||||||
// it must have its parser document set and its "force async" flag must be unset.
|
// it must have its parser document set and its "force async" flag must be unset.
|
||||||
|
|
|
@ -42,10 +42,10 @@ private:
|
||||||
XMLScriptingSupport m_scripting_support { XMLScriptingSupport::Enabled };
|
XMLScriptingSupport m_scripting_support { XMLScriptingSupport::Enabled };
|
||||||
bool m_has_error { false };
|
bool m_has_error { false };
|
||||||
StringBuilder text_builder;
|
StringBuilder text_builder;
|
||||||
DeprecatedFlyString m_namespace {};
|
FlyString m_namespace;
|
||||||
|
|
||||||
struct NamespaceStackEntry {
|
struct NamespaceStackEntry {
|
||||||
DeprecatedFlyString ns;
|
FlyString ns;
|
||||||
size_t depth;
|
size_t depth;
|
||||||
};
|
};
|
||||||
Vector<NamespaceStackEntry, 2> m_namespace_stack;
|
Vector<NamespaceStackEntry, 2> m_namespace_stack;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue