Initial commit of 001code-html Scratch frontend project.
Includes scratch-gui, scratch-vm, scratch-blocks, scratch-render, scratch-l10n, and deployment config. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
80
scratch-vm/test/unit/tw_extension_manager.js
Normal file
80
scratch-vm/test/unit/tw_extension_manager.js
Normal file
@@ -0,0 +1,80 @@
|
||||
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();
|
||||
});
|
||||
Reference in New Issue
Block a user