Bug 1800641 - Part 10: Add ScriptLoadRequest::mLoadedScript. r=nbp

Depends on D197847

Differential Revision: https://phabricator.services.mozilla.com/D197848
This commit is contained in:
Tooru Fujisawa
2024-01-08 14:57:39 +00:00
parent c389c518db
commit ed418d41dd
6 changed files with 54 additions and 12 deletions

View File

@@ -2761,9 +2761,14 @@ nsresult ScriptLoader::EvaluateScript(nsIGlobalObject* aGlobalObject,
aRequest->GetScriptLoadContext()->GetProfilerLabel(profilerLabelString);
// Create a ClassicScript object and associate it with the JSScript.
RefPtr<ClassicScript> classicScript = new ClassicScript(
aRequest->ReferrerPolicy(), aRequest->mFetchOptions, aRequest->mURI);
classicScript->SetBaseURL(aRequest->mBaseURL);
aRequest->EnsureScript();
MOZ_ASSERT(aRequest->mLoadedScript->IsClassicScript());
MOZ_ASSERT(aRequest->mLoadedScript->GetFetchOptions() ==
aRequest->mFetchOptions);
MOZ_ASSERT(aRequest->mLoadedScript->GetURI() == aRequest->mURI);
aRequest->mLoadedScript->SetBaseURL(aRequest->mBaseURL);
RefPtr<ClassicScript> classicScript =
aRequest->mLoadedScript->AsClassicScript();
JS::Rooted<JS::Value> classicScriptValue(cx, JS::PrivateValue(classicScript));
JS::CompileOptions options(cx);

View File

@@ -1250,9 +1250,12 @@ bool WorkerScriptLoader::EvaluateScript(JSContext* aCx,
} else {
requestBaseURI = aRequest->mBaseURL;
}
classicScript = new JS::loader::ClassicScript(
aRequest->ReferrerPolicy(), aRequest->mFetchOptions, aRequest->mURI);
classicScript->SetBaseURL(requestBaseURI);
aRequest->EnsureScript();
MOZ_ASSERT(aRequest->mLoadedScript->IsClassicScript());
MOZ_ASSERT(aRequest->mLoadedScript->GetFetchOptions() ==
aRequest->mFetchOptions);
aRequest->mLoadedScript->SetBaseURL(requestBaseURI);
classicScript = aRequest->mLoadedScript->AsClassicScript();
}
JS::Rooted<JSScript*> script(aCx);

View File

@@ -10,7 +10,7 @@
#include "nsCOMPtr.h"
#include "nsCycleCollectionParticipant.h"
#include "jsapi.h"
#include "ScriptLoadRequest.h"
#include "ScriptKind.h"
#include "ScriptFetchOptions.h"
class nsIURI;
@@ -41,6 +41,7 @@ class LoadedScript : public nsISupports {
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS(LoadedScript)
bool IsClassicScript() const { return mKind == ScriptKind::eClassic; }
bool IsModuleScript() const { return mKind == ScriptKind::eModule; }
bool IsEventScript() const { return mKind == ScriptKind::eEvent; }

View File

@@ -638,9 +638,14 @@ nsresult ModuleLoaderBase::CreateModuleScript(ModuleLoadRequest* aRequest) {
}
}
RefPtr<ModuleScript> moduleScript = new ModuleScript(
aRequest->ReferrerPolicy(), aRequest->mFetchOptions, aRequest->mURI);
moduleScript->SetBaseURL(aRequest->mBaseURL);
aRequest->EnsureScript();
MOZ_ASSERT(aRequest->mLoadedScript->IsModuleScript());
MOZ_ASSERT(aRequest->mLoadedScript->GetFetchOptions() ==
aRequest->mFetchOptions);
MOZ_ASSERT(aRequest->mLoadedScript->GetURI() == aRequest->mURI);
aRequest->mLoadedScript->SetBaseURL(aRequest->mBaseURL);
RefPtr<ModuleScript> moduleScript =
aRequest->mLoadedScript->AsModuleScript();
aRequest->mModuleScript = moduleScript;
if (!module) {

View File

@@ -62,13 +62,15 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(ScriptLoadRequest)
NS_IMPL_CYCLE_COLLECTION_CLASS(ScriptLoadRequest)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ScriptLoadRequest)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mFetchOptions, mCacheInfo, mLoadContext)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mFetchOptions, mCacheInfo, mLoadContext,
mLoadedScript)
tmp->mScriptForBytecodeEncoding = nullptr;
tmp->DropBytecodeCacheReferences();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ScriptLoadRequest)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFetchOptions, mCacheInfo, mLoadContext)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFetchOptions, mCacheInfo, mLoadContext,
mLoadedScript)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ScriptLoadRequest)
@@ -163,6 +165,21 @@ void ScriptLoadRequest::NoCacheEntryFound() {
mState = State::Fetching;
}
void ScriptLoadRequest::EnsureScript() {
switch (mKind) {
case ScriptKind::eClassic:
case ScriptKind::eImportMap:
mLoadedScript = new ClassicScript(mReferrerPolicy, mFetchOptions, mURI);
break;
case ScriptKind::eModule:
mLoadedScript = new ModuleScript(mReferrerPolicy, mFetchOptions, mURI);
break;
case ScriptKind::eEvent:
MOZ_ASSERT_UNREACHABLE("EventScripts are not using ScriptLoadRequest");
break;
}
}
void ScriptLoadRequest::SetPendingFetchingError() {
MOZ_ASSERT(IsCheckingCache());
mState = State::PendingFetchingError;

View File

@@ -27,6 +27,7 @@
#include "nsCOMPtr.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIGlobalObject.h"
#include "LoadedScript.h"
#include "ScriptKind.h"
#include "ScriptFetchOptions.h"
#include "nsIScriptElement.h"
@@ -257,6 +258,8 @@ class ScriptLoadRequest
void ClearScriptSource();
void EnsureScript();
// Convert a CheckingCache ScriptLoadRequest into a Fetching one, by creating
// a new LoadedScript which is matching the ScriptKind provided when
// constructing this ScriptLoadRequest.
@@ -360,6 +363,14 @@ class ScriptLoadRequest
// The base URL used for resolving relative module imports.
nsCOMPtr<nsIURI> mBaseURL;
// The loaded script holds the source / bytecode which is loaded.
//
// Currently it is used to hold information which are needed by the Debugger.
// Soon it would be used as a way to dissociate the LoadRequest from the
// loaded value, such that multiple request referring to the same content
// would share the same loaded script.
RefPtr<LoadedScript> mLoadedScript;
// Holds the top-level JSScript that corresponds to the current source, once
// it is parsed, and planned to be saved in the bytecode cache.
//