mock-violentmonkey
Version:
Mock violentmonkey's globals for testing userscripts
55 lines • 2.09 kB
JavaScript
import { BetterMap } from '../utils/index.js';
import { VMStorage } from '../vm-storage.js';
import { XMLHttpRequest } from '../xmlhttprequest/index.js';
import { GM_info } from './info.js';
const contextResources = new VMStorage(() => new BetterMap());
const getResourceObject = (name) => contextResources.get(true).get(name);
const setResource = async (name, url) => {
url = url.trim();
if (!url.startsWith('http://') && !url.startsWith('https://')) {
throw new Error(`Expected an absolute http url, got ${url} instead`);
}
// Throw early if it's an obviously invalid url
url = new URL(url).href;
await new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.addEventListener('load', () => {
const contentType = xhr.getResponseHeader('content-type') ||
'text/plain';
const blob = new Blob([xhr.responseBuffer], { type: contentType });
const blobURL = URL.createObjectURL(blob);
contextResources.get(true).set(name, {
url: blobURL,
text: xhr.responseBuffer.toString(),
});
const { resources } = GM_info().script;
for (const resource of resources) {
if (resource.name === name) {
resource.url = url;
resolve();
return;
}
}
resources.push({
name,
url,
});
resolve();
});
xhr.addEventListener('error', reject);
xhr.open('get', url);
xhr.send();
});
};
const getResourceText = name => getResourceObject(name)?.text;
const getResourceURL = name => getResourceObject(name)?.url;
export { setResource, getResourceText as GM_getResourceText, getResourceURL as GM_getResourceURL, };
Object.defineProperties(globalThis, {
GM_getResourceURL: {
value: getResourceURL,
},
GM_getResourceText: {
value: getResourceText,
},
});
//# sourceMappingURL=resource.js.map