Bug 1688879 - Part 3: Parse and register an import map. r=jonco,yulia

Implement
https://wicg.github.io/import-maps/#parse-an-import-map-string,
and
https://wicg.github.io/import-maps/#register-an-import-map

Differential Revision: https://phabricator.services.mozilla.com/D142071
This commit is contained in:
Yoshi Cheng-Hao Huang
2022-05-04 21:02:50 +00:00
parent 9d0b0b7820
commit 641d407325
10 changed files with 654 additions and 1 deletions

View File

@@ -822,7 +822,7 @@ already_AddRefed<ScriptLoadRequest> ScriptLoader::CreateLoadRequest(
aCORSMode, aReferrerPolicy, aTriggeringPrincipal, domElement);
RefPtr<ScriptLoadContext> context = new ScriptLoadContext();
if (aKind == ScriptKind::eClassic) {
if (aKind == ScriptKind::eClassic || aKind == ScriptKind::eImportMap) {
RefPtr<ScriptLoadRequest> aRequest = new ScriptLoadRequest(
aKind, aURI, fetchOptions, aIntegrity, referrer, context);
@@ -1166,6 +1166,29 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
return false;
}
if (request->IsImportMapRequest()) {
UniquePtr<ImportMap> importMap = mModuleLoader->ParseImportMap(request);
// https://wicg.github.io/import-maps/#register-an-import-map
//
// Step 1. If elements the scripts result is null, then fire an event
// named error at element, and return.
if (!importMap) {
NS_DispatchToCurrentThread(
NewRunnableMethod("nsIScriptElement::FireErrorEvent", aElement,
&nsIScriptElement::FireErrorEvent));
return false;
}
// Step 3. Assert: elements the scripts type is "importmap".
MOZ_ASSERT(aElement->GetScriptIsImportMap());
// Step 4 to step 9 is done in RegisterImportMap.
mModuleLoader->RegisterImportMap(std::move(importMap));
return false;
}
request->mState = ScriptLoadRequest::State::Ready;
if (aElement->GetParserCreated() == FROM_PARSER_XSLT &&
(!ReadyToExecuteParserBlockingScripts() || !mXSLTRequests.isEmpty())) {
@@ -2994,6 +3017,19 @@ void ScriptLoader::ReportErrorToConsole(ScriptLoadRequest* aRequest,
params, nullptr, u""_ns, lineNo, columnNo);
}
void ScriptLoader::ReportWarningToConsole(
ScriptLoadRequest* aRequest, const char* aMessageName,
const nsTArray<nsString>& aParams) const {
nsIScriptElement* element =
aRequest->GetScriptLoadContext()->GetScriptElement();
uint32_t lineNo = element ? element->GetScriptLineNumber() : 0;
uint32_t columnNo = element ? element->GetScriptColumnNumber() : 0;
nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
"Script Loader"_ns, mDocument,
nsContentUtils::eDOM_PROPERTIES, aMessageName,
aParams, nullptr, u""_ns, lineNo, columnNo);
}
void ScriptLoader::ReportPreloadErrorsToConsole(ScriptLoadRequest* aRequest) {
if (NS_FAILED(aRequest->GetScriptLoadContext()->mUnreportedPreloadError)) {
ReportErrorToConsole(