Greasemonkey: mock the new GM4 promises based API.
Based on the gm4-polyfill.js script from the greasemonkey devs. But not the same because that script doesn't work for us for a couple of reasons: * It assumes all GM_* functions are attributes of `this` which in this case is the global window object. Which breaks it out of our iife. It is possible to change what `this` is within the iife but then we would have to do something weird to ensure the functions were available with the leading `this.`. And I don't think user javascripts tend to call GM functions like that anyway, that polyfill script is just making weird assumptions and then claiming it'll work for "any user script engine". * It tries to provide implementations of GM_registerMenuCommand and GM_getResource text which do unexpected thins or implement a circular dependency on the new version, respectively.
This commit is contained in:
parent
a76c0067e1
commit
33d66676c9
@ -110,6 +110,42 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stub these two so that the gm4 polyfill script doesn't try to
|
||||||
|
// create broken versions as attributes of window.
|
||||||
|
function GM_getResourceText(caption, commandFunc, accessKey) {
|
||||||
|
console.error(`${GM_info.script.name} called unimplemented GM_getResourceText`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function GM_registerMenuCommand(caption, commandFunc, accessKey) {
|
||||||
|
console.error(`${GM_info.script.name} called unimplemented GM_registerMenuCommand`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mock the greasemonkey 4.0 async API.
|
||||||
|
const GM = {};
|
||||||
|
GM.info = GM_info;
|
||||||
|
Object.entries({
|
||||||
|
'log': GM_log,
|
||||||
|
'addStyle': GM_addStyle,
|
||||||
|
'deleteValue': GM_deleteValue,
|
||||||
|
'getValue': GM_getValue,
|
||||||
|
'listValues': GM_listValues,
|
||||||
|
'openInTab': GM_openInTab,
|
||||||
|
'setValue': GM_setValue,
|
||||||
|
'xmlHttpRequest': GM_xmlhttpRequest,
|
||||||
|
}).forEach(([newKey, old]) => {
|
||||||
|
if (old && (typeof GM[newKey] == 'undefined')) {
|
||||||
|
GM[newKey] = function(...args) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
resolve(old(...args));
|
||||||
|
} catch (e) {
|
||||||
|
reject(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const unsafeWindow = window;
|
const unsafeWindow = window;
|
||||||
|
|
||||||
// ====== The actual user script source ====== //
|
// ====== The actual user script source ====== //
|
||||||
|
Loading…
Reference in New Issue
Block a user