mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-26 22:58:36 +00:00
0d874713ef
This updates module implementation to match spec regarding handling of instantiation errors, after it was changed yet again, this time to not remember instantiation errors, but instead immediately rethrow applicable ones. Ref: BZ 1420420
139 lines
3.6 KiB
C++
139 lines
3.6 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "ModuleLoadRequest.h"
|
|
#include "ModuleScript.h"
|
|
#include "ScriptLoader.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(ModuleLoadRequest)
|
|
NS_INTERFACE_MAP_END_INHERITING(ScriptLoadRequest)
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_INHERITED(ModuleLoadRequest, ScriptLoadRequest,
|
|
mBaseURL,
|
|
mLoader,
|
|
mParent,
|
|
mModuleScript,
|
|
mImports)
|
|
|
|
NS_IMPL_ADDREF_INHERITED(ModuleLoadRequest, ScriptLoadRequest)
|
|
NS_IMPL_RELEASE_INHERITED(ModuleLoadRequest, ScriptLoadRequest)
|
|
|
|
ModuleLoadRequest::ModuleLoadRequest(nsIScriptElement* aElement,
|
|
uint32_t aVersion,
|
|
CORSMode aCORSMode,
|
|
const SRIMetadata &aIntegrity,
|
|
ScriptLoader* aLoader)
|
|
: ScriptLoadRequest(ScriptKind::Module,
|
|
aElement,
|
|
aVersion,
|
|
aCORSMode,
|
|
aIntegrity),
|
|
mIsTopLevel(true),
|
|
mLoader(aLoader)
|
|
{}
|
|
|
|
void ModuleLoadRequest::Cancel()
|
|
{
|
|
ScriptLoadRequest::Cancel();
|
|
mModuleScript = nullptr;
|
|
mProgress = ScriptLoadRequest::Progress::Ready;
|
|
CancelImports();
|
|
mReady.RejectIfExists(NS_ERROR_DOM_ABORT_ERR, __func__);
|
|
}
|
|
|
|
void
|
|
ModuleLoadRequest::CancelImports()
|
|
{
|
|
for (size_t i = 0; i < mImports.Length(); i++) {
|
|
mImports[i]->Cancel();
|
|
}
|
|
}
|
|
|
|
void
|
|
ModuleLoadRequest::SetReady()
|
|
{
|
|
// Mark a module as ready to execute. This means that this module and all it
|
|
// dependencies have had their source loaded, parsed as a module and the
|
|
// modules instantiated.
|
|
//
|
|
// The mReady promise is used to ensure that when all dependencies of a module
|
|
// have become ready, DependenciesLoaded is called on that module
|
|
// request. This is set up in StartFetchingModuleDependencies.
|
|
|
|
#ifdef DEBUG
|
|
for (size_t i = 0; i < mImports.Length(); i++) {
|
|
MOZ_ASSERT(mImports[i]->IsReadyToRun());
|
|
}
|
|
#endif
|
|
|
|
ScriptLoadRequest::SetReady();
|
|
mReady.ResolveIfExists(true, __func__);
|
|
}
|
|
|
|
void
|
|
ModuleLoadRequest::ModuleLoaded()
|
|
{
|
|
// A module that was found to be marked as fetching in the module map has now
|
|
// been loaded.
|
|
|
|
mModuleScript = mLoader->GetFetchedModule(mURI);
|
|
if (!mModuleScript || mModuleScript->HasParseError()) {
|
|
ModuleErrored();
|
|
return;
|
|
}
|
|
|
|
mLoader->StartFetchingModuleDependencies(this);
|
|
}
|
|
|
|
void
|
|
ModuleLoadRequest::ModuleErrored()
|
|
{
|
|
mLoader->CheckModuleDependenciesLoaded(this);
|
|
MOZ_ASSERT(!mModuleScript || mModuleScript->HasParseError());
|
|
|
|
CancelImports();
|
|
SetReady();
|
|
LoadFinished();
|
|
}
|
|
|
|
void
|
|
ModuleLoadRequest::DependenciesLoaded()
|
|
{
|
|
// The module and all of its dependencies have been successfully fetched and
|
|
// compiled.
|
|
|
|
MOZ_ASSERT(mModuleScript);
|
|
|
|
mLoader->CheckModuleDependenciesLoaded(this);
|
|
SetReady();
|
|
LoadFinished();
|
|
}
|
|
|
|
void
|
|
ModuleLoadRequest::LoadFailed()
|
|
{
|
|
// We failed to load the source text or an error occurred unrelated to the
|
|
// content of the module (e.g. OOM).
|
|
|
|
MOZ_ASSERT(!mModuleScript);
|
|
|
|
Cancel();
|
|
LoadFinished();
|
|
}
|
|
|
|
void
|
|
ModuleLoadRequest::LoadFinished()
|
|
{
|
|
mLoader->ProcessLoadedModuleTree(this);
|
|
mLoader = nullptr;
|
|
mParent = nullptr;
|
|
}
|
|
|
|
} // dom namespace
|
|
} // mozilla namespace
|