Iniezione di funzioni JS nella pagina da uno script Greasemonkey su Chrome [javascript]


Answers

Ho questo :

contentscript.js:

function injectJs(link) {
var scr = document.createElement('script');
scr.type="text/javascript";
scr.src=link;
document.getElementsByTagName('head')[0].appendChild(scr)
//document.body.appendChild(scr);
}

injectJs(chrome.extension.getURL('injected.js'));

injected.js:

function main() {
     alert('Hello World!');
}

main();
Question

Ho uno script Greasemonkey che funziona bene in Firefox e Opera. Ho difficoltà a farlo funzionare su Chrome, comunque. Il problema sta iniettando una funzione nella pagina che può essere invocata dal codice dalla pagina. Ecco cosa sto facendo finora:

In primo luogo, ottengo un riferimento di aiuto per la finestra non sicura per Firefox. Questo mi permette di avere lo stesso codice per FF e Opera (e Chrome, pensavo).

var uw = (this.unsafeWindow) ? this.unsafeWindow : window;

Successivamente, inserisco una funzione nella pagina. In realtà è solo un involucro molto sottile che non fa altro che invocare la funzione corrispondente nel contesto del mio script GM:

uw.setConfigOption = function(newValue) {
    setTimeout(setConfigOption, 0, newValue);
}

Quindi, c'è la funzione corrispondente nel mio script:

setConfigOption = function(newValue) {
    // do something with it, e.g. store in localStorage
}

Infine, inserisco del codice HTML nella pagina con un link per richiamare la funzione.

var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);

Riassumendo: In Firefox, quando l'utente fa clic sul link iniettato, eseguirà la chiamata alla funzione su unsafeWindow, che quindi attiva un timeout che richiama la funzione corrispondente nel contesto del mio script GM, che quindi esegue l'elaborazione effettiva. (Correggimi se sbaglio qui.)

In Chrome, ho appena ricevuto un errore "Uncaught ReferenceError: setConfigOption non definito". E infatti, inserire "window.setConfigOption" nella console produce un "indefinito". In Firebug e nella console di sviluppo di Opera, la funzione è disponibile.

Forse c'è un altro modo per farlo, ma alcune delle mie funzioni sono invocate da un oggetto Flash sulla pagina, che a mio avviso rende necessario avere funzioni nel contesto della pagina.

Ho dato una rapida occhiata alle alternative a unsafeWindow sul wiki di Greasemonkey, ma sembrano tutte abbastanza brutte. Sono completamente sulla strada sbagliata qui o dovrei guardare più da vicino a questi?

RISOLUZIONE: ho seguito Max S. consulenza e funziona ora sia in Firefox che in Chrome. Poiché le funzioni che dovevo essere disponibile per la pagina dovevano richiamare quelle normali, spostai il mio intero script sulla pagina, cioè è completamente racchiuso nella funzione che chiamava 'main ()'.

Per rendere un po 'più sopportabile la bruttezza in più di quel trucco, potrei almeno cancellare l'uso di Windows non sicuro e ora spostarlo su JSObject.

Non sono ancora riuscito a far funzionare il runner del content scope dal wiki di Greasemonkey. Dovrebbe fare lo stesso e sembra funzionare bene, ma le mie funzioni non sono mai accessibili ad <a> elementi dalla pagina, per esempio. Non ho ancora capito perché sia ​​così.