in src/extension-runners/chromium.js [268:334]
async createReloadManagerExtension() {
const tmpDir = new TempDir();
await tmpDir.create();
this.registerCleanup(() => tmpDir.remove());
const extPath = path.join(
tmpDir.path(),
`reload-manager-extension-${Date.now()}`,
);
log.debug(`Creating reload-manager-extension in ${extPath}`);
await fs.mkdir(extPath, { recursive: true });
await fs.writeFile(
path.join(extPath, 'manifest.json'),
JSON.stringify({
manifest_version: 2,
name: 'web-ext Reload Manager Extension',
version: '1.0',
permissions: ['management', 'tabs'],
background: {
scripts: ['bg.js'],
},
}),
);
const wssInfo = this.wss.address();
const bgPage = `(function bgPage() {
async function getAllDevExtensions() {
const allExtensions = await new Promise(
r => chrome.management.getAll(r));
return allExtensions.filter((extension) => {
return extension.enabled &&
extension.installType === "development" &&
extension.id !== chrome.runtime.id;
});
}
const setEnabled = (extensionId, value) =>
chrome.runtime.id == extensionId ?
new Promise.resolve() :
new Promise(r => chrome.management.setEnabled(extensionId, value, r));
async function reloadExtension(extensionId) {
await setEnabled(extensionId, false);
await setEnabled(extensionId, true);
}
const ws = new window.WebSocket(
"ws://${wssInfo.address}:${wssInfo.port}");
ws.onmessage = async (evt) => {
const msg = JSON.parse(evt.data);
if (msg.type === 'webExtReloadAllExtensions') {
const devExtensions = await getAllDevExtensions();
await Promise.all(devExtensions.map(ext => reloadExtension(ext.id)));
ws.send(JSON.stringify({ type: 'webExtReloadExtensionComplete' }));
}
};
})()`;
await fs.writeFile(path.join(extPath, 'bg.js'), bgPage);
return extPath;
}