mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-25 14:05:15 +00:00
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.
47 lines
1.4 KiB
C++
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;
|
|
};
|
|
|
|
}
|