commit c15f0967dd06f63e51adf18e462c5d1dcfce93dc
parent f353b9d3e59c32a0814d85d5719cb6606742be5d
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Wed, 22 Oct 2025 11:17:15 +0000
Bug 1991607 - Part 4: Add ImportMapScript subclass for LoadedScript. r=bthrall
ScriptLoadRequest::mKind == eImportMap case has been using
LoadedScript::mKind == eClassic.
This patch solves this inconsistency by introducing another subclass.
Differential Revision: https://phabricator.services.mozilla.com/D267353
Diffstat:
3 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/js/loader/LoadedScript.cpp b/js/loader/LoadedScript.cpp
@@ -251,6 +251,16 @@ ClassicScript::ClassicScript(mozilla::dom::ReferrerPolicy aReferrerPolicy,
}
//////////////////////////////////////////////////////////////
+// ImportMapScript
+//////////////////////////////////////////////////////////////
+
+ImportMapScript::ImportMapScript(mozilla::dom::ReferrerPolicy aReferrerPolicy,
+ ScriptFetchOptions* aFetchOptions,
+ nsIURI* aURI)
+ : LoadedScript(ScriptKind::eImportMap, aReferrerPolicy, aFetchOptions,
+ aURI) {}
+
+//////////////////////////////////////////////////////////////
// ModuleScript
//////////////////////////////////////////////////////////////
diff --git a/js/loader/LoadedScript.h b/js/loader/LoadedScript.h
@@ -84,10 +84,10 @@ class LoadedScript : public nsIMemoryReporter {
bool IsClassicScript() const { return mKind == ScriptKind::eClassic; }
bool IsModuleScript() const { return mKind == ScriptKind::eModule; }
bool IsEventScript() const { return mKind == ScriptKind::eEvent; }
+ bool IsImportMapScript() const { return mKind == ScriptKind::eImportMap; }
inline ClassicScript* AsClassicScript();
inline ModuleScript* AsModuleScript();
- inline EventScript* AsEventScript();
// Used to propagate Fetch Options to child modules
ScriptFetchOptions* GetFetchOptions() const { return mFetchOptions; }
@@ -358,6 +358,9 @@ class LoadedScriptDelegate {
bool IsModuleScript() const { return GetLoadedScript()->IsModuleScript(); }
bool IsEventScript() const { return GetLoadedScript()->IsEventScript(); }
+ bool IsImportMapScript() const {
+ return GetLoadedScript()->IsImportMapScript();
+ }
bool IsUnknownDataType() const {
return GetLoadedScript()->IsUnknownDataType();
@@ -453,6 +456,14 @@ class EventScript final : public LoadedScript {
ScriptFetchOptions* aFetchOptions, nsIURI* aURI);
};
+class ImportMapScript final : public LoadedScript {
+ ~ImportMapScript() = default;
+
+ public:
+ ImportMapScript(mozilla::dom::ReferrerPolicy aReferrerPolicy,
+ ScriptFetchOptions* aFetchOptions, nsIURI* aURI);
+};
+
// A single module script. May be used to satisfy multiple load requests.
class ModuleScript final : public LoadedScript {
diff --git a/js/loader/ScriptLoadRequest.cpp b/js/loader/ScriptLoadRequest.cpp
@@ -182,7 +182,6 @@ void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) {
switch (mKind) {
case ScriptKind::eClassic:
- case ScriptKind::eImportMap:
MOZ_ASSERT(aLoadedScript->IsClassicScript());
mLoadedScript = aLoadedScript;
@@ -190,6 +189,13 @@ void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) {
// Classic scripts can be set ready once the script itself is ready.
mState = State::Ready;
break;
+ case ScriptKind::eImportMap:
+ MOZ_ASSERT(aLoadedScript->IsImportMapScript());
+
+ mLoadedScript = aLoadedScript;
+
+ mState = State::Ready;
+ break;
case ScriptKind::eModule:
// NOTE: The cache entry has "module" kind, but it's not ModuleScript
// instance, given ModuleScript has GC pointers.
@@ -225,9 +231,11 @@ void ScriptLoadRequest::NoCacheEntryFound() {
// and later replace the mBaseURL using what the Channel->GetURI will provide.
switch (mKind) {
case ScriptKind::eClassic:
- case ScriptKind::eImportMap:
mLoadedScript = new ClassicScript(mReferrerPolicy, mFetchOptions, mURI);
break;
+ case ScriptKind::eImportMap:
+ mLoadedScript = new ImportMapScript(mReferrerPolicy, mFetchOptions, mURI);
+ break;
case ScriptKind::eModule:
mLoadedScript = new ModuleScript(mReferrerPolicy, mFetchOptions, mURI);
break;