Estensione Chrome: passaggio dell’object dalla pagina allo script di contesto

Sto scrivendo un’estensione di Chrome e sto facendo fatica a passare un object dalla pagina principale allo script di contesto. Non riesco ad accedere alle variabili della finestra.

ContextScript

//STORE DATA TO CHROME STORAGE ON EVENT //create hidden input var hiddenInput = document.createElement("input"); hiddenInput.setAttribute("type", "text"); hiddenInput.setAttribute("id", "__HIDDEN__RESULT__"); //add input to page var currentItem = document.body.appendChild(hiddenInput); //event to be fired on click currentItem.onclick = function() { //get the global variable window.listOfCourses and stick it in storage chrome.storage.local.set({'dataVault' : window.listOfCourses}); }; //inject script into page var s = document.createElement("script"); s.src = chrome.extension.getURL("gradebook.js"); s.onload = function() {this.parentNode.removeChild(this);}; (document.head||document.documentElement).appendChild(s); 

Script iniettato

 function processData() { window.listOfCourses = []; for (i=0; i < window.completedData.length; i++) { //get data and add to window.listOfCourses } var myElement = document.getElementById("__HIDDEN__RESULT__") myElement.click(); } 

Lo script iniettato estrae le informazioni da una pagina, le inserisce in un object impostato come variabile globale, quindi alla fine triggers l’evento onclick per l’input.

Tutto questo funziona. Tuttavia, quando l’evento click viene triggersto ed esegue currentItem.onclick () e tenta di accedere a window.listOfCourses, non vede la variabile. Sono confuso perché non riesco più a vedere le mie variabili globali.

Qualsiasi aiuto sarebbe molto apprezzato!

Le variabili globali di uno script di contenuto e uno script iniettato a livello di pagina sono isolate .

Gli script di contenuto vengono eseguiti in un ambiente speciale chiamato un mondo isolato . Hanno accesso al DOM della pagina in cui sono inseriti, ma non a nessuna variabile o funzione JavaScript creata dalla pagina . Osserva ogni script di contenuto come se non ci fosse nessun altro JavaScript in esecuzione sulla pagina su cui è in esecuzione. Lo stesso è vero al contrario: JavaScript in esecuzione sulla pagina non può chiamare alcuna funzione o accedere a qualsiasi variabile definita dagli script di contenuto.

Enfasi mia.

Per passare i dati allo script di contenuto, non è necessario utilizzare elementi DOM aggiuntivi. Hai solo bisogno di eventi DOM personalizzati.

 // Content script // Listen for the event window.addEventListener("FromPage", function(evt) { /* message is in evt.detail */ }, false); // Page context var message = {/* whatever */}; var event = new CustomEvent("FromPage", {detail: message}); window.dispatchEvent(event); 

Vedi questa risposta per ulteriori dettagli.

La risposta sopra può funzionare ma non penso che sia il modo corretto …

Primo:

Se hai già pubblicato la tua estensione, prendi la chiave dell’applicazione e inseriscila nella “chiave” del file manifest come descritto qui :

  • installa Chrome Extension Source Viewer
  • CRX -> visualizza la fonte di estensione -> inserisci l’URL dell’applicazione pubblicata -> immetti
  • apri gli strumenti per sviluppatori (F12) -> vai alla console
  • copia l’atring “chiave” dalla console nel manifest.json locale:

    “chiave”: “MIIBIjANBgkqhkiG9w … RwIDAQAB”,

Ciò garantirà che l’estensione locale e pubblicata abbia la stessa estensione ID

Secondo:

  • carica la tua estensione locale
  • trova la tua estensioneId andando a chrome://extensions e cercando ID sotto il titolo dell’estensione

Terzo:

nel tuo background script (es. background.js) ascolta msgs come questo:

 chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.name === 'msg1') { alert(message.key1); } }); 

nel tuo script di contenuto (ad esempio contentScript.js) invia messaggi come questo:

 chrome.runtime.sendMessage(extensionId, { name: 'msg1', key1: 'value1'}, undefined, (response) => {}); 

(sostituisci extensionId con quello che hai ottenuto nel secondo passaggio)