From 9396a643b8b78c7dc7ecad16583f25f2417257f0 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 8 Dec 2024 22:18:33 -0500 Subject: [PATCH] LibWeb: Ensure FilteredResponse setters forward to the base class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The spec for filtered responses states: Unless stated otherwise a filtered response’s associated concepts (such as its body) refer to the associated concepts of its internal response. This includes setting its associated concepts. In particular, when the filtered response's body is set upon fetching a request with integrity metadata, we must set the internal response's body instead. Further restrictions that apply to filtered response subclasses (such as opaque filtered responses having a status code of 0) are already implemented. --- .../Fetch/Infrastructure/HTTP/Responses.cpp | 2 - .../Fetch/Infrastructure/HTTP/Responses.h | 62 ++++++++++++------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp b/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp index 5b39a61cf67..d1a5e707d9c 100644 --- a/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp +++ b/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp @@ -422,7 +422,6 @@ void OpaqueFilteredResponse::visit_edges(JS::Cell::Visitor& visitor) { Base::visit_edges(visitor); visitor.visit(m_header_list); - visitor.visit(m_body); } GC::Ref OpaqueRedirectFilteredResponse::create(JS::VM& vm, GC::Ref internal_response) @@ -442,7 +441,6 @@ void OpaqueRedirectFilteredResponse::visit_edges(JS::Cell::Visitor& visitor) { Base::visit_edges(visitor); visitor.visit(m_header_list); - visitor.visit(m_body); } } diff --git a/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.h b/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.h index 0eedb9eb628..2148a79839c 100644 --- a/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.h +++ b/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.h @@ -67,42 +67,41 @@ public: void set_type(Type type) { m_type = type; } [[nodiscard]] virtual bool aborted() const { return m_aborted; } - void set_aborted(bool aborted) { m_aborted = aborted; } + virtual void set_aborted(bool aborted) { m_aborted = aborted; } [[nodiscard]] virtual Vector const& url_list() const { return m_url_list; } [[nodiscard]] virtual Vector& url_list() { return m_url_list; } - void set_url_list(Vector url_list) { m_url_list = move(url_list); } + virtual void set_url_list(Vector url_list) { m_url_list = move(url_list); } [[nodiscard]] virtual Status status() const { return m_status; } - void set_status(Status status) { m_status = status; } + virtual void set_status(Status status) { m_status = status; } [[nodiscard]] virtual ReadonlyBytes status_message() const { return m_status_message; } - void set_status_message(ByteBuffer status_message) { m_status_message = move(status_message); } + virtual void set_status_message(ByteBuffer status_message) { m_status_message = move(status_message); } [[nodiscard]] virtual GC::Ref header_list() const { return m_header_list; } - void set_header_list(GC::Ref header_list) { m_header_list = header_list; } + virtual void set_header_list(GC::Ref header_list) { m_header_list = header_list; } - [[nodiscard]] virtual GC::Ptr const& body() const { return m_body; } - [[nodiscard]] virtual GC::Ptr& body() { return m_body; } - void set_body(GC::Ptr body) { m_body = move(body); } + [[nodiscard]] virtual GC::Ptr body() const { return m_body; } + virtual void set_body(GC::Ptr body) { m_body = body; } [[nodiscard]] virtual Optional const& cache_state() const { return m_cache_state; } - void set_cache_state(Optional cache_state) { m_cache_state = move(cache_state); } + virtual void set_cache_state(Optional cache_state) { m_cache_state = move(cache_state); } [[nodiscard]] virtual Vector const& cors_exposed_header_name_list() const { return m_cors_exposed_header_name_list; } - void set_cors_exposed_header_name_list(Vector cors_exposed_header_name_list) { m_cors_exposed_header_name_list = move(cors_exposed_header_name_list); } + virtual void set_cors_exposed_header_name_list(Vector cors_exposed_header_name_list) { m_cors_exposed_header_name_list = move(cors_exposed_header_name_list); } [[nodiscard]] virtual bool range_requested() const { return m_range_requested; } - void set_range_requested(bool range_requested) { m_range_requested = range_requested; } + virtual void set_range_requested(bool range_requested) { m_range_requested = range_requested; } [[nodiscard]] virtual bool request_includes_credentials() const { return m_request_includes_credentials; } - void set_request_includes_credentials(bool request_includes_credentials) { m_request_includes_credentials = request_includes_credentials; } + virtual void set_request_includes_credentials(bool request_includes_credentials) { m_request_includes_credentials = request_includes_credentials; } [[nodiscard]] virtual bool timing_allow_passed() const { return m_timing_allow_passed; } - void set_timing_allow_passed(bool timing_allow_passed) { m_timing_allow_passed = timing_allow_passed; } + virtual void set_timing_allow_passed(bool timing_allow_passed) { m_timing_allow_passed = timing_allow_passed; } [[nodiscard]] virtual BodyInfo const& body_info() const { return m_body_info; } - void set_body_info(BodyInfo body_info) { m_body_info = body_info; } + virtual void set_body_info(BodyInfo body_info) { m_body_info = body_info; } [[nodiscard]] bool has_cross_origin_redirects() const { return m_has_cross_origin_redirects; } void set_has_cross_origin_redirects(bool has_cross_origin_redirects) { m_has_cross_origin_redirects = has_cross_origin_redirects; } @@ -216,20 +215,43 @@ public: virtual ~FilteredResponse() = 0; [[nodiscard]] virtual Type type() const override { return m_internal_response->type(); } + [[nodiscard]] virtual bool aborted() const override { return m_internal_response->aborted(); } + virtual void set_aborted(bool aborted) override { m_internal_response->set_aborted(aborted); } + [[nodiscard]] virtual Vector const& url_list() const override { return m_internal_response->url_list(); } [[nodiscard]] virtual Vector& url_list() override { return m_internal_response->url_list(); } + virtual void set_url_list(Vector url_list) override { m_internal_response->set_url_list(move(url_list)); } + [[nodiscard]] virtual Status status() const override { return m_internal_response->status(); } + virtual void set_status(Status status) override { m_internal_response->set_status(status); } + [[nodiscard]] virtual ReadonlyBytes status_message() const override { return m_internal_response->status_message(); } + virtual void set_status_message(ByteBuffer status_message) override { m_internal_response->set_status_message(move(status_message)); } + [[nodiscard]] virtual GC::Ref header_list() const override { return m_internal_response->header_list(); } - [[nodiscard]] virtual GC::Ptr const& body() const override { return m_internal_response->body(); } - [[nodiscard]] virtual GC::Ptr& body() override { return m_internal_response->body(); } + virtual void set_header_list(GC::Ref header_list) override { m_internal_response->set_header_list(header_list); } + + [[nodiscard]] virtual GC::Ptr body() const override { return m_internal_response->body(); } + virtual void set_body(GC::Ptr body) override { m_internal_response->set_body(body); } + [[nodiscard]] virtual Optional const& cache_state() const override { return m_internal_response->cache_state(); } + virtual void set_cache_state(Optional cache_state) override { m_internal_response->set_cache_state(move(cache_state)); } + [[nodiscard]] virtual Vector const& cors_exposed_header_name_list() const override { return m_internal_response->cors_exposed_header_name_list(); } + virtual void set_cors_exposed_header_name_list(Vector cors_exposed_header_name_list) override { m_internal_response->set_cors_exposed_header_name_list(move(cors_exposed_header_name_list)); } + [[nodiscard]] virtual bool range_requested() const override { return m_internal_response->range_requested(); } + virtual void set_range_requested(bool range_requested) override { m_internal_response->set_range_requested(range_requested); } + [[nodiscard]] virtual bool request_includes_credentials() const override { return m_internal_response->request_includes_credentials(); } + virtual void set_request_includes_credentials(bool request_includes_credentials) override { m_internal_response->set_request_includes_credentials(request_includes_credentials); } + [[nodiscard]] virtual bool timing_allow_passed() const override { return m_internal_response->timing_allow_passed(); } + virtual void set_timing_allow_passed(bool timing_allow_passed) override { m_internal_response->set_timing_allow_passed(timing_allow_passed); } + [[nodiscard]] virtual BodyInfo const& body_info() const override { return m_internal_response->body_info(); } + virtual void set_body_info(BodyInfo body_info) override { m_internal_response->set_body_info(move(body_info)); } [[nodiscard]] GC::Ref internal_response() const { return m_internal_response; } @@ -293,8 +315,7 @@ public: [[nodiscard]] virtual Status status() const override { return 0; } [[nodiscard]] virtual ReadonlyBytes status_message() const override { return {}; } [[nodiscard]] virtual GC::Ref header_list() const override { return m_header_list; } - [[nodiscard]] virtual GC::Ptr const& body() const override { return m_body; } - [[nodiscard]] virtual GC::Ptr& body() override { return m_body; } + [[nodiscard]] virtual GC::Ptr body() const override { return nullptr; } private: OpaqueFilteredResponse(GC::Ref, GC::Ref); @@ -303,7 +324,6 @@ private: Vector m_url_list; GC::Ref m_header_list; - GC::Ptr m_body; }; // https://fetch.spec.whatwg.org/#concept-filtered-response-opaque-redirect @@ -318,8 +338,7 @@ public: [[nodiscard]] virtual Status status() const override { return 0; } [[nodiscard]] virtual ReadonlyBytes status_message() const override { return {}; } [[nodiscard]] virtual GC::Ref header_list() const override { return m_header_list; } - [[nodiscard]] virtual GC::Ptr const& body() const override { return m_body; } - [[nodiscard]] virtual GC::Ptr& body() override { return m_body; } + [[nodiscard]] virtual GC::Ptr body() const override { return nullptr; } private: OpaqueRedirectFilteredResponse(GC::Ref, GC::Ref); @@ -327,6 +346,5 @@ private: virtual void visit_edges(JS::Cell::Visitor&) override; GC::Ref m_header_list; - GC::Ptr m_body; }; }