diff --git a/Userland/Libraries/LibWeb/CSS/CSSImportRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSImportRule.cpp index 2c0485f14b..80822dfa43 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSImportRule.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSImportRule.cpp @@ -1,18 +1,27 @@ /* * Copyright (c) 2021, the SerenityOS developers. + * Copyright (c) 2021, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include -#include +#include +#include +#include namespace Web::CSS { -CSSImportRule::CSSImportRule(AK::URL url) +CSSImportRule::CSSImportRule(AK::URL url, DOM::Document& document) : m_url(move(url)) + , m_document(document) { + dbgln_if(CSS_LOADER_DEBUG, "CSSImportRule: Loading import URL: {}", m_url); + auto request = LoadRequest::create_for_url_on_page(m_url, document.page()); + set_resource(ResourceLoader::the().load_resource(Resource::Type::Generic, request)); + m_document_load_event_delayer.emplace(m_document); } CSSImportRule::~CSSImportRule() @@ -42,4 +51,32 @@ String CSSImportRule::serialized() const return builder.to_string(); } +void CSSImportRule::resource_did_fail() +{ + dbgln_if(CSS_LOADER_DEBUG, "CSSImportRule: Resource did fail. URL: {}", resource()->url()); + + m_document_load_event_delayer.clear(); +} + +void CSSImportRule::resource_did_load() +{ + VERIFY(resource()); + + m_document_load_event_delayer.clear(); + + if (!resource()->has_encoded_data()) { + dbgln_if(CSS_LOADER_DEBUG, "CSSImportRule: Resource did load, no encoded data. URL: {}", resource()->url()); + } else { + dbgln_if(CSS_LOADER_DEBUG, "CSSImportRule: Resource did load, has encoded data. URL: {}", resource()->url()); + } + + auto sheet = parse_css(CSS::ParsingContext(m_document), resource()->encoded_data()); + if (!sheet) { + dbgln_if(CSS_LOADER_DEBUG, "CSSImportRule: Failed to parse stylesheet: {}", resource()->url()); + return; + } + + m_style_sheet = move(sheet); +} + } diff --git a/Userland/Libraries/LibWeb/CSS/CSSImportRule.h b/Userland/Libraries/LibWeb/CSS/CSSImportRule.h index f633701037..5ab22f9d8d 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSImportRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSImportRule.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2021, the SerenityOS developers. + * Copyright (c) 2021, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ @@ -9,17 +10,20 @@ #include #include #include +#include namespace Web::CSS { -class CSSImportRule : public CSSRule { +class CSSImportRule + : public CSSRule + , public ResourceClient { AK_MAKE_NONCOPYABLE(CSSImportRule); AK_MAKE_NONMOVABLE(CSSImportRule); public: - static NonnullRefPtr create(AK::URL url) + static NonnullRefPtr create(AK::URL url, DOM::Document& document) { - return adopt_ref(*new CSSImportRule(move(url))); + return adopt_ref(*new CSSImportRule(move(url), document)); } ~CSSImportRule(); @@ -35,11 +39,17 @@ public: virtual Type type() const { return Type::Import; }; private: - explicit CSSImportRule(AK::URL); + explicit CSSImportRule(AK::URL, DOM::Document&); virtual String serialized() const override; + // ^ResourceClient + virtual void resource_did_fail() override; + virtual void resource_did_load() override; + AK::URL m_url; + DOM::Document& m_document; + Optional m_document_load_event_delayer; RefPtr m_style_sheet; }; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 97188ede9b..498643eaa6 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1747,7 +1747,7 @@ RefPtr Parser::convert_to_rule(NonnullRefPtr rule) } if (url.has_value()) - return CSSImportRule::create(url.value()); + return CSSImportRule::create(url.value(), const_cast(*m_context.document())); else dbgln("Unable to parse url from @import rule");