Files
001code-html--cocos/scratch-vm/test/unit/tw_extension_manager.js
刘宇飞 6e0a1fbcbb 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>
2026-06-16 15:37:45 +08:00

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();
});