2012-09-12 21 views
14

Vorrei creare un'estensione per Chrome che fornisca un nuovo oggetto all'interno di window. Quando una pagina web viene visualizzata in un browser con l'estensione caricata, mi piacerebbe che window.mything sia disponibile tramite Javascript. L'oggetto window.mything avrà alcune funzioni che definirò nell'estensione e queste funzioni dovrebbero essere richiamabili da console.log o qualsiasi file Javascript quando la pagina viene visualizzata in un browser con l'estensione abilitata.È possibile modificare l'oggetto finestra da un'estensione di Chrome?

sono stato in grado di iniettare con successo un file JavaScript nella pagina utilizzando un Content Script:

var s = document.createElement("script"); 
s.src = chrome.extension.getURL("mything.js"); 
document.getElementsByTagName("head")[0].appendChild(s); 

mything.js assomiglia a questo:

window.mything = {thing: true}; 
console.log(window); 

Ogni volta che una pagina viene caricata, vedo il intero oggetto window come mi aspetto che sia nella console. Tuttavia, non posso interagire con l'oggetto window.mything dalla console. Sembra che lo script iniettato non abbia realmente modificato l'oggetto globale window.

Come è possibile modificare l'oggetto globale window da un'estensione di Chrome?

+0

che è impossibile. Stai visualizzando la console giusta, lo script è realmente eseguito (ispeziona il documento e cerca tag script/controlla gli errori di sintassi)? Lo script funziona sicuramente nel contesto della pagina e, quindi, 'mything' deve essere esistente. –

risposta

27

Non è possibile, non direttamente. Da content scripts documentation:

Tuttavia, gli script di contenuto presentano alcune limitazioni. Essi non possono:

  • utilizzare Chrome * API (tranne che per le parti di chrome.extension)
  • Utilizzare variabili o funzioni definite dalle pagine del loro estensione
  • Utilizzare le variabili o funzioni definite da pagine web o con altri. gli script contenuti

(enfasi aggiunta)

Il L'oggetto window visualizzato dallo script di contenuto non è lo stesso oggetto window visualizzato dalla pagina.

È tuttavia possibile passare messaggi tramite il DOM utilizzando il metodo window.postMessage. Sia la tua pagina che lo script di contenuto ascoltano l'evento messaggio e ogni volta che chiami window.postMessage da uno di quei luoghi, l'altro lo riceverà. C'è uno example of this nella pagina di documentazione "Content Scripts".

modifica: Potresti potenzialmente aggiungere alcuni metodi alla pagina iniettando uno script dallo script di contenuto. E ancora non sarebbe in grado di comunicare di nuovo con il resto della proroga, però, senza l'utilizzo di qualcosa come postMessage, ma si potrebbe aggiungere almeno alcune cose da della pagina window

var elt = document.createElement("script"); 
elt.innerHTML = "window.foo = {bar:function(){/*whatever*/}};" 
document.head.appendChild(elt); 
+0

Grazie, non ho usato il tuo suggerimento testualmente, ma il concetto mi ha aiutato a concentrarmi sul vero problema. –

+0

U può anche usare eval ("window.foo = {bar: function() {/ * qualunque * /}};"); – User

+0

@User no non puoi, l'ho appena provato. – cprcrack

4

Ho giocato in giro con Questo. Ho scoperto che posso interagire con l'oggetto finestra del browser avvolgendo il mio javascript in una window.location = chiamata.

var myInjectedJs = "window.foo='This exists in the \'real\' window object';" 
window.location = "javascript:" + myInjectedJs; 

var myInjectedJs2 = "window.bar='So does this.';" 
window.location = "javascript:" + myInjectedJs2; 

Funziona, ma solo per l'ultima istanza di window.location stato impostato. Se si accede oggetto finestra del documento, che avrà un "bar" variabile ma non "pippo"

0

Content Script può chiamata window metodi che possono poi essere utilizzati per mutare l'oggetto window. Questo è più semplice dell'iniezione di tag <script> e funziona anche quando non sono ancora stati analizzati <head> e <body> (ad esempio quando si utilizza run_at: document_start).

// In Content Script 
window.addEventListener('load', loadEvent => { 
    let window = loadEvent.currentTarget; 
    window.document.title='You changed me!'; 
}); 
0

di un'estensione Chrome content_script corre all'interno del proprio contesto, che è separata dalla finestra. È possibile inserire uno script nella pagina anche se così viene eseguito nello stesso contesto, come la finestra della pagina, in questo modo: Chrome extension - retrieving global variable from webpage

ero in grado di chiamare i metodi sull'oggetto finestra e modificare le proprietà della finestra con l'aggiunta essenzialmente un script.js al DOM di pagina:

var s = document.createElement('script'); 
s.src = chrome.extension.getURL('script.js'); 
(document.head||document.documentElement).appendChild(s); 
s.onload = function() { 
    s.remove(); 
}; 

e la creazione di listener di eventi personalizzati in quel file di script iniettato:

document.addEventListener('_my_custom_event', function(e) { 
    // do whatever you'd like! Like access the window obj 
    window.myData = e.detail.my_event_data; 
}) 

e dispacciamento quell'evento nella content_script:

var foo = 'bar' 
document.dispatchEvent(new CustomEvent('_save_OG_Editor', { 
    'detail': { 
    'my_event_data': foo 
    } 
})) 

o viceversa; spedisci gli eventi in script.js e ascoltali nel content_script della tua estensione (come il link sopra illustra bene).

Assicurati di aggiungere lo script inserito nei file della tua estensione e aggiungi il percorso del file di script al tuo manifest within "web_accessible_resources" o riceverai un errore.

Speranza che aiuta qualcuno \ (• ◡ •)/

Problemi correlati