diff --git a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp index 59368620c0..9c2a3edeb9 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp @@ -17,6 +17,7 @@ #include #include #include +#include namespace Web::HTML { @@ -108,13 +109,6 @@ void HTMLScriptElement::execute_script() dispatch_event(*DOM::Event::create(realm(), HTML::EventNames::load)); } -// https://mimesniff.spec.whatwg.org/#javascript-mime-type-essence-match -static bool is_javascript_mime_type_essence_match(String const& string) -{ - auto lowercase_string = string.to_lowercase(); - return lowercase_string.is_one_of("application/ecmascript", "application/javascript", "application/x-ecmascript", "application/x-javascript", "text/ecmascript", "text/javascript", "text/javascript1.0", "text/javascript1.1", "text/javascript1.2", "text/javascript1.3", "text/javascript1.4", "text/javascript1.5", "text/jscript", "text/livescript", "text/x-ecmascript", "text/x-javascript"); -} - // https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script void HTMLScriptElement::prepare_script() { @@ -169,7 +163,7 @@ void HTMLScriptElement::prepare_script() } // Determine the script's type as follows: - if (is_javascript_mime_type_essence_match(script_block_type.trim(Infra::ASCII_WHITESPACE))) { + if (MimeSniff::is_javascript_mime_type_essence_match(script_block_type.trim(Infra::ASCII_WHITESPACE))) { // - If the script block's type string with leading and trailing ASCII whitespace stripped is a JavaScript MIME type essence match, the script's type is "classic". m_script_type = ScriptType::Classic; } else if (script_block_type.equals_ignoring_case("module"sv)) { diff --git a/Userland/Libraries/LibWeb/MimeSniff/MimeType.cpp b/Userland/Libraries/LibWeb/MimeSniff/MimeType.cpp index a5c0817c52..95c2a05a85 100644 --- a/Userland/Libraries/LibWeb/MimeSniff/MimeType.cpp +++ b/Userland/Libraries/LibWeb/MimeSniff/MimeType.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2022, Luke Wilde * Copyright (c) 2022, Linus Groh + * Copyright (c) 2022, networkException * * SPDX-License-Identifier: BSD-2-Clause */ @@ -13,6 +14,16 @@ namespace Web::MimeSniff { +// https://mimesniff.spec.whatwg.org/#javascript-mime-type-essence-match +bool is_javascript_mime_type_essence_match(String const& string) +{ + // NOTE: The mime type parser automatically lowercases the essence. + auto type = MimeType::from_string(string); + if (!type.has_value()) + return false; + return type->is_javascript(); +} + static bool contains_only_http_quoted_string_token_code_points(StringView string) { // https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point @@ -221,4 +232,26 @@ void MimeType::set_parameter(String const& name, String const& value) m_parameters.set(name, value); } +// https://mimesniff.spec.whatwg.org/#javascript-mime-type +bool MimeType::is_javascript() const +{ + return essence().is_one_of( + "application/ecmascript"sv, + "application/javascript"sv, + "application/x-ecmascript"sv, + "application/x-javascript"sv, + "text/ecmascript"sv, + "text/javascript"sv, + "text/javascript1.0"sv, + "text/javascript1.1"sv, + "text/javascript1.2"sv, + "text/javascript1.3"sv, + "text/javascript1.4"sv, + "text/javascript1.5"sv, + "text/jscript"sv, + "text/livescript"sv, + "text/x-ecmascript"sv, + "text/x-javascript"sv); +} + } diff --git a/Userland/Libraries/LibWeb/MimeSniff/MimeType.h b/Userland/Libraries/LibWeb/MimeSniff/MimeType.h index 19f9b7e1d1..be48ccfea9 100644 --- a/Userland/Libraries/LibWeb/MimeSniff/MimeType.h +++ b/Userland/Libraries/LibWeb/MimeSniff/MimeType.h @@ -12,6 +12,8 @@ namespace Web::MimeSniff { +bool is_javascript_mime_type_essence_match(String const&); + // https://mimesniff.spec.whatwg.org/#mime-type class MimeType { public: @@ -24,6 +26,8 @@ public: String const& subtype() const { return m_subtype; } OrderedHashMap const& parameters() const { return m_parameters; } + bool is_javascript() const; + void set_parameter(String const& name, String const& value); String essence() const;