gecko-dev/dom/script/ModuleLoader.h
Jon Coppeard f9febfda89 Bug 1871075 - Part 1: Store referencing private as a pointer to the underlying LoadedScript r=yulia
In Gecko we use a LoadedScript pointer as the referencing private for dynamic
imports. This is passed through the JS engine as a private value, which doesn't
care what it means. Currently we store this in the module loader as a JS::Value,
but we could just as well unpack it since we know what it is. That lets use a
RefPtr which also keeps it alive and will let use remove some manual reference
counting.

We also don't need to pass it to the CreateDynamicImport method twice.

This change makes it the responsibility of the module loader for keeping the
referencing private alive until FinishDynamicModuleImport is called.

Differential Revision: https://phabricator.services.mozilla.com/D196974
2023-12-21 13:30:34 +00:00

92 lines
2.7 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/. */
#ifndef mozilla_dom_ModuleLoader_h
#define mozilla_dom_ModuleLoader_h
#include "mozilla/dom/ScriptLoadContext.h"
#include "js/loader/ModuleLoaderBase.h"
#include "js/loader/ScriptLoadRequest.h"
#include "ScriptLoader.h"
class nsIURI;
namespace JS {
class CompileOptions;
namespace loader {
class ModuleLoadRequest;
} // namespace loader
} // namespace JS
namespace mozilla::dom {
class ScriptLoader;
class SRIMetadata;
//////////////////////////////////////////////////////////////
// DOM Module loader implementation
//////////////////////////////////////////////////////////////
class ModuleLoader final : public JS::loader::ModuleLoaderBase {
private:
virtual ~ModuleLoader();
public:
enum Kind { Normal, WebExtension };
ModuleLoader(ScriptLoader* aLoader, nsIGlobalObject* aGlobalObject,
Kind aKind);
Kind GetKind() const { return mKind; }
ScriptLoader* GetScriptLoader();
bool CanStartLoad(ModuleLoadRequest* aRequest, nsresult* aRvOut) override;
nsresult StartFetch(ModuleLoadRequest* aRequest) override;
void OnModuleLoadComplete(ModuleLoadRequest* aRequest) override;
nsresult CompileFetchedModule(
JSContext* aCx, JS::Handle<JSObject*> aGlobal,
JS::CompileOptions& aOptions, ModuleLoadRequest* aRequest,
JS::MutableHandle<JSObject*> aModuleScript) override;
// Create a top-level module load request.
static already_AddRefed<ModuleLoadRequest> CreateTopLevel(
nsIURI* aURI, ReferrerPolicy aReferrerPolicy,
ScriptFetchOptions* aFetchOptions, const SRIMetadata& aIntegrity,
nsIURI* aReferrer, ScriptLoader* aLoader, ScriptLoadContext* aContext);
// Create a module load request for a static module import.
already_AddRefed<ModuleLoadRequest> CreateStaticImport(
nsIURI* aURI, ModuleLoadRequest* aParent) override;
// Create a module load request for a dynamic module import.
already_AddRefed<ModuleLoadRequest> CreateDynamicImport(
JSContext* aCx, nsIURI* aURI, LoadedScript* aMaybeActiveScript,
JS::Handle<JSString*> aSpecifier,
JS::Handle<JSObject*> aPromise) override;
static ModuleLoader* From(ModuleLoaderBase* aLoader) {
return static_cast<ModuleLoader*>(aLoader);
}
void AsyncExecuteInlineModule(ModuleLoadRequest* aRequest);
void ExecuteInlineModule(ModuleLoadRequest* aRequest);
private:
const Kind mKind;
};
} // namespace mozilla::dom
#endif // mozilla_dom_ModuleLoader_h