GM_Polyfill

Provide GM_functions in non-ScriptManager-environment

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greasyfork.org/scripts/429613/975941/GM_Polyfill.js

Author
PYUDNG
Version
0.3
Created
2021-07-19
Updated
2021-10-03
License
N/A

GM_Polyfill

在没有脚本管理器环境下提供常用的GM_函数和对象,目前提供的函数和对象有:

  • GM_setValue
  • GM_getValue
  • GM_listValue
  • GM_deleteValue
  • GM_xmlhttpRequest
  • GM_openInTab
  • GM_setClipboard
  • unsafeWindow

用法

引用/热加载/引入此js库

请务必确保GM_Polyfill库在您的代码调用相关GM_函数前加载完毕。如果您的脚本运行环境不支持@require,那么您就应动态加载GM_Polyfill库(下为动态加载可用代码),或者将本库的代码复制到您的脚本中。

// Load GM_Polyfill
loadJS('https://greasyfork.org/scripts/429613/code/GM_Polyfill.js', function() {
	// Your code here...
})

// Load javascript from given url
function loadJS(url, callback, oDoc = document) {
	var script = document.createElement('script'),
		fn = callback || function () {};
	script.type = 'text/javascript';

	//IE
	if (script.readyState) {
		script.onreadystatechange = function () {
			if (script.readyState == 'loaded' || script.readyState == 'complete') {
				script.onreadystatechange = null;
				fn();
			}
		};
	} else {
		//其他浏览器
		script.onload = function () {
			fn();
		};
	}

	script.src = url;
	oDoc.getElementsByTagName('head')[0].appendChild(script);
}


使用GM_Polyfill库填补缺失的GM_函数

GM_Polyfill库仅仅提供一个接口:GM_PolyFill函数(注意大小写),调用此函数就会自动填充缺失的GM_函数。
返回值:一个对象,标明了各个函数是否因为缺失而被GM_Polyfill库填补,其结构如下:


const GM_POLYFILLED = {
	GM_setValue: boolean,
	GM_getValue: boolean,
	GM_deleteValue: boolean,
	GM_listValues: boolean,
	GM_xmlhttpRequest: boolean,
	GM_openInTab: boolean,
	GM_setClipboard: boolean,
}
GM_PolyFill函数仅接受一个字符串参数:name。此参数将作为存储空间中访问您的脚本储存空间的凭据,不同的name对应着不同的储存空间。所有的GM_存储函数都将在此name所对应的存储空间下工作。如果不提供此参数,将默认此参数值为'default'。如果您不知道此参数应该填写什么,那么建议填写脚本名称(即@name)+脚本命名空间(即@namespace)



有关name的更多说明
类比来说,就像Tempermonkey存储空间的沙盒机制——即每个脚本的存储空间与其他脚本的存储空间相互独立一样,GM_Polyfill库提供的存储机制和也力图将不同的脚本的储存空间区分开来;但是由于GM_Polyfill库运行在一个没有脚本管理器的低权限环境下,无法区分不同的脚本,于是就通过脚本调用时主动提供一个name参数,依此来区分不同的脚本,并提供不同的储存空间;但请注意,这仅仅能大概率上防止储存空间的意外冲突,但并不能阻止其他脚本甚至是网页代码来试图读取您储存的信息,任何脚本或代码都可以从localStorage中读取您的脚本储存的信息,并修改这些信息(无论是无意的还是有意的)。



说明

有关功能

本程序的工作原理为通过原生js实现了部分GM_函数,所以会有诸多功能上的限制,具体的限制如下:

  • GM_setValue GM_getValue GM_listValue GM_deleteValue的所有数据均存储在localStorage['GM_STORAGE_POLYFILL'][name]下,任何其他代码均能任意访问、修改和删除存储空间内的数据。使用时,应当使用不同的name参数以避免冲突,并且避免存储敏感数据以降低恶意的访问带来的风险。
  • GM_xmlhttpRequest不能执行跨域请求。不支持details参数的synchronous binary nocache revalidate context fetch属性,不支持onload事件处理器函数参数的finalUrl属性
  • GM_openInTab仅仅是通过window.open简单地打开新窗口,仅仅支持参数一(url),不支持参数二
  • GM_setClipboard仅仅在事件处理函数中有效

示例(使用了GM_Polyfill库的)脚本:

轻小说文库+:使用了GM_Polyfill库使其可以完全脱离脚本管理器的执行环境,甚至可以直接通过书签动态加载到页面并正常执行。