aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesús <heckyel@hyperbola.info>2019-12-06 21:45:39 -0500
committerJesús <heckyel@hyperbola.info>2019-12-06 21:45:39 -0500
commit09eea773907768da43f354580671c6e9d7e851f2 (patch)
tree2c29a1d71b480846d0a7514c25bb659231f60930
parentf9412b3ba4245b15253ea192aa79f51f661b7eda (diff)
downloadbook-09eea773907768da43f354580671c6e9d7e851f2.tar.lz
book-09eea773907768da43f354580671c6e9d7e851f2.tar.xz
book-09eea773907768da43f354580671c6e9d7e851f2.zip
Improve syntax Greasemonkey 4 APIs
-rw-r--r--scripts-greasemonkey/gm4-polyfill.js197
1 files changed, 98 insertions, 99 deletions
diff --git a/scripts-greasemonkey/gm4-polyfill.js b/scripts-greasemonkey/gm4-polyfill.js
index ca91ef0..32d79cd 100644
--- a/scripts-greasemonkey/gm4-polyfill.js
+++ b/scripts-greasemonkey/gm4-polyfill.js
@@ -1,131 +1,130 @@
/*
-This helper script bridges compatibility between the Greasemonkey 4 APIs and
-existing/legacy APIs. Say for example your user script includes
+ This helper script bridges compatibility between the Greasemonkey 4 APIs and
+ existing/legacy APIs. Say for example your user script includes
- // @grant GM_getValue
+ // @grant GM_getValue
-And you'd like to be compatible with both Greasemonkey 3 and Greasemonkey 4
-(and for that matter all versions of Violentmonkey, Tampermonkey, and any other
-user script engine). Add:
+ And you'd like to be compatible with both Greasemonkey 3 and Greasemonkey 4
+ (and for that matter all versions of Violentmonkey, Tampermonkey, and any other
+ user script engine). Add:
- // @grant GM.getValue
- // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
+ // @grant GM.getValue
+ // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
-And switch to the new (GM-dot) APIs, which return promises. If your script
-is running in an engine that does not provide the new asynchronous APIs, this
-helper will add them, based on the old APIs.
+ And switch to the new (GM-dot) APIs, which return promises. If your script
+ is running in an engine that does not provide the new asynchronous APIs, this
+ helper will add them, based on the old APIs.
-If you use `await` at the top level, you'll need to wrap your script in an
-`async` function to be compatible with any user script engine besides
-Greasemonkey 4.
+ If you use `await` at the top level, you'll need to wrap your script in an
+ `async` function to be compatible with any user script engine besides
+ Greasemonkey 4.
- (async () => {
- let x = await GM.getValue('x');
- })();
+ (async () => {
+ let x = await GM.getValue('x');
+ })();
*/
if (typeof GM == 'undefined') {
- this.GM = {};
+ this.GM = {};
}
if (typeof GM_addStyle == 'undefined') {
- this.GM_addStyle = (aCss) => {
- 'use strict';
- let head = document.getElementsByTagName('head')[0];
- if (head) {
- let style = document.createElement('style');
- style.setAttribute('type', 'text/css');
- style.textContent = aCss;
- head.appendChild(style);
- return style;
- }
- return null;
- };
+ this.GM_addStyle = (aCss) => {
+ 'use strict';
+ let head = document.getElementsByTagName('head')[0];
+ if (head) {
+ let style = document.createElement('style');
+ style.setAttribute('type', 'text/css');
+ style.textContent = aCss;
+ head.appendChild(style);
+ return style;
+ }
+ return null;
+ };
}
if (typeof GM_registerMenuCommand == 'undefined') {
- this.GM_registerMenuCommand = (caption, commandFunc, accessKey) => {
- if (!document.body) {
- if (document.readyState === 'loading'
- && document.documentElement && document.documentElement.localName === 'html') {
- new MutationObserver((mutations, observer) => {
- if (document.body) {
- observer.disconnect();
- GM_registerMenuCommand(caption, commandFunc, accessKey);
- }
- }).observe(document.documentElement, {childList: true});
- } else {
- console.error('GM_registerMenuCommand got no body.');
- }
- return;
- }
- let contextMenu = document.body.getAttribute('contextmenu');
- let menu = (contextMenu ? document.querySelector('menu#' + contextMenu) : null);
- if (!menu) {
- menu = document.createElement('menu');
- menu.setAttribute('id', 'gm-registered-menu');
- menu.setAttribute('type', 'context');
- document.body.appendChild(menu);
- document.body.setAttribute('contextmenu', 'gm-registered-menu');
- }
- let menuItem = document.createElement('menuitem');
- menuItem.textContent = caption;
- menuItem.addEventListener('click', commandFunc, true);
- menu.appendChild(menuItem);
- };
+ this.GM_registerMenuCommand = (caption, commandFunc, accessKey) => {
+ if (!document.body) {
+ if (document.readyState === 'loading'
+ && document.documentElement && document.documentElement.localName === 'html') {
+ new MutationObserver((mutations, observer) => {
+ if (document.body) {
+ observer.disconnect();
+ GM_registerMenuCommand(caption, commandFunc, accessKey);
+ }
+ }).observe(document.documentElement, {childList: true});
+ } else {
+ console.error('GM_registerMenuCommand got no body.');
+ }
+ return;
+ }
+ let contextMenu = document.body.getAttribute('contextmenu');
+ let menu = (contextMenu ? document.querySelector('menu#' + contextMenu) : null);
+ if (!menu) {
+ menu = document.createElement('menu');
+ menu.setAttribute('id', 'gm-registered-menu');
+ menu.setAttribute('type', 'context');
+ document.body.appendChild(menu);
+ document.body.setAttribute('contextmenu', 'gm-registered-menu');
+ }
+ let menuItem = document.createElement('menuitem');
+ menuItem.textContent = caption;
+ menuItem.addEventListener('click', commandFunc, true);
+ menu.appendChild(menuItem);
+ };
}
if (typeof GM_getResourceText == 'undefined') {
- this.GM_getResourceText = (aRes) => {
- 'use strict';
- return GM.getResourceUrl(aRes)
- .then(url => fetch(url))
- .then(resp => resp.text())
- .catch(function(error) {
- GM.log('Request failed', error);
- return null;
- });
- };
+ this.GM_getResourceText = (aRes) => {
+ 'use strict';
+ return GM.getResourceUrl(aRes)
+ .then(url => fetch(url))
+ .then(resp => resp.text())
+ .catch(function(error) {
+ GM.log('Request failed', error);
+ return null;
+ });
+ };
}
Object.entries({
- 'log': console.log.bind(console), // Pale Moon compatibility. See #13.
- 'info': GM_info,
+ 'log': console.log.bind(console), // Pale Moon compatibility. See #13.
+ 'info': GM_info,
}).forEach(([newKey, old]) => {
- if (old && (typeof GM[newKey] == 'undefined')) {
- GM[newKey] = old;
- }
+ if (old && (typeof GM[newKey] == 'undefined')) {
+ GM[newKey] = old;
+ }
});
-
Object.entries({
- 'GM_addStyle': 'addStyle',
- 'GM_deleteValue': 'deleteValue',
- 'GM_getResourceURL': 'getResourceUrl',
- 'GM_getValue': 'getValue',
- 'GM_listValues': 'listValues',
- 'GM_notification': 'notification',
- 'GM_openInTab': 'openInTab',
- 'GM_registerMenuCommand': 'registerMenuCommand',
- 'GM_setClipboard': 'setClipboard',
- 'GM_setValue': 'setValue',
- 'GM_xmlhttpRequest': 'xmlHttpRequest',
- 'GM_getResourceText': 'getResourceText',
+ 'GM_addStyle': 'addStyle',
+ 'GM_deleteValue': 'deleteValue',
+ 'GM_getResourceURL': 'getResourceUrl',
+ 'GM_getValue': 'getValue',
+ 'GM_listValues': 'listValues',
+ 'GM_notification': 'notification',
+ 'GM_openInTab': 'openInTab',
+ 'GM_registerMenuCommand': 'registerMenuCommand',
+ 'GM_setClipboard': 'setClipboard',
+ 'GM_setValue': 'setValue',
+ 'GM_xmlhttpRequest': 'xmlHttpRequest',
+ 'GM_getResourceText': 'getResourceText',
}).forEach(([oldKey, newKey]) => {
- let old = this[oldKey];
- if (old && (typeof GM[newKey] == 'undefined')) {
- GM[newKey] = function(...args) {
- return new Promise((resolve, reject) => {
- try {
- resolve(old.apply(this, args));
- } catch (e) {
- reject(e);
- }
- });
- };
- }
+ let old = this[oldKey];
+ if (old && (typeof GM[newKey] == 'undefined')) {
+ GM[newKey] = function(...args) {
+ return new Promise((resolve, reject) => {
+ try {
+ resolve(old.apply(this, args));
+ } catch (e) {
+ reject(e);
+ }
+ });
+ };
+ }
});