UNPKG

mock-violentmonkey

Version:

Mock violentmonkey's globals for testing userscripts

55 lines 2.09 kB
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