43 lines
1.6 KiB
JavaScript
43 lines
1.6 KiB
JavaScript
/* 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/. */
|
|
|
|
const { DevToolsLoader } = ChromeUtils.importESModule(
|
|
"resource://devtools/shared/loader/Loader.sys.mjs",
|
|
// `global: "devtools"` will import the loader in a special priviledged
|
|
// global created for DevTools, which will be reused as the shared global
|
|
// to load additional modules for the "DistinctSystemPrincipalLoader".
|
|
{ global: "devtools" }
|
|
);
|
|
|
|
// When debugging system principal resources (JSMs, chrome documents, ...)
|
|
// We have to load DevTools actors in another system principal global.
|
|
// That's mostly because of spidermonkey's Debugger API which requires
|
|
// debuggee and debugger to be in distinct principals.
|
|
//
|
|
// We try to hold a single instance of this special loader via this API.
|
|
//
|
|
// @param requester object
|
|
// Object/instance which is using the loader.
|
|
// The same requester object should be passed to release method.
|
|
let systemLoader = null;
|
|
const systemLoaderRequesters = new Set();
|
|
|
|
export function useDistinctSystemPrincipalLoader(requester) {
|
|
if (!systemLoader) {
|
|
systemLoader = new DevToolsLoader({
|
|
useDevToolsLoaderGlobal: true,
|
|
});
|
|
systemLoaderRequesters.clear();
|
|
}
|
|
systemLoaderRequesters.add(requester);
|
|
return systemLoader;
|
|
}
|
|
|
|
export function releaseDistinctSystemPrincipalLoader(requester) {
|
|
systemLoaderRequesters.delete(requester);
|
|
if (systemLoaderRequesters.size == 0) {
|
|
systemLoader.destroy();
|
|
systemLoader = null;
|
|
}
|
|
}
|