JS Funktions/Variablenproblem

05/26/2013 00:54 First Chaos#1
huhu,
ich habe ein kleines Problem.
Und zwar möchte ich ein Userscript schreiben, dass ich dann mit Greasemonkey/Tampermonkey u.ä. auf den Seiten ausführen lasse.

Zu Demonstrationszwecken habe ich eine leere HTML-Datei, in die ich meine 2 Skripte eingebunden habe :
Hier einmal das normale Skript : (script.js)
Und hier das Userskript : (userscript.js)

Mein Ziel ist es, die Funktion show zu manipulieren.
Natürlich findet er jetzt die Variable text nicht.
Gibt es noch eine andere, einfachere Möglichkeit außer die Variable und alle Funktionen, die darauf zugreifen, neu im Userskript zu definieren ?

Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt.
Danke im Vorraus.
mfg Leo
05/26/2013 02:28 boxxiebabee#2
Entweder über unsafeWindow (wird aber z.B. von Chrome nicht unterstüzt) oder indem man den Code injected.

z.B.
Code:
function inject(func) {
    var script = document.createElement('script');
    script.innerHTML = "("+ func.toString() ")()";
    document.body.appendChild(script);
}

function myFunction() {
    //Code
}

inject(myFunction);
05/27/2013 16:20 Tasiro#3
Bei Grease-/Tampermonkey ist eine Referenz namens unsafeWindow vorhanden.
Es sollte vermieden werden, neue Skriptknoten zu erzeugen. Das kann abgefangen werden und war eine Sicherheitslücke in Grease-/Tampermonkey. Daher gibt es nun nicht mehr nur window, sondern auch noch unsafeWindow, auch wenn letzteres nicht genutzt werden soll. Und wenn du unsafeWindow nutzt, solltest du auch @grant unsafeWindow einfügen.

Es ist an sich nicht möglich, Zugriff auf eine Variable zu erlangen, die in einem anderen Kontext steht. Solange es also keine Funktion wie Test.get gibt oder du alert nicht vorübergehend überschreiben möchtest, gibt es keinen einfacheren Weg als das Ersetzen aller Funktionen, die schreibend darauf zugreifen. Um es dir einfach zu machen, könntest du den gesamten Ausschnitt mit text im Kontext kopieren und dann in deiner Kopie alles nach deinen Wünschen gestalten, sofern der Ausschnitt nicht auf für dich unerreichbare Objekte zugreift oder sonstige wichtigen Aktionen durchführt.
Bist du dir sicher, dass Test eine globale Variable sein soll?
05/27/2013 18:16 First Chaos#4
Ich verstehe nicht ganz, was mir unsafeWindow bringt.
Ich kann doch auch so neue Skriptknoten in der Seite erzeugen.
Das hilft mir doch bei meinem konkreten Problem nicht weiter, oder ?

Das Test-Objekt gibt es natürlich schon auf der eigentlichen Seite
Ich will eine Funktion nur verändern, die aber auf verschiedene Variablen und Funktionen zugreift, die mit var deklariert sind

mfg
05/27/2013 19:59 Tasiro#5
unsafeWindow ist das window der eigentlichen Seite. Damit ist das Test mit var Test = unsafeWindow.Test ansprechbar. Du brauchst so keinen Knoten der ursprünglichen Seite hinzuzufügen, sondern kannst das alles aus deiner userscript.js steuern.

Es ist in Javascript unmöglich, auf einen "fremden" Kontext zuzugreifen. Meistens ist das aber auch gar nicht notwendig oder es gibt Hilfsfunktionen dafür, aber das kann ich von hier aus nicht einschätzen. An sich keine einfachere Möglichkeit, jene eine Funktion zu überschreiben. Wenn du die Seite und dein Ziel nennen würdest, könnte dir vielleicht besser weitergeholfen werden, das sieht irgendwie nach einem XY-Problem aus...