Wie kann ich Grease / Firefox unsafeWindow Funktionalität in Chrome zu imitieren?
-
06-07-2019 - |
Frage
Ich bin nur mit User-Skripte in Chrom Hantieren gerade jetzt, so wenden Sie sich bitte tragen mit meinem Potential Ignoranz / Idiotie.
In der Seite, die ich für ein Skript gerade schreibe, gibt es eine <script>
Element, das eine variable x
erklärt.
Ist dies das bedeutet, in meinem Benutzerskript, kann ich nur x
aus dem globalen Namensraum zugreifen?
Zum Beispiel, wenn die einzige Zeile in meinem userscript alert(x);
ist, sollte diese Arbeit wie erwartet (unter der Annahme x
ist ein String)? Ich verstehe, Chrom nicht unsafewindow nicht unterstützt, aber aus irgendeinem Grunde Ich finde es unmöglich, herauszufinden, wie die Funktionalität zu imitieren. Ist es überhaupt möglich?
Lösung
contentWindow
war in Chrome 3 verfügbar, aber in Chrome 4 entfernt . Einzig mögliche Lösung für Chrome 4:
location.href="javascript:(function(){ alert('Hello'); })()"
Andere Tipps
Dies gibt Ihnen einen Verweis auf das Fensterobjekt (wie p):
var p = unsafeWindow;
if(window.navigator.vendor.match(/Google/)) {
var div = document.createElement("div");
div.setAttribute("onclick", "return window;");
p = div.onclick();
};
Update:
Die onclick
ausnutzen funktioniert nicht mehr in den aktuellen Chrome Releases.
unsafeWindow
Funktionalität in Chrome zu erhalten, ist Ihre beste Wette zu installieren und verwenden Tampermonkey - die Sie klug sein würde, unabhängig zu tun. Tampermonkey hat volle Unterstützung für die Greasemonkey API und viel einfacher Skript-Management.
Greasemonkey-Skripte und Tampermonkey Skripte sind fast immer voll kompatibel, etwas, das für Normal Chrome userscripts nicht wahr ist.
Der Verzicht Tampermonkey, die einzige Alternative, die immer noch funktioniert, ist eine Form von Skripteinschleusung zu verwenden.
Das folgende ist jetzt veraltet:
Chrome definiert nun unsafeWindow
für userscripts / content-Skripte , aber Chrome unsafeWindow
erlaubt noch keinen Zugriff auf JS-Objekte erstellt von der Zielseite.
Hier ist, wie ein richtig unsicher, unsafeWindow
bieten - in einer Cross-Browser-Art und Weise, die Feature-Erkennung (gut) im Vergleich zu Browser Sniffing (Bad) :
/*--- 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 ();
} ) ();
}
Wenn Sie mit Seite JavaScript zu interagieren möchten, müssen Sie ein Skript in eine Seite einfügen. (Es sei denn, Sie eine der Hacks verwenden möchten auf dieser Seite vorgeschlagen, natürlich.) Ich habe eine Funktion, gekocht, genau das für meine eigene Skripte zu tun, ich es hier bei Post wird jemand will, es zu benutzen.
/*
@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}
}
Einige Beispiele zu verdeutlichen:
//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 here eine Idee, die Sie das Skript injizieren können die Adresszeile mit ...
javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm);
, dann können Sie ausführen, was Sie im Fenster mit Javascript wollen