tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 09b8ae44b8709f29ce02f69a7b181f4c2e576a20
parent 3eebccc479c4a13bd12dc9be33a4956d5f1bf53b
Author: Tooru Fujisawa <arai_a@mac.com>
Date:   Wed, 22 Oct 2025 04:35:33 +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:
Mjs/loader/LoadedScript.cpp | 10++++++++++
Mjs/loader/LoadedScript.h | 13++++++++++++-
Mjs/loader/ScriptLoadRequest.cpp | 12++++++++++--
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;