ladybird/Libraries/LibWeb/HTML/HTMLStyleElement.h
Andreas Kling 0c0650e60a LibWeb: Implement more of the "script-blocking style sheet" mechanism
The basic idea is that style sheets can block script execution under
some circumstances. With this commit, we now handle the simplest cases
where a parser-inserted link element gets to download its style sheet
before script execution continues.

This improves performance on Speedometer 3 where JavaScript APIs that
depend on layout results (like Element.scrollIntoView()) would get
called too early (before the relevant CSS was downloaded), and so we'd
perform premature layout work. This work then had to be redone after
downloading the CSS anyway, wasting time.

Note that our Text/input/link-re-enable-crash.html test had to be
tweaked after these changes, since it relied on the old, incorrect,
behavior where scripts would run before downloading CSS.
2025-04-20 14:54:21 +02:00

47 lines
1.4 KiB
C++

/*
* Copyright (c) 2018-2021, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2021, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWeb/DOM/StyleElementUtils.h>
#include <LibWeb/HTML/HTMLElement.h>
namespace Web::HTML {
class HTMLStyleElement final : public HTMLElement {
WEB_PLATFORM_OBJECT(HTMLStyleElement, HTMLElement);
GC_DECLARE_ALLOCATOR(HTMLStyleElement);
public:
virtual ~HTMLStyleElement() override;
virtual void children_changed(ChildrenChangedMetadata const*) override;
virtual void inserted() override;
virtual void removed_from(Node* old_parent, Node& old_root) override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_) override;
bool disabled();
void set_disabled(bool disabled);
CSS::CSSStyleSheet* sheet();
CSS::CSSStyleSheet const* sheet() const;
virtual bool contributes_a_script_blocking_style_sheet() const final;
private:
HTMLStyleElement(DOM::Document&, DOM::QualifiedName);
// ^DOM::Node
virtual bool is_html_style_element() const override { return true; }
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
DOM::StyleElementUtils m_style_element_utils;
};
}