1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 08:25:07 +00:00

LibWeb: Implement recent changes to module script fetching

This patch implements all changes to the specification touching the
subset of module script fetching we support.

Notably it adds parts of the specification for supporting import maps.

With this we are also able to get rid of a non standard workaround for a
spec issue we discovered while initially implementing module scripts :^)
This commit is contained in:
networkException 2022-10-23 04:10:01 +02:00 committed by Linus Groh
parent 9afea1248f
commit 681e36706b
4 changed files with 252 additions and 88 deletions

View file

@ -6,11 +6,12 @@
#pragma once
#include <LibWeb/HTML/Scripting/ImportMap.h>
#include <LibWeb/HTML/Scripting/ModuleScript.h>
namespace Web::HTML {
using ModuleCallback = Function<void(JavaScriptModuleScript const*)>;
using ModuleCallback = Function<void(JavaScriptModuleScript*)>;
class DescendantFetchingContext : public RefCounted<DescendantFetchingContext> {
public:
@ -25,7 +26,7 @@ public:
bool failed() const { return m_failed; }
void set_failed(bool failed) { m_failed = failed; }
void on_complete(JavaScriptModuleScript const* module_script) { m_on_complete(module_script); };
void on_complete(JavaScriptModuleScript* module_script) { m_on_complete(module_script); };
void set_on_complete(ModuleCallback on_complete) { m_on_complete = move(on_complete); }
private:
@ -38,14 +39,16 @@ private:
};
String module_type_from_module_request(JS::ModuleRequest const&);
AK::URL resolve_module_specifier(JS::ModuleRequest const&, AK::URL const& base_url);
WebIDL::ExceptionOr<AK::URL> resolve_module_specifier(Optional<Script&> referring_script, String const& specifier);
WebIDL::ExceptionOr<Optional<AK::URL>> resolve_imports_match(String const& normalized_specifier, Optional<AK::URL> as_url, ModuleSpecifierMap const&);
Optional<AK::URL> resolve_url_like_module_specifier(String const& specifier, AK::URL const& base_url);
void fetch_internal_module_script_graph(JS::ModuleRequest const& module_request, EnvironmentSettingsObject& fetch_client_settings_object, StringView destination, EnvironmentSettingsObject& module_script_settings_object, HashTable<ModuleLocationTuple> const& visited_set, AK::URL const& referrer, ModuleCallback on_complete);
void fetch_internal_module_script_graph(JS::ModuleRequest const& module_request, EnvironmentSettingsObject& fetch_client_settings_object, StringView destination, Script& referring_script, HashTable<ModuleLocationTuple> const& visited_set, ModuleCallback on_complete);
void fetch_external_module_script_graph(AK::URL const&, EnvironmentSettingsObject& settings_object, ModuleCallback on_complete);
void fetch_inline_module_script_graph(String const& filename, String const& source_text, AK::URL const& base_url, EnvironmentSettingsObject& settings_object, ModuleCallback on_complete);
void fetch_descendants_of_a_module_script(JavaScriptModuleScript const& module_script, EnvironmentSettingsObject& fetch_client_settings_object, StringView destination, HashTable<ModuleLocationTuple> visited_set, ModuleCallback callback);
void fetch_descendants_of_and_link_a_module_script(JavaScriptModuleScript const& module_script, EnvironmentSettingsObject& fetch_client_settings_object, StringView destination, HashTable<ModuleLocationTuple> const& visited_set, ModuleCallback on_complete);
void fetch_descendants_of_a_module_script(JavaScriptModuleScript& module_script, EnvironmentSettingsObject& fetch_client_settings_object, StringView destination, HashTable<ModuleLocationTuple> visited_set, ModuleCallback callback);
void fetch_descendants_of_and_link_a_module_script(JavaScriptModuleScript& module_script, EnvironmentSettingsObject& fetch_client_settings_object, StringView destination, HashTable<ModuleLocationTuple> const& visited_set, ModuleCallback on_complete);
enum class TopLevelModule {
Yes,