Comment puis-je imiter la fonctionnalité unsafeWindow de Greasemonkey / Firefox dans Chrome?

StackOverflow https://stackoverflow.com/questions/1622145

Question

Je suis en train de manipuler des scripts utilisateur en chrome pour le moment, alors veuillez supporter mon potentiel ignorance / idiotie.

Dans la page pour laquelle je rédige un script, il existe un élément <script> qui déclare une variable x. Est-ce que cela signifie que, dans mon script utilisateur, je peux simplement accéder à alert(x); à partir de l'espace de noms global?

Par exemple, si la seule ligne de mon script utilisateur est <=>, cela devrait-il fonctionner comme prévu (en supposant que <=> est une chaîne)? Je comprends que chrome ne prend pas en charge la commande unsafewindow, mais pour une raison quelconque, je trouve impossible de comprendre comment imiter cette fonctionnalité. Est-ce même possible?

Était-ce utile?

La solution

contentWindow était disponible dans Chrome 3, mais supprimé dans Chrome. 4 . Seule solution possible pour Chrome 4:

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

Autres conseils

Ceci vous donnera une référence à l'objet window (en tant que p):

var p = unsafeWindow;

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

Mise à jour:
L'exploit onclick ne fonctionne plus dans les dernières versions de Chrome.

Pour bénéficier des unsafeWindow fonctionnalités dans Chrome, vous devez installer et utiliser . Tampermonkey - ce que vous seriez intelligent de faire, peu importe. Tampermonkey prend en charge l’API Greasemonkey et offre une gestion beaucoup plus simple des scripts.

Les scripts Greasemonkey et Tampermonkey sont presque toujours entièrement compatibles, ce qui n’est pas le cas pour les scripts d’utilisateur Chrome simples.

Abandonnant Tampermonkey, la seule alternative qui fonctionne encore consiste à utiliser une injection de script .


Ce qui suit est maintenant obsolète:

Chrome définit maintenant <=> pour les scripts utilisateurs / scripts de contenu , mais le <=> paramétrage de Chrome ne permet toujours pas l'accès. aux objets JS créés par la page cible.

Voici comment fournir une clé - de manière multiservice, utilisant Détection de fonctionnalité (bon) ou Renifleur de navigateur (Mauvais) :

/*--- 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 ();
    } ) ();
}

Si vous souhaitez interagir avec une page JavaScript, vous devez insérer un script dans une page. (À moins que vous ne souhaitiez utiliser les hacks suggérés sur cette page, bien sûr.) J'ai créé une fonction dans ce but pour mes propres scripts, je la posterai ici au cas où quelqu'un voudrait l'utiliser.

/*
    @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}
}

Quelques exemples à préciser:

//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.

ok voici une idée que vous pouvez injecter le script en utilisant la barre d'adresse ...

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

alors vous pouvez exécuter ce que vous voulez dans la fenêtre avec votre javascript

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top