diff --git a/js/loader/ScriptFetchOptions.h b/js/loader/ScriptFetchOptions.h index 844527da1ca1..4b0ad12256cf 100644 --- a/js/loader/ScriptFetchOptions.h +++ b/js/loader/ScriptFetchOptions.h @@ -86,6 +86,21 @@ class ScriptFetchOptions { * TODO: Move to ScriptLoadContext */ nsCOMPtr mTriggeringPrincipal; + + // Returns true if given fetch option is compatible with this fetch option + // in term of sharing the server response. + inline bool IsCompatible(ScriptFetchOptions* other) { + bool equals; + (void)mTriggeringPrincipal->Equals(other->mTriggeringPrincipal, &equals); + + if (!equals) { + return false; + } + + // NOTE: mParserMetadata can be ignored. + return mCORSMode == other->mCORSMode && mNonce == other->mNonce && + mFetchPriority == other->mFetchPriority; + } }; } // namespace JS::loader diff --git a/js/loader/ScriptLoadRequest.cpp b/js/loader/ScriptLoadRequest.cpp index 918c16460ece..22c7e655675d 100644 --- a/js/loader/ScriptLoadRequest.cpp +++ b/js/loader/ScriptLoadRequest.cpp @@ -173,6 +173,29 @@ bool ScriptLoadRequest::IsCacheable() const { return mExpirationTime > now; } +void ScriptLoadRequest::CacheEntryFound(LoadedScript* aLoadedScript) { + MOZ_ASSERT(IsCheckingCache()); + MOZ_ASSERT(mURI); + + mLoadedScript = aLoadedScript; + + MOZ_ASSERT(mFetchOptions->IsCompatible(mLoadedScript->GetFetchOptions())); + + switch (mKind) { + case ScriptKind::eClassic: + case ScriptKind::eImportMap: + MOZ_ASSERT(mLoadedScript->IsClassicScript()); + break; + case ScriptKind::eModule: + MOZ_ASSERT(mLoadedScript->IsModuleScript()); + break; + case ScriptKind::eEvent: + MOZ_ASSERT_UNREACHABLE("EventScripts are not using ScriptLoadRequest"); + break; + } + mState = State::Ready; +} + void ScriptLoadRequest::NoCacheEntryFound() { MOZ_ASSERT(IsCheckingCache()); MOZ_ASSERT(mURI); diff --git a/js/loader/ScriptLoadRequest.h b/js/loader/ScriptLoadRequest.h index 237ad47ed568..82ac700cfcd5 100644 --- a/js/loader/ScriptLoadRequest.h +++ b/js/loader/ScriptLoadRequest.h @@ -7,6 +7,7 @@ #ifndef js_loader_ScriptLoadRequest_h #define js_loader_ScriptLoadRequest_h +#include "js/experimental/JSStencil.h" #include "js/RootingAPI.h" #include "js/SourceText.h" #include "js/TypeDecls.h" @@ -189,6 +190,10 @@ class ScriptLoadRequest : public nsISupports, return mFetchOptions->mTriggeringPrincipal; } + // Convert a CheckingCache ScriptLoadRequest into a Ready one, by populating + // the script data from cached script. + void CacheEntryFound(LoadedScript* aLoadedScript); + // Convert a CheckingCache ScriptLoadRequest into a Fetching one, by creating // a new LoadedScript which is matching the ScriptKind provided when // constructing this ScriptLoadRequest.