From 20132da88d0a4b9fa5fb462a6a143c7fb6993040 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 15 Mar 2023 12:28:33 +0100 Subject: [PATCH] LibWeb: Don't treat erroring subresource loads as success If a subresource fails to load, we don't care that we got some custom 404 page. The subresource should still be considered failed. This is an ad-hoc solution that unbreaks Acid2. This code will eventually be replaced by fetch mechanisms. --- Userland/Libraries/LibWeb/Loader/FrameLoader.cpp | 2 ++ Userland/Libraries/LibWeb/Loader/LoadRequest.h | 6 ++++++ Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp b/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp index 0b5238564a..c1d5a207cd 100644 --- a/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp +++ b/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp @@ -212,6 +212,8 @@ bool FrameLoader::load(LoadRequest& request, Type type) return false; } + request.set_main_resource(true); + auto& url = request.url(); if (type == Type::Navigation || type == Type::Reload || type == Type::Redirect) { diff --git a/Userland/Libraries/LibWeb/Loader/LoadRequest.h b/Userland/Libraries/LibWeb/Loader/LoadRequest.h index ff21d0dc4a..ad8545d6c5 100644 --- a/Userland/Libraries/LibWeb/Loader/LoadRequest.h +++ b/Userland/Libraries/LibWeb/Loader/LoadRequest.h @@ -24,6 +24,11 @@ public: static LoadRequest create_for_url_on_page(const AK::URL& url, Page* page); + // The main resource is the file being displayed in a frame (unlike subresources like images, scripts, etc.) + // If a main resource fails with an HTTP error, we may still display its content if non-empty, e.g a custom 404 page. + bool is_main_resource() const { return m_main_resource; } + void set_main_resource(bool b) { m_main_resource = b; } + bool is_valid() const { return m_url.is_valid(); } const AK::URL& url() const { return m_url; } @@ -75,6 +80,7 @@ private: ByteBuffer m_body; Core::ElapsedTimer m_load_timer; Optional m_page; + bool m_main_resource { false }; }; } diff --git a/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp b/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp index bfa95459fd..f49ee4e81c 100644 --- a/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp +++ b/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp @@ -322,7 +322,7 @@ void ResourceLoader::load(LoadRequest& request, Function= 400 && *status_code <= 599 && payload.is_empty())) { + if (!success || (status_code.has_value() && *status_code >= 400 && *status_code <= 599 && (payload.is_empty() || !request.is_main_resource()))) { StringBuilder error_builder; if (status_code.has_value()) error_builder.appendff("Load failed: {}", *status_code);