ladybird/Userland/Libraries/LibWeb/Loader/FrameLoader.h
Idan Horowitz 497dd5b354 LibWeb: Set response header cookies on redirects
Since we were previously relying on Document::set_cookie in order to
set cookies received as a 'Set-Cookie' response header, we would ignore
any response header cookies in redirect (status code 3xx) responses.

While this behaviour is not strictly enforced in the specification,
most major browsers do set cookies in redirect responses, and some
sites (e.g. Cookie Clicker) rely on this behaviour.

Since cookies are stored per-site and not per-document, this behaviour
is achieved by simply decoupling the cookie set mechanism from it.
2022-02-12 16:15:56 +00:00

53 lines
1.3 KiB
C++

/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Forward.h>
#include <LibWeb/Forward.h>
#include <LibWeb/Loader/Resource.h>
namespace Web {
constexpr size_t maximum_redirects_allowed = 20;
class FrameLoader final
: public ResourceClient {
public:
enum class Type {
Navigation,
Reload,
IFrame,
};
explicit FrameLoader(HTML::BrowsingContext&);
~FrameLoader();
bool load(const AK::URL&, Type);
bool load(LoadRequest&, Type);
void load_html(StringView, const AK::URL&);
HTML::BrowsingContext& browsing_context() { return m_browsing_context; }
HTML::BrowsingContext const& browsing_context() const { return m_browsing_context; }
private:
// ^ResourceClient
virtual void resource_did_load() override;
virtual void resource_did_fail() override;
void load_error_page(const AK::URL& failed_url, const String& error_message);
void load_favicon(RefPtr<Gfx::Bitmap> bitmap = nullptr);
bool parse_document(DOM::Document&, const ByteBuffer& data);
void store_response_cookies(AK::URL const& url, String const& cookies);
HTML::BrowsingContext& m_browsing_context;
size_t m_redirects_count { 0 };
};
}