gm-resource.test.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import test from 'tape';
  2. import { buffer2string } from '#/common';
  3. import { makeGmApiWrapper } from '#/injected/web/gm-wrapper';
  4. import bridge from '#/injected/web/bridge';
  5. const stringAsBase64 = str => btoa(buffer2string(new TextEncoder().encode(str).buffer));
  6. const blobAsText = async blobUrl => new Promise(resolve => {
  7. const fr = new FileReader();
  8. fr.onload = () => resolve(new TextDecoder().decode(fr.result));
  9. fr.readAsArrayBuffer(URL._cache[blobUrl]);
  10. });
  11. // WARNING: don't include D800-DFFF range which is for surrogate pairs
  12. const RESOURCE_TEXT = 'abcd\u1234\u2345\u3456\u4567\u5678\u6789\u789A\u89AB\u9ABC\uABCD';
  13. /** @type VMScript */
  14. const script = {
  15. config: {},
  16. custom: {},
  17. props: {
  18. id: 1,
  19. },
  20. meta: {
  21. grant: [
  22. 'GM_getResourceText',
  23. 'GM_getResourceURL',
  24. ],
  25. resources: {
  26. foo: 'https://dummy.url/foo.txt',
  27. },
  28. },
  29. };
  30. const wrapper = makeGmApiWrapper(script);
  31. bridge.cache = {
  32. [script.meta.resources.foo]: `text/plain,${stringAsBase64(RESOURCE_TEXT)}`,
  33. };
  34. test('@resource decoding', async (t) => {
  35. t.equal(wrapper.GM_getResourceText('foo'), RESOURCE_TEXT, 'GM_getResourceText');
  36. t.equal(await blobAsText(wrapper.GM_getResourceURL('foo')), RESOURCE_TEXT, 'GM_getResourceURL');
  37. t.end();
  38. });