Как я могу имитировать небезопасную функциональность Greasemonkey / Firefox в Chrome? - PullRequest
6 голосов
/ 26 октября 2009

Сейчас я просто возлюсь с пользовательскими скриптами в chrome, поэтому, пожалуйста, потерпите мое потенциальное невежество / идиотизм.

На странице, для которой я пишу скрипт, есть элемент <script>, который объявляет переменную x. Означает ли это, что в моем пользовательском скрипте я могу просто получить доступ к x из глобального пространства имен?

Например, если единственная строка в моем пользовательском скрипте - alert(x);, должна ли она работать как положено (если x - это строка)? Я понимаю, что Chrome не поддерживает unsafewindow, но по некоторым причинам я не могу понять, как имитировать функциональность. Это вообще возможно?

Ответы [ 5 ]

13 голосов
/ 20 января 2011

Это даст вам ссылку на объект окна (как p):

var p = unsafeWindow;

if(window.navigator.vendor.match(/Google/)) {
    var div = document.createElement("div");
    div.setAttribute("onclick", "return window;");
    p = div.onclick();
};
11 голосов
/ 08 июня 2012

Обновление:
Эксплоит onclick больше не работает в последних версиях Chrome.

Чтобы получить unsafeWindow функциональность в Chrome, лучше всего установить и использовать Tampermonkey - что бы вы ни делали, несмотря ни на что. Tampermonkey полностью поддерживает API Greasemonkey и значительно упрощает управление сценариями.

Сценарии Greasemonkey и Tampermonkey почти всегда полностью совместимы, что не так для простых пользовательских скриптов Chrome.

Отказ от Tampermonkey, единственная альтернатива, которая все еще работает, - это использовать некую форму инъекции скрипта .



Следующее устарело:

Chrome теперь определяет unsafeWindow для usercripts / 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 ();
    } ) ();
}
9 голосов
/ 28 октября 2009

contentWindow был доступен в Chrome 3, но удален в Chrome 4 . Единственно возможное решение для Chrome 4:

location.href="javascript:(function(){ alert('Hello'); })()"
1 голос
/ 29 декабря 2011

Если вы хотите взаимодействовать со страницей 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.
0 голосов
/ 29 октября 2009

хорошо, вот идея, что вы можете добавить скрипт, используя адресную строку ...

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

тогда вы можете запустить все что угодно в окне с вашим javascript

...