diff --git a/Libraries/LibWeb/DOM/HTMLLinkElement.cpp b/Libraries/LibWeb/DOM/HTMLLinkElement.cpp index c7c635be441..21337282030 100644 --- a/Libraries/LibWeb/DOM/HTMLLinkElement.cpp +++ b/Libraries/LibWeb/DOM/HTMLLinkElement.cpp @@ -29,8 +29,8 @@ #include #include #include -#include #include +#include namespace Web { @@ -43,24 +43,40 @@ HTMLLinkElement::~HTMLLinkElement() { } -void HTMLLinkElement::inserted_into(Node&) +void HTMLLinkElement::inserted_into(Node& node) { - if (rel() == "stylesheet") { - URL url = document().complete_url(href()); - ResourceLoader::the().load(url, [&](auto data, auto&) { - if (data.is_null()) { - dbg() << "HTMLLinkElement: Failed to load stylesheet: " << href(); - return; - } - auto sheet = parse_css(data); - if (!sheet) { - dbg() << "HTMLLinkElement: Failed to parse stylesheet: " << href(); - return; - } - document().add_sheet(*sheet); - document().update_style(); - }); + HTMLElement::inserted_into(node); + + if (rel() == "stylesheet") + load_stylesheet(document().complete_url(href())); +} + +void HTMLLinkElement::resource_did_fail() +{ +} + +void HTMLLinkElement::resource_did_load() +{ + ASSERT(resource()); + if (!resource()->has_encoded_data()) + return; + + dbg() << "HTMLLinkElement: Resource did load, looks good! " << href(); + + auto sheet = parse_css(resource()->encoded_data()); + if (!sheet) { + dbg() << "HTMLLinkElement: Failed to parse stylesheet: " << href(); + return; } + document().add_sheet(*sheet); + document().update_style(); +} + +void HTMLLinkElement::load_stylesheet(const URL& url) +{ + LoadRequest request; + request.set_url(url); + set_resource(ResourceLoader::the().load_resource(request)); } } diff --git a/Libraries/LibWeb/DOM/HTMLLinkElement.h b/Libraries/LibWeb/DOM/HTMLLinkElement.h index af44746b8cd..fcd28d96109 100644 --- a/Libraries/LibWeb/DOM/HTMLLinkElement.h +++ b/Libraries/LibWeb/DOM/HTMLLinkElement.h @@ -27,10 +27,13 @@ #pragma once #include +#include namespace Web { -class HTMLLinkElement final : public HTMLElement { +class HTMLLinkElement final + : public HTMLElement + , public ResourceClient { public: HTMLLinkElement(Document&, const FlyString& tag_name); virtual ~HTMLLinkElement() override; @@ -40,6 +43,13 @@ public: String rel() const { return attribute("rel"); } String type() const { return attribute("type"); } String href() const { return attribute("href"); } + +private: + // ^ResourceClient + virtual void resource_did_fail() override; + virtual void resource_did_load() override; + + void load_stylesheet(const URL&); }; template<>