LibWeb: Only react to link element attribute changes when BC connected

Link elements that aren't "browsing-context connected" should not
trigger a resource fetch when their attributes change.

This fixes an issue where we'd waste time by loading every style sheet
twice! :^)
This commit is contained in:
Andreas Kling 2024-04-26 09:29:27 +02:00
commit a4625e3943
Notes: sideshowbarker 2024-07-17 10:31:19 +09:00
3 changed files with 22 additions and 11 deletions

View file

@ -335,6 +335,13 @@ bool Node::is_connected() const
return shadow_including_root().is_document(); return shadow_including_root().is_document();
} }
// https://html.spec.whatwg.org/multipage/infrastructure.html#browsing-context-connected
bool Node::is_browsing_context_connected() const
{
// A node is browsing-context connected when it is connected and its shadow-including root's browsing context is non-null.
return is_connected() && shadow_including_root().document().browsing_context();
}
// https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity // https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity
WebIDL::ExceptionOr<void> Node::ensure_pre_insertion_validity(JS::NonnullGCPtr<Node> node, JS::GCPtr<Node> child) const WebIDL::ExceptionOr<void> Node::ensure_pre_insertion_validity(JS::NonnullGCPtr<Node> node, JS::GCPtr<Node> child) const
{ {

View file

@ -185,6 +185,8 @@ public:
bool is_connected() const; bool is_connected() const;
[[nodiscard]] bool is_browsing_context_connected() const;
Node* parent_node() { return parent(); } Node* parent_node() { return parent(); }
Node const* parent_node() const { return parent(); } Node const* parent_node() const { return parent(); }

View file

@ -134,6 +134,8 @@ void HTMLLinkElement::attribute_changed(FlyString const& name, Optional<String>
// https://html.spec.whatwg.org/multipage/links.html#link-type-stylesheet:fetch-and-process-the-linked-resource // https://html.spec.whatwg.org/multipage/links.html#link-type-stylesheet:fetch-and-process-the-linked-resource
// The appropriate times to fetch and process this type of link are: // The appropriate times to fetch and process this type of link are:
if ( if (
is_browsing_context_connected()
&& (
// AD-HOC: When the rel attribute changes // AD-HOC: When the rel attribute changes
name == AttributeNames::rel || name == AttributeNames::rel ||
// - When the href attribute of the link element of an external resource link that is already browsing-context connected is changed. // - When the href attribute of the link element of an external resource link that is already browsing-context connected is changed.
@ -144,7 +146,7 @@ void HTMLLinkElement::attribute_changed(FlyString const& name, Optional<String>
name == AttributeNames::crossorigin name == AttributeNames::crossorigin
// FIXME: - When the type attribute of the link element of an external resource link that is already browsing-context connected is set or changed to a value that does not or no longer matches the Content-Type metadata of the previous obtained external resource, if any. // FIXME: - When the type attribute of the link element of an external resource link that is already browsing-context connected is set or changed to a value that does not or no longer matches the Content-Type metadata of the previous obtained external resource, if any.
// FIXME: - When the type attribute of the link element of an external resource link that is already browsing-context connected, but was previously not obtained due to the type attribute specifying an unsupported type, is removed or changed. // FIXME: - When the type attribute of the link element of an external resource link that is already browsing-context connected, but was previously not obtained due to the type attribute specifying an unsupported type, is removed or changed.
) { )) {
fetch_and_process_linked_resource(); fetch_and_process_linked_resource();
} }
} }