mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 00:50:22 +00:00
LibWeb: Remove FrameLoader
This class is no longer used, now that we've moved to navigables.
This commit is contained in:
parent
693d602b2f
commit
51caa14381
Notes:
sideshowbarker
2024-07-16 23:59:28 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/51caa14381 Pull-request: https://github.com/SerenityOS/serenity/pull/21167 Reviewed-by: https://github.com/AtkinsSJ ✅
26 changed files with 47 additions and 458 deletions
|
@ -21,7 +21,7 @@
|
|||
#include <LibWeb/Bindings/MainThreadVM.h>
|
||||
#include <LibWeb/HTML/Window.h>
|
||||
#include <LibWeb/Loader/ContentFilter.h>
|
||||
#include <LibWeb/Loader/FrameLoader.h>
|
||||
#include <LibWeb/Loader/FileDirectoryLoader.h>
|
||||
#include <LibWeb/Loader/ResourceLoader.h>
|
||||
#include <LibWeb/PermissionsPolicy/AutoplayAllowlist.h>
|
||||
#include <LibWeb/Platform/AudioCodecPluginAgnostic.h>
|
||||
|
@ -59,8 +59,6 @@ ErrorOr<int> service_main(int ipc_socket, int fd_passing_socket)
|
|||
return Error::from_string_literal("Don't know how to initialize audio in this configuration!");
|
||||
});
|
||||
|
||||
Web::FrameLoader::set_default_favicon_path(DeprecatedString::formatted("{}/res/icons/16x16/app-browser.png", s_serenity_resource_root));
|
||||
|
||||
auto request_server_client = TRY(bind_request_server_service());
|
||||
Web::ResourceLoader::initialize(TRY(WebView::RequestServerAdapter::try_create(move(request_server_client))));
|
||||
|
||||
|
@ -72,9 +70,8 @@ ErrorOr<int> service_main(int ipc_socket, int fd_passing_socket)
|
|||
Web::HTML::Window::set_internals_object_exposed(is_layout_test_mode);
|
||||
Web::Platform::FontPlugin::install(*new Ladybird::FontPlugin(is_layout_test_mode));
|
||||
|
||||
Web::FrameLoader::set_resource_directory_url(DeprecatedString::formatted("file://{}/res", s_serenity_resource_root));
|
||||
Web::FrameLoader::set_error_page_url(DeprecatedString::formatted("file://{}/res/html/error.html", s_serenity_resource_root));
|
||||
Web::FrameLoader::set_directory_page_url(DeprecatedString::formatted("file://{}/res/html/directory.html", s_serenity_resource_root));
|
||||
Web::set_resource_directory_url(DeprecatedString::formatted("file://{}/res", s_serenity_resource_root));
|
||||
Web::set_directory_page_url(DeprecatedString::formatted("file://{}/res/html/directory.html", s_serenity_resource_root));
|
||||
|
||||
TRY(Web::Bindings::initialize_main_thread_vm());
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#include <LibWeb/Bindings/MainThreadVM.h>
|
||||
#include <LibWeb/HTML/Window.h>
|
||||
#include <LibWeb/Loader/ContentFilter.h>
|
||||
#include <LibWeb/Loader/FrameLoader.h>
|
||||
#include <LibWeb/Loader/FileDirectoryLoader.h>
|
||||
#include <LibWeb/Loader/ResourceLoader.h>
|
||||
#include <LibWeb/PermissionsPolicy/AutoplayAllowlist.h>
|
||||
#include <LibWeb/Platform/AudioCodecPluginAgnostic.h>
|
||||
|
@ -70,8 +70,6 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
|||
#endif
|
||||
});
|
||||
|
||||
Web::FrameLoader::set_default_favicon_path(DeprecatedString::formatted("{}/res/icons/16x16/app-browser.png", s_serenity_resource_root));
|
||||
|
||||
int webcontent_fd_passing_socket { -1 };
|
||||
bool is_layout_test_mode = false;
|
||||
bool use_lagom_networking = false;
|
||||
|
@ -98,9 +96,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
|||
|
||||
Web::Platform::FontPlugin::install(*new Ladybird::FontPlugin(is_layout_test_mode));
|
||||
|
||||
Web::FrameLoader::set_resource_directory_url(DeprecatedString::formatted("file://{}/res", s_serenity_resource_root));
|
||||
Web::FrameLoader::set_error_page_url(DeprecatedString::formatted("file://{}/res/html/error.html", s_serenity_resource_root));
|
||||
Web::FrameLoader::set_directory_page_url(DeprecatedString::formatted("file://{}/res/html/directory.html", s_serenity_resource_root));
|
||||
Web::set_resource_directory_url(DeprecatedString::formatted("file://{}/res", s_serenity_resource_root));
|
||||
Web::set_directory_page_url(DeprecatedString::formatted("file://{}/res/html/directory.html", s_serenity_resource_root));
|
||||
|
||||
TRY(Web::Bindings::initialize_main_thread_vm());
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ source_set("Loader") {
|
|||
"ContentFilter.cpp",
|
||||
"FileDirectoryLoader.cpp",
|
||||
"FileRequest.cpp",
|
||||
"FrameLoader.cpp",
|
||||
"LoadRequest.cpp",
|
||||
"ProxyMappings.cpp",
|
||||
"Resource.cpp",
|
||||
|
|
|
@ -462,7 +462,6 @@ set(SOURCES
|
|||
Loader/ContentFilter.cpp
|
||||
Loader/FileDirectoryLoader.cpp
|
||||
Loader/FileRequest.cpp
|
||||
Loader/FrameLoader.cpp
|
||||
Loader/LoadRequest.cpp
|
||||
Loader/ProxyMappings.cpp
|
||||
Loader/Resource.cpp
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <LibWeb/CSS/StyleComputer.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/HTML/Window.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
|
||||
namespace Web::CSS {
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <LibWeb/CSS/SystemColor.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/Layout/Node.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
|
||||
namespace Web::CSS {
|
||||
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
namespace Web {
|
||||
class EditEventHandler;
|
||||
class EventHandler;
|
||||
class FrameLoader;
|
||||
class LoadRequest;
|
||||
class Page;
|
||||
class PageClient;
|
||||
|
|
|
@ -254,7 +254,6 @@ WebIDL::ExceptionOr<BrowsingContext::BrowsingContextAndDocument> BrowsingContext
|
|||
|
||||
BrowsingContext::BrowsingContext(Page& page, HTML::NavigableContainer* container)
|
||||
: m_page(page)
|
||||
, m_loader(*this)
|
||||
, m_event_handler({}, *this)
|
||||
, m_container(container)
|
||||
{
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include <LibWeb/HTML/SessionHistoryEntry.h>
|
||||
#include <LibWeb/HTML/TokenizedFeatures.h>
|
||||
#include <LibWeb/HTML/VisibilityState.h>
|
||||
#include <LibWeb/Loader/FrameLoader.h>
|
||||
#include <LibWeb/Page/EventHandler.h>
|
||||
#include <LibWeb/Platform/Timer.h>
|
||||
#include <LibWeb/TreeNode.h>
|
||||
|
@ -133,9 +132,6 @@ public:
|
|||
Page* page() { return m_page; }
|
||||
Page const* page() const { return m_page; }
|
||||
|
||||
FrameLoader& loader() { return m_loader; }
|
||||
FrameLoader const& loader() const { return m_loader; }
|
||||
|
||||
Web::EventHandler& event_handler() { return m_event_handler; }
|
||||
Web::EventHandler const& event_handler() const { return m_event_handler; }
|
||||
|
||||
|
@ -226,7 +222,6 @@ private:
|
|||
|
||||
WeakPtr<Page> m_page;
|
||||
|
||||
FrameLoader m_loader;
|
||||
Web::EventHandler m_event_handler;
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/history.html#current-entry
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <LibWeb/Bindings/MainThreadVM.h>
|
||||
#include <LibWeb/HTML/BrowsingContext.h>
|
||||
#include <LibWeb/HTML/BrowsingContextGroup.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/HTML/HTMLHyperlinkElementUtils.h>
|
||||
#include <LibWeb/HTML/Navigable.h>
|
||||
#include <LibWeb/Loader/FrameLoader.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <LibWeb/Layout/CheckBox.h>
|
||||
#include <LibWeb/Layout/RadioButton.h>
|
||||
#include <LibWeb/Namespace.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/WebIDL/DOMException.h>
|
||||
#include <LibWeb/WebIDL/ExceptionOr.h>
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <LibWeb/HTML/TraversableNavigable.h>
|
||||
#include <LibWeb/Infra/Strings.h>
|
||||
#include <LibWeb/Layout/Node.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/Platform/EventLoopPlugin.h>
|
||||
#include <LibWeb/XHR/FormData.h>
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <LibWeb/HTML/NavigationParams.h>
|
||||
#include <LibWeb/HTML/SessionHistoryEntry.h>
|
||||
#include <LibWeb/HTML/TraversableNavigable.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/Platform/EventLoopPlugin.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <LibWeb/HTML/BrowsingContext.h>
|
||||
#include <LibWeb/HTML/Window.h>
|
||||
#include <LibWeb/Internals/Internals.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/Painting/PaintableBox.h>
|
||||
|
||||
namespace Web::Internals {
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <LibWeb/Layout/TableWrapper.h>
|
||||
#include <LibWeb/Layout/TextNode.h>
|
||||
#include <LibWeb/Layout/Viewport.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/Platform/FontPlugin.h>
|
||||
|
||||
namespace Web::Layout {
|
||||
|
|
|
@ -11,10 +11,33 @@
|
|||
#include <LibCore/Directory.h>
|
||||
#include <LibCore/System.h>
|
||||
#include <LibWeb/Loader/FileDirectoryLoader.h>
|
||||
#include <LibWeb/Loader/FrameLoader.h>
|
||||
|
||||
namespace Web {
|
||||
|
||||
static DeprecatedString s_resource_directory_url = "file:///res";
|
||||
|
||||
DeprecatedString resource_directory_url()
|
||||
{
|
||||
return s_resource_directory_url;
|
||||
}
|
||||
|
||||
void set_resource_directory_url(DeprecatedString resource_directory_url)
|
||||
{
|
||||
s_resource_directory_url = resource_directory_url;
|
||||
}
|
||||
|
||||
static DeprecatedString s_directory_page_url = "file:///res/html/directory.html";
|
||||
|
||||
DeprecatedString directory_page_url()
|
||||
{
|
||||
return s_directory_page_url;
|
||||
}
|
||||
|
||||
void set_directory_page_url(DeprecatedString directory_page_url)
|
||||
{
|
||||
s_directory_page_url = directory_page_url;
|
||||
}
|
||||
|
||||
ErrorOr<DeprecatedString> load_file_directory_page(LoadRequest const& request)
|
||||
{
|
||||
// Generate HTML contents entries table
|
||||
|
@ -46,12 +69,12 @@ ErrorOr<DeprecatedString> load_file_directory_page(LoadRequest const& request)
|
|||
|
||||
// Generate HTML directory page from directory template file
|
||||
// FIXME: Use an actual templating engine (our own one when it's built, preferably with a way to check these usages at compile time)
|
||||
auto template_path = AK::URL::create_with_url_or_path(FrameLoader::directory_page_url()).serialize_path();
|
||||
auto template_path = AK::URL::create_with_url_or_path(directory_page_url()).serialize_path();
|
||||
auto template_file = TRY(Core::File::open(template_path, Core::File::OpenMode::Read));
|
||||
auto template_contents = TRY(template_file->read_until_eof());
|
||||
StringBuilder builder;
|
||||
SourceGenerator generator { builder };
|
||||
generator.set("resource_directory_url", FrameLoader::resource_directory_url());
|
||||
generator.set("resource_directory_url", resource_directory_url());
|
||||
generator.set("path", escape_html_entities(lexical_path.string()));
|
||||
generator.set("parent_path", escape_html_entities(lexical_path.parent().string()));
|
||||
generator.set("contents", contents.to_deprecated_string());
|
||||
|
|
|
@ -11,5 +11,9 @@
|
|||
namespace Web {
|
||||
|
||||
ErrorOr<DeprecatedString> load_file_directory_page(LoadRequest const&);
|
||||
DeprecatedString resource_directory_url();
|
||||
void set_resource_directory_url(DeprecatedString);
|
||||
DeprecatedString directory_page_url();
|
||||
void set_directory_page_url(DeprecatedString);
|
||||
|
||||
}
|
||||
|
|
|
@ -1,365 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2020-2022, Andreas Kling <kling@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <AK/Debug.h>
|
||||
#include <AK/JsonArray.h>
|
||||
#include <AK/LexicalPath.h>
|
||||
#include <AK/SourceGenerator.h>
|
||||
#include <LibWeb/Bindings/MainThreadVM.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/DOM/DocumentLoading.h>
|
||||
#include <LibWeb/DOM/ElementFactory.h>
|
||||
#include <LibWeb/DOM/Text.h>
|
||||
#include <LibWeb/HTML/NavigationParams.h>
|
||||
#include <LibWeb/HTML/Parser/HTMLParser.h>
|
||||
#include <LibWeb/Loader/FrameLoader.h>
|
||||
#include <LibWeb/Loader/ResourceLoader.h>
|
||||
#include <LibWeb/Namespace.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/Platform/ImageCodecPlugin.h>
|
||||
#include <LibWeb/ReferrerPolicy/AbstractOperations.h>
|
||||
#include <LibWeb/XML/XMLDocumentBuilder.h>
|
||||
|
||||
namespace Web {
|
||||
|
||||
static DeprecatedString s_default_favicon_path = "/res/icons/16x16/app-browser.png";
|
||||
static RefPtr<Gfx::Bitmap> s_default_favicon_bitmap;
|
||||
|
||||
void FrameLoader::set_default_favicon_path(DeprecatedString path)
|
||||
{
|
||||
s_default_favicon_path = move(path);
|
||||
}
|
||||
|
||||
FrameLoader::FrameLoader(HTML::BrowsingContext& browsing_context)
|
||||
: m_browsing_context(browsing_context)
|
||||
{
|
||||
if (!s_default_favicon_bitmap) {
|
||||
s_default_favicon_bitmap = Gfx::Bitmap::load_from_file(s_default_favicon_path).release_value_but_fixme_should_propagate_errors();
|
||||
VERIFY(s_default_favicon_bitmap);
|
||||
}
|
||||
}
|
||||
|
||||
FrameLoader::~FrameLoader() = default;
|
||||
|
||||
bool FrameLoader::load(LoadRequest& request, Type type)
|
||||
{
|
||||
if (!request.is_valid()) {
|
||||
load_error_page(request.url(), "Invalid request");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_browsing_context->is_frame_nesting_allowed(request.url())) {
|
||||
dbgln("No further recursion is allowed for the frame, abort load!");
|
||||
return false;
|
||||
}
|
||||
|
||||
request.set_main_resource(true);
|
||||
|
||||
auto& url = request.url();
|
||||
|
||||
if (type == Type::Navigation || type == Type::Reload || type == Type::Redirect) {
|
||||
if (auto* page = browsing_context().page()) {
|
||||
if (&page->top_level_browsing_context() == m_browsing_context)
|
||||
page->client().page_did_start_loading(url, type == Type::Redirect);
|
||||
}
|
||||
}
|
||||
|
||||
// https://fetch.spec.whatwg.org/#concept-fetch
|
||||
// Step 12: If request’s header list does not contain `Accept`, then:
|
||||
// 1. Let value be `*/*`. (NOTE: Not necessary as we're about to override it)
|
||||
// 2. A user agent should set value to the first matching statement, if any, switching on request’s destination:
|
||||
// -> "document"
|
||||
// -> "frame"
|
||||
// -> "iframe"
|
||||
// `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`
|
||||
if (!request.headers().contains("Accept"))
|
||||
request.set_header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
|
||||
|
||||
// HACK: We're crudely computing the referer value and shoving it into the
|
||||
// request until fetch infrastructure is used here.
|
||||
auto referrer_url = ReferrerPolicy::strip_url_for_use_as_referrer(url);
|
||||
if (referrer_url.has_value() && !request.headers().contains("Referer"))
|
||||
request.set_header("Referer", referrer_url->serialize());
|
||||
|
||||
set_resource(ResourceLoader::the().load_resource(Resource::Type::Generic, request));
|
||||
|
||||
if (type == Type::IFrame)
|
||||
return true;
|
||||
|
||||
if (url.scheme() == "http" || url.scheme() == "https") {
|
||||
AK::URL favicon_url;
|
||||
favicon_url.set_scheme(url.scheme());
|
||||
favicon_url.set_host(url.host());
|
||||
favicon_url.set_port(url.port_or_default());
|
||||
favicon_url.set_paths({ "favicon.ico" });
|
||||
|
||||
ResourceLoader::the().load(
|
||||
favicon_url,
|
||||
[this, favicon_url](auto data, auto&, auto) {
|
||||
// Always fetch the current document
|
||||
auto* document = this->browsing_context().active_document();
|
||||
if (document && document->has_active_favicon())
|
||||
return;
|
||||
dbgln_if(SPAM_DEBUG, "Favicon downloaded, {} bytes from {}", data.size(), favicon_url);
|
||||
if (data.is_empty())
|
||||
return;
|
||||
RefPtr<Gfx::Bitmap> favicon_bitmap;
|
||||
auto decoded_image = Platform::ImageCodecPlugin::the().decode_image(data);
|
||||
if (!decoded_image.has_value() || decoded_image->frames.is_empty()) {
|
||||
dbgln("Could not decode favicon {}", favicon_url);
|
||||
} else {
|
||||
favicon_bitmap = decoded_image->frames[0].bitmap;
|
||||
dbgln_if(IMAGE_DECODER_DEBUG, "Decoded favicon, {}", favicon_bitmap->size());
|
||||
}
|
||||
load_favicon(favicon_bitmap);
|
||||
},
|
||||
[this](auto&, auto) {
|
||||
// Always fetch the current document
|
||||
auto* document = this->browsing_context().active_document();
|
||||
if (document && document->has_active_favicon())
|
||||
return;
|
||||
|
||||
load_favicon();
|
||||
});
|
||||
} else {
|
||||
load_favicon();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FrameLoader::load(const AK::URL& url, Type type)
|
||||
{
|
||||
dbgln_if(SPAM_DEBUG, "FrameLoader::load: {}", url);
|
||||
|
||||
if (!url.is_valid()) {
|
||||
load_error_page(url, "Invalid URL");
|
||||
return false;
|
||||
}
|
||||
|
||||
auto request = LoadRequest::create_for_url_on_page(url, browsing_context().page());
|
||||
return load(request, type);
|
||||
}
|
||||
|
||||
void FrameLoader::load_html(StringView html, const AK::URL& url)
|
||||
{
|
||||
if (auto* page = browsing_context().page())
|
||||
page->client().page_did_start_loading(url, false);
|
||||
|
||||
auto& vm = Bindings::main_thread_vm();
|
||||
auto response = Fetch::Infrastructure::Response::create(vm);
|
||||
response->url_list().append(url);
|
||||
HTML::NavigationParams navigation_params {
|
||||
.id = {},
|
||||
.request = nullptr,
|
||||
.response = response,
|
||||
.origin = HTML::Origin {},
|
||||
.policy_container = HTML::PolicyContainer {},
|
||||
.final_sandboxing_flag_set = HTML::SandboxingFlagSet {},
|
||||
.cross_origin_opener_policy = HTML::CrossOriginOpenerPolicy {},
|
||||
.coop_enforcement_result = HTML::CrossOriginOpenerPolicyEnforcementResult {},
|
||||
.reserved_environment = {},
|
||||
.browsing_context = browsing_context(),
|
||||
.navigable = nullptr,
|
||||
};
|
||||
auto document = DOM::Document::create_and_initialize(DOM::Document::Type::HTML, "text/html", navigation_params).release_value_but_fixme_should_propagate_errors();
|
||||
// browsing_context().set_active_document(document);
|
||||
|
||||
auto parser = HTML::HTMLParser::create(document, html, "utf-8");
|
||||
parser->run(url);
|
||||
|
||||
if (auto* page = browsing_context().page())
|
||||
page->client().page_did_finish_loading(url);
|
||||
}
|
||||
|
||||
static DeprecatedString s_resource_directory_url = "file:///res";
|
||||
|
||||
DeprecatedString FrameLoader::resource_directory_url()
|
||||
{
|
||||
return s_resource_directory_url;
|
||||
}
|
||||
|
||||
void FrameLoader::set_resource_directory_url(DeprecatedString resource_directory_url)
|
||||
{
|
||||
s_resource_directory_url = resource_directory_url;
|
||||
}
|
||||
|
||||
static DeprecatedString s_error_page_url = "file:///res/html/error.html";
|
||||
|
||||
DeprecatedString FrameLoader::error_page_url()
|
||||
{
|
||||
return s_error_page_url;
|
||||
}
|
||||
|
||||
void FrameLoader::set_error_page_url(DeprecatedString error_page_url)
|
||||
{
|
||||
s_error_page_url = error_page_url;
|
||||
}
|
||||
|
||||
static DeprecatedString s_directory_page_url = "file:///res/html/directory.html";
|
||||
|
||||
DeprecatedString FrameLoader::directory_page_url()
|
||||
{
|
||||
return s_directory_page_url;
|
||||
}
|
||||
|
||||
void FrameLoader::set_directory_page_url(DeprecatedString directory_page_url)
|
||||
{
|
||||
s_directory_page_url = directory_page_url;
|
||||
}
|
||||
|
||||
// FIXME: Use an actual templating engine (our own one when it's built, preferably
|
||||
// with a way to check these usages at compile time)
|
||||
|
||||
void FrameLoader::load_error_page(const AK::URL& failed_url, DeprecatedString const& error)
|
||||
{
|
||||
LoadRequest request = LoadRequest::create_for_url_on_page(s_error_page_url, browsing_context().page());
|
||||
|
||||
ResourceLoader::the().load(
|
||||
request,
|
||||
[this, failed_url, error](auto data, auto&, auto) {
|
||||
VERIFY(!data.is_null());
|
||||
StringBuilder builder;
|
||||
SourceGenerator generator { builder };
|
||||
generator.set("resource_directory_url", resource_directory_url());
|
||||
generator.set("failed_url", escape_html_entities(failed_url.to_deprecated_string()));
|
||||
generator.set("error", escape_html_entities(error));
|
||||
generator.append(data);
|
||||
load_html(generator.as_string_view(), s_error_page_url);
|
||||
},
|
||||
[](auto& error, auto) {
|
||||
dbgln("Failed to load error page: {}", error);
|
||||
VERIFY_NOT_REACHED();
|
||||
});
|
||||
}
|
||||
|
||||
void FrameLoader::load_favicon(RefPtr<Gfx::Bitmap> bitmap)
|
||||
{
|
||||
if (auto* page = browsing_context().page()) {
|
||||
if (bitmap)
|
||||
page->client().page_did_change_favicon(*bitmap);
|
||||
else if (s_default_favicon_bitmap)
|
||||
page->client().page_did_change_favicon(*s_default_favicon_bitmap);
|
||||
}
|
||||
}
|
||||
|
||||
void FrameLoader::resource_did_load()
|
||||
{
|
||||
// This prevents us setting up the document of a removed browsing context container (BCC, e.g. <iframe>), which will cause a crash
|
||||
// if the document contains a script that inserts another BCC as this will use the stale browsing context it previously set up,
|
||||
// even if it's reinserted.
|
||||
// Example:
|
||||
// index.html:
|
||||
// ```
|
||||
// <body><script>
|
||||
// var i = document.createElement("iframe");
|
||||
// i.src = "b.html";
|
||||
// document.body.append(i);
|
||||
// i.remove();
|
||||
// </script>
|
||||
// ```
|
||||
// b.html:
|
||||
// ```
|
||||
// <body><script>
|
||||
// var i = document.createElement("iframe");
|
||||
// document.body.append(i);
|
||||
// </script>
|
||||
// ```
|
||||
// Required by Prebid.js, which does this by inserting an <iframe> into a <div> in the active document via innerHTML,
|
||||
// then transfers it to the <html> element:
|
||||
// https://github.com/prebid/Prebid.js/blob/7b7389c5abdd05626f71c3df606a93713d1b9f85/src/utils.js#L597
|
||||
// This is done in the spec by removing all tasks and aborting all fetches when a document is destroyed:
|
||||
// https://html.spec.whatwg.org/multipage/document-lifecycle.html#destroy-a-document
|
||||
if (browsing_context().has_been_discarded())
|
||||
return;
|
||||
|
||||
auto url = resource()->url();
|
||||
|
||||
// For 3xx (Redirection) responses, the Location value refers to the preferred target resource for automatically redirecting the request.
|
||||
auto status_code = resource()->status_code();
|
||||
if (status_code.has_value() && *status_code >= 300 && *status_code <= 399) {
|
||||
auto location = resource()->response_headers().get("Location");
|
||||
if (location.has_value()) {
|
||||
if (m_redirects_count > maximum_redirects_allowed) {
|
||||
m_redirects_count = 0;
|
||||
load_error_page(url, "Too many redirects");
|
||||
return;
|
||||
}
|
||||
m_redirects_count++;
|
||||
load(url.complete_url(location.value()), Type::Redirect);
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_redirects_count = 0;
|
||||
|
||||
if (resource()->has_encoding()) {
|
||||
dbgln_if(RESOURCE_DEBUG, "This content has MIME type '{}', encoding '{}'", resource()->mime_type(), resource()->encoding().value());
|
||||
} else {
|
||||
dbgln_if(RESOURCE_DEBUG, "This content has MIME type '{}', encoding unknown", resource()->mime_type());
|
||||
}
|
||||
|
||||
auto final_sandboxing_flag_set = HTML::SandboxingFlagSet {};
|
||||
|
||||
// (Part of https://html.spec.whatwg.org/#navigating-across-documents)
|
||||
// 3. Let responseOrigin be the result of determining the origin given browsingContext, resource's url, finalSandboxFlags, and incumbentNavigationOrigin.
|
||||
// FIXME: Pass incumbentNavigationOrigin
|
||||
// auto response_origin = HTML::determine_the_origin(browsing_context(), url, final_sandboxing_flag_set, {});
|
||||
|
||||
auto& vm = Bindings::main_thread_vm();
|
||||
auto response = Fetch::Infrastructure::Response::create(vm);
|
||||
response->url_list().append(url);
|
||||
HTML::NavigationParams navigation_params {
|
||||
.id = {},
|
||||
.request = nullptr,
|
||||
.response = response,
|
||||
.origin = {},
|
||||
// .origin = move(response_origin),
|
||||
.policy_container = HTML::PolicyContainer {},
|
||||
.final_sandboxing_flag_set = final_sandboxing_flag_set,
|
||||
.cross_origin_opener_policy = HTML::CrossOriginOpenerPolicy {},
|
||||
.coop_enforcement_result = HTML::CrossOriginOpenerPolicyEnforcementResult {},
|
||||
.reserved_environment = {},
|
||||
.browsing_context = browsing_context(),
|
||||
.navigable = nullptr,
|
||||
};
|
||||
auto document = DOM::Document::create_and_initialize(DOM::Document::Type::HTML, "text/html", navigation_params).release_value_but_fixme_should_propagate_errors();
|
||||
document->set_url(url);
|
||||
|
||||
if (resource()->encoding().has_value())
|
||||
document->set_encoding(MUST(String::from_deprecated_string(resource()->encoding().value())));
|
||||
else
|
||||
document->set_encoding({});
|
||||
|
||||
document->set_content_type(MUST(String::from_deprecated_string(resource()->mime_type())));
|
||||
|
||||
// browsing_context().set_active_document(document);
|
||||
if (auto* page = browsing_context().page())
|
||||
page->client().page_did_create_new_document(*document);
|
||||
|
||||
if (!parse_document(*document, resource()->encoded_data())) {
|
||||
load_error_page(url, "Failed to parse content.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (url.fragment().has_value() && !url.fragment()->is_empty())
|
||||
browsing_context().scroll_to_anchor(url.fragment()->to_deprecated_string());
|
||||
else
|
||||
browsing_context().scroll_to({ 0, 0 });
|
||||
|
||||
if (auto* page = browsing_context().page())
|
||||
page->client().page_did_finish_loading(url);
|
||||
}
|
||||
|
||||
void FrameLoader::resource_did_fail()
|
||||
{
|
||||
// See comment in resource_did_load() about why this is done.
|
||||
if (browsing_context().has_been_discarded())
|
||||
return;
|
||||
|
||||
load_error_page(resource()->url(), resource()->error());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,60 +0,0 @@
|
|||
/*
|
||||
* 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,
|
||||
Redirect,
|
||||
};
|
||||
|
||||
static void set_default_favicon_path(DeprecatedString);
|
||||
static DeprecatedString resource_directory_url();
|
||||
static void set_resource_directory_url(DeprecatedString);
|
||||
static DeprecatedString error_page_url();
|
||||
static void set_error_page_url(DeprecatedString);
|
||||
static DeprecatedString directory_page_url();
|
||||
static void set_directory_page_url(DeprecatedString);
|
||||
|
||||
explicit FrameLoader(HTML::BrowsingContext&);
|
||||
~FrameLoader();
|
||||
|
||||
bool load(const AK::URL&, Type);
|
||||
bool load(LoadRequest&, Type);
|
||||
|
||||
void load_html(StringView, const AK::URL&);
|
||||
|
||||
bool is_pending() const { return resource()->is_pending(); }
|
||||
|
||||
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, DeprecatedString const& error_message);
|
||||
void load_favicon(RefPtr<Gfx::Bitmap> bitmap = nullptr);
|
||||
|
||||
JS::NonnullGCPtr<HTML::BrowsingContext> m_browsing_context;
|
||||
size_t m_redirects_count { 0 };
|
||||
};
|
||||
|
||||
}
|
|
@ -52,11 +52,6 @@ void Page::load_html(StringView html)
|
|||
(void)top_level_traversable()->navigate("about:srcdoc"sv, *top_level_traversable()->active_document(), String::from_utf8(html).release_value_but_fixme_should_propagate_errors());
|
||||
}
|
||||
|
||||
bool Page::has_ongoing_navigation() const
|
||||
{
|
||||
return top_level_browsing_context().loader().is_pending();
|
||||
}
|
||||
|
||||
Gfx::Palette Page::palette() const
|
||||
{
|
||||
return m_client.palette();
|
||||
|
|
|
@ -62,8 +62,6 @@ public:
|
|||
|
||||
void load_html(StringView);
|
||||
|
||||
bool has_ongoing_navigation() const;
|
||||
|
||||
CSSPixelPoint device_to_css_point(DevicePixelPoint) const;
|
||||
DevicePixelPoint css_to_device_point(CSSPixelPoint) const;
|
||||
CSSPixelRect device_to_css_rect(DevicePixelRect) const;
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <LibWeb/HTML/HTMLVideoElement.h>
|
||||
#include <LibWeb/Layout/ReplacedBox.h>
|
||||
#include <LibWeb/Page/EventHandler.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/Painting/MediaPaintable.h>
|
||||
|
||||
namespace Web::Painting {
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <LibWeb/HTML/Parser/HTMLParser.h>
|
||||
#include <LibWeb/HTML/TraversableNavigable.h>
|
||||
#include <LibWeb/Layout/Viewport.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/Painting/PaintContext.h>
|
||||
#include <LibWeb/Painting/ViewportPaintable.h>
|
||||
#include <LibWeb/SVG/SVGDecodedImageData.h>
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <LibWeb/Bindings/Intrinsics.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
#include <LibWeb/SVG/SVGTitleElement.h>
|
||||
|
||||
namespace Web::SVG {
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include <LibWeb/Cookie/Cookie.h>
|
||||
#include <LibWeb/Cookie/ParsedCookie.h>
|
||||
#include <LibWeb/HTML/ActivateTab.h>
|
||||
#include <LibWeb/Loader/FrameLoader.h>
|
||||
#include <LibWebView/ViewImplementation.h>
|
||||
#include <LibWebView/WebContentClient.h>
|
||||
|
||||
|
|
Loading…
Reference in a new issue