如何在Chrome中模仿Greasemonkey/Firefox的unsafeWindow功能?

b3n*_*ng0 6 javascript greasemonkey google-chrome

我现在正在摆弄chrome中的用户脚本,所以请忍受我潜在的无知/白痴.

在我正在编写脚本的页面中,有一个<script>声明变量的元素x.这是否意味着,在我的用户脚本中,我只能x从全局命名空间访问?

例如,如果我的用户脚本中的唯一一行是alert(x);,那应该按预期工作(假设x是一个字符串)?我知道chrome不支持unsafewindow,但由于某种原因,我发现无法弄清楚如何模仿功能.它甚至可能吗?

aln*_*h29 13

这将为您提供对窗口对象的引用(如p):

var p = unsafeWindow;

if(window.navigator.vendor.match(/Google/)) {
    var div = document.createElement("div");
    div.setAttribute("onclick", "return window;");
    p = div.onclick();
};
Run Code Online (Sandbox Code Playgroud)

  • 这在最新版本的Chrome中似乎不再起作用. (7认同)
  • 没有必要"供应商嗅探",你可以这样做:https://gist.github.com/1143845 (6认同)

Bro*_*ams 11

更新:
onclick漏洞不再适用于最新的Chrome版本.

要获得unsafeWindowChrome中的功能,最好的办法是安装和使用Tampermonkey - 无论如何,您都应该这样做.Tampermonkey完全支持Greasemonkey API和更简单的脚本管理.

Greasemonkey脚本和Tampermonkey脚本几乎总是完全兼容,对于普通的Chrome用户脚本来说并非如此.

放弃Tampermonkey,唯一可行的方法是使用某种形式的脚本注入.



以下内容现已过时:

Chrome现在定义unsafeWindow了userscripts/content-scripts,但Chrome unsafeWindow仍然不允许访问目标页面创建的JS对象.

以下是如何unsafeWindow使用特征检测(好)与浏览器嗅探(错误)的跨浏览器方式提供正确不安全的方法:

/*--- Create a proper unsafeWindow object on browsers where it doesn't exist
    (Chrome, mainly).
    Chrome now defines unsafeWindow, but does not give it the same access to
    a page's javascript that a properly unsafe, unsafeWindow has.
    This code remedies that.
*/
var bGreasemonkeyServiceDefined     = false;

try {
    if (typeof Components.interfaces.gmIGreasemonkeyService === "object") {
        bGreasemonkeyServiceDefined = true;
    }
}
catch (err) {
    //Ignore.
}

if ( typeof unsafeWindow === "undefined"  ||  ! bGreasemonkeyServiceDefined) {
    unsafeWindow    = ( function () {
        var dummyElem   = document.createElement('p');
        dummyElem.setAttribute ('onclick', 'return window;');
        return dummyElem.onclick ();
    } ) ();
}
Run Code Online (Sandbox Code Playgroud)


NVI*_*NVI 9

contentWindow在Chrome 3中可用,但在Chrome 4中删除.仅适用于Chrome 4的解决方案:

location.href="javascript:(function(){ alert('Hello'); })()"
Run Code Online (Sandbox Code Playgroud)