/* * Copyright (c) 2022, networkException * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace JS::FFI { struct ParsedProgram; } namespace Web::HTML { using ModuleScriptRecord = Variant, GC::Ref, GC::Ref>; // https://html.spec.whatwg.org/multipage/webappapis.html#module-script class WEB_API ModuleScript : public Script { GC_CELL(ModuleScript, Script); GC_DECLARE_ALLOCATOR(ModuleScript); public: virtual ~ModuleScript() override; static WebIDL::ExceptionOr> create(ByteString const& filename, StringView source, JS::Realm&, URL::URL base_url); static WebIDL::ExceptionOr> create_from_pre_parsed(ByteString const& filename, NonnullRefPtr source_code, JS::Realm&, URL::URL base_url, JS::FFI::ParsedProgram* parsed); static WebIDL::ExceptionOr> create_a_javascript_module_script(ByteString const& filename, StringView source, JS::Realm&, URL::URL base_url); static WebIDL::ExceptionOr> create_a_css_module_script(ByteString const& filename, StringView source, JS::Realm&); static WebIDL::ExceptionOr> create_a_json_module_script(ByteString const& filename, StringView source, JS::Realm&); static WebIDL::ExceptionOr> create_a_webassembly_module_script(ByteString const& filename, ByteBuffer body_bytes, JS::Realm&, URL::URL base_url); enum class PreventErrorReporting { Yes, No }; WebIDL::Promise* run(PreventErrorReporting = PreventErrorReporting::No); ModuleScriptRecord record() const { return m_record; } protected: ModuleScript(Optional base_url, ByteString filename, JS::Realm&); private: virtual bool is_module_script() const final { return true; } virtual void visit_edges(JS::Cell::Visitor&) override; ModuleScriptRecord m_record; size_t m_fetch_internal_request_count { 0 }; size_t m_completed_fetch_internal_request_count { 0 }; Function m_completed_fetch_internal_callback; }; } template<> inline bool JS::Script::HostDefined::fast_is() const { return is_module_script(); }