Includes scratch-gui, scratch-vm, scratch-blocks, scratch-render, scratch-l10n, and deployment config. Co-authored-by: Cursor <cursoragent@cursor.com>
81 lines
3.0 KiB
JavaScript
81 lines
3.0 KiB
JavaScript
const {test} = require('tap');
|
|
const ExtensionManager = require('../../src/extension-support/extension-manager');
|
|
const VM = require('../../src/virtual-machine');
|
|
|
|
test('isBuiltinExtension', t => {
|
|
const fakeRuntime = {};
|
|
const manager = new ExtensionManager(fakeRuntime);
|
|
t.equal(manager.isBuiltinExtension('pen'), true);
|
|
t.equal(manager.isBuiltinExtension('lksdfjlskdf'), false);
|
|
t.end();
|
|
});
|
|
|
|
test('_isValidExtensionURL', t => {
|
|
const fakeRuntime = {};
|
|
const manager = new ExtensionManager(fakeRuntime);
|
|
t.equal(manager._isValidExtensionURL('fetch'), false);
|
|
t.equal(manager._isValidExtensionURL(''), false);
|
|
t.equal(manager._isValidExtensionURL('extensions.turbowarp.org/fetch.js'), false);
|
|
t.equal(manager._isValidExtensionURL('https://extensions.turbowarp.org/fetch.js'), true);
|
|
t.equal(manager._isValidExtensionURL('http://extensions.turbowarp.org/fetch.js'), true);
|
|
t.equal(manager._isValidExtensionURL('http://localhost:8000'), true);
|
|
t.equal(manager._isValidExtensionURL('data:application/javascript;base64,YWxlcnQoMSk='), true);
|
|
t.equal(manager._isValidExtensionURL('file:///home/test/extension.js'), true);
|
|
t.end();
|
|
});
|
|
|
|
test('loadExtensionURL, getExtensionURLs, deduplication', async t => {
|
|
const vm = new VM();
|
|
|
|
let loadedExtensions = 0;
|
|
vm.extensionManager.securityManager.getSandboxMode = () => 'unsandboxed';
|
|
global.document = {
|
|
createElement: () => {
|
|
loadedExtensions++;
|
|
const element = {};
|
|
setTimeout(() => {
|
|
global.Scratch.extensions.register({
|
|
getInfo: () => ({
|
|
id: `extension${loadedExtensions}`
|
|
})
|
|
});
|
|
});
|
|
return element;
|
|
},
|
|
body: {
|
|
appendChild: () => {}
|
|
}
|
|
};
|
|
|
|
const url1 = 'https://turbowarp.org/1.js';
|
|
t.equal(vm.extensionManager.isExtensionURLLoaded(url1), false);
|
|
t.same(vm.extensionManager.getExtensionURLs(), {});
|
|
await vm.extensionManager.loadExtensionURL(url1);
|
|
t.equal(vm.extensionManager.isExtensionURLLoaded(url1), true);
|
|
t.equal(loadedExtensions, 1);
|
|
t.same(vm.extensionManager.getExtensionURLs(), {
|
|
extension1: url1
|
|
});
|
|
|
|
// Loading the extension again should do nothing.
|
|
await vm.extensionManager.loadExtensionURL(url1);
|
|
t.equal(vm.extensionManager.isExtensionURLLoaded(url1), true);
|
|
t.equal(loadedExtensions, 1);
|
|
t.same(vm.extensionManager.getExtensionURLs(), {
|
|
extension1: url1
|
|
});
|
|
|
|
// Loading another extension should work
|
|
const url2 = 'https://turbowarp.org/2.js';
|
|
t.equal(vm.extensionManager.isExtensionURLLoaded(url2), false);
|
|
await vm.extensionManager.loadExtensionURL(url2);
|
|
t.equal(vm.extensionManager.isExtensionURLLoaded(url2), true);
|
|
t.equal(loadedExtensions, 2);
|
|
t.same(vm.extensionManager.getExtensionURLs(), {
|
|
extension1: url1,
|
|
extension2: url2
|
|
});
|
|
|
|
t.end();
|
|
});
|