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

时间:2009-10-25 21:32:04

标签: javascript google-chrome greasemonkey

我现在只是在使用chrome中的用户脚本,所以请忍受我潜在的无知/白痴。

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

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

5 个答案:

答案 0 :(得分:13)

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

var p = unsafeWindow;

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

答案 1 :(得分:11)

<强>更新
onclick漏洞不再适用于最新的Chrome版本。

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

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

放弃Tampermonkey,唯一可行的方法是使用某种形式的script injection



以下内容现已过时:

Chrome now defines unsafeWindow for userscripts / content-scripts,但Chrome的unsafeWindow仍然不允许访问目标网页创建的JS对象。

以下是如何使用Feature Detection (good) versus Browser Sniffing (Bad)的跨浏览器方式提供正确不安全的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 ();
    } ) ();
}

答案 2 :(得分:9)

contentWindow在Chrome 3中可用,但removed in Chrome 4。仅适用于Chrome 4的解决方案:

location.href="javascript:(function(){ alert('Hello'); })()"

答案 3 :(得分:1)

如果您想与页面JavaScript进行交互,则必须在页面中插入脚本。 (当然,除非你想使用本页建议的任何黑客。)我已经为我自己的脚本编写了一个功能,我会在这里发布,以防有​​人想使用它。

/*
    @description    This function will insert the given code as a <script> or <style> block into a page.
    @param The code to insert; supported types are: JavaScript Function, String (JavaScript), String (CSS).
    @param2 Optional: The type of code that is inserted. If omitted, "js" is assumed. Possible values are 'js' or 'css'.
    @return The HTML element that was inserted, or FALSE on failure
*/
function insert(z,t){
    var j,f,x,c,i,n,d
    d=document
    c=d.createElement
    i=d.head.appendChild
    a=d.createTextNode
    if(typeof z==='function') j=!0,f=!0;
    if((t=='js'||!t)&&!f){j=!0,f=!1}
    if(t=='css'&&!j){x=c('style');x.setAttribute('type','text/css')}
    if(j){x=c('script');x.setAttribute('type','text/javascript')}
    if(f) n=a('('+z+')()');else n=a(z)
    x.appendChild(n)

    if(x){return i(x)}else{return !1}
}

澄清一些例子:

//Inserting a JavaScript function
var func=function(){
    stopAds();
    startFileDownload();
}

insert(func);


//Inserting JavaScript as a string
var strJS="prompt(\"Copy:\",someVariableAtThePage);";

insert(strJS);
//Or with an OPTIONAL 2nd parameter:
insert(strJS,'js');


//Inserting CSS
var strCSS=".ad{display:none !important}    #downloadButton{display:block}";

insert(strCSS,'css');//Specifying 2nd parameter as "css" is required.

答案 4 :(得分:0)

确定你可以使用地址栏注入脚本...

javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm);

然后你可以用你的javascript

在窗口中运行你想要的任何内容