有没有办法让这段代码在Greasemonkey/Scriptish中工作,或者我必须把它注入到网页本身?
body = document.getElementsByTagName("body")[0];
fakeConsole = 'window.top._console';
injected = document.getElementById("sandbox") ? true : false;
sandboxframe = injected ? document.getElementsById("sandbox") : document.createElement('iframe');
sandbox = null;
if (!injected) {
body.appendChild(sandboxframe);
sandboxframe.setAttribute('id', 'sandbox');
sandboxframe.setAttribute('style', "display:none")
}
var p = sandboxframe.contentWindow.eval('1 + 1');
console.log(p);下面的代码在使用source时可以正常工作:
<script type="text/javascript" src="test.js"></script>但在Greasemonkey脚本中使用时,我注意到有某种我不太熟悉的安全屏障,并尝试使用unsafeWindow绕过XPCNativeWrapper。
请说明一下这一点。
发布于 2012-09-27 10:16:11
几件事:
getElementsById不是一个函数。@grant none不可能实现的Greasemonkey场景;你将不得不注入“注入”()代码。eval()。eval()使性能、维护、调试和安全性变得更加困难。
对于Greasemonkey 1.0及更高版本:
在某些情况下,Greasemonkey不再使用XPCNativeWrapper。参见the doc for the @grant directive。
因此,这意味着(1)如果您的脚本没有使用GM_函数,(2)脚本指定了@grant none,那么您的代码将按原样运行( getElementsById输入错误除外)。
请注意,没有其他脚本引擎可以做到这一点。(为了更好的理由。Greasemonkey关于@grant和沙箱的新行为充其量也是有争议的。)
如果您希望使用GM_函数,则必须注入iframe代码。请参阅下一节。
对于脚本、特权Greasemonkey、Chrome等:
Scriptish、沙盒Greasemonkey、Chrome等在各自的沙盒中都不能很好地处理iframe。(请参阅these Q's, for example。)
从GM/userscript运行这类代码的唯一可靠方法是注入它。如下所示:
function gmMain () {
body = document.getElementsByTagName("body")[0];
fakeConsole = 'window.top._console';
injected = document.getElementById("sandbox") ? true : false;
sandboxframe = injected ? document.getElementById("sandbox") : document.createElement('iframe');
sandbox = null;
if (!injected) {
body.appendChild(sandboxframe);
sandboxframe.setAttribute('id', 'sandbox');
sandboxframe.setAttribute('style', "display:none")
}
var p = sandboxframe.contentWindow.eval('1 + 1');
console.log(p);
}
addJS_Node (null, null, gmMain);
function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
var D = document;
var scriptNode = D.createElement ('script');
if (runOnLoad) {
scriptNode.addEventListener ("load", runOnLoad, false);
}
scriptNode.type = "text/javascript";
if (text) scriptNode.textContent = text;
if (s_URL) scriptNode.src = s_URL;
if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
targ.appendChild (scriptNode);
}https://stackoverflow.com/questions/12608620
复制相似问题