Make addBuiltinExtension per-VM, not global

This commit is contained in:
Muffin committed 2023-08-23 13:37:04 -05:00
1 parent 1cb2549c6b
commit 8b43eae4de
2 files changed
+19 -5

No files matched your search

+7 -5
View File
@@ -9,7 +9,7 @@ const SecurityManager = require('./tw-security-manager');
// TODO: move these out into a separate repository?
// TODO: change extension spec so that library info, including extension ID, can be collected through static methods
const builtinExtensions = {
const defaultBuiltinExtensions = {
// This is an example that isn't loaded with the other core blocks,
// but serves as a reference for loading core blocks as extensions.
coreExample: () => require('../blocks/scratch3_core_example'),
@@ -125,6 +125,8 @@ class ExtensionManager {
this.loadingAsyncExtensions = 0;
this.asyncExtensionsLoadedCallbacks = [];
this.builtinExtensions = Object.assign({}, defaultBuiltinExtensions);
dispatch.setService('extensions', createExtensionService(this)).catch(e => {
log.error(`ExtensionManager was unable to register extension service: ${JSON.stringify(e)}`);
});
@@ -148,7 +150,7 @@ class ExtensionManager {
* @returns {boolean}
*/
isBuiltinExtension (extensionId) {
return Object.prototype.hasOwnProperty.call(builtinExtensions, extensionId);
return Object.prototype.hasOwnProperty.call(this.builtinExtensions, extensionId);
}
/**
@@ -169,7 +171,7 @@ class ExtensionManager {
return;
}
const extension = builtinExtensions[extensionId]();
const extension = this.builtinExtensions[extensionId]();
const extensionInstance = new extension(this.runtime);
const serviceName = this._registerInternalExtension(extensionInstance);
this._loadedExtensions.set(extensionId, serviceName);
@@ -177,7 +179,7 @@ class ExtensionManager {
}
addBuiltinExtension (extensionId, extensionClass) {
builtinExtensions[extensionId] = () => extensionClass;
this.builtinExtensions[extensionId] = () => extensionClass;
}
_isValidExtensionURL (extensionURL) {
@@ -593,7 +595,7 @@ class ExtensionManager {
getExtensionURLs () {
const extensionURLs = {};
for (const [extensionId, serviceName] of this._loadedExtensions.entries()) {
if (builtinExtensions.hasOwnProperty(extensionId)) {
if (this.builtinExtensions.hasOwnProperty(extensionId)) {
continue;
}
@@ -46,3 +46,15 @@ test('addBuiltingExtension', t => {
vm.runtime._step();
});
});
test('each runtime has own set of extensions', t => {
const vm1 = new VM();
const vm2 = new VM();
vm1.extensionManager.addBuiltinExtension('testbuiltin', TestBuiltinExtension)
t.ok(vm1.extensionManager.isBuiltinExtension('testbuiltin'));
t.notOk(vm2.extensionManager.isBuiltinExtension('testbuiltin'));
t.end();
});