2015-01-19 19 views
6

Ho problemi a caricare ed eseguire js-script esterni nella mia estensione chrome. Sembra lo stesso di this question, ma non riesco ancora a capire perché non funziona nel mio caso.Estensione Chrome: carica ed esegui script esterno

L'idea è che voglio avere nel mio script di contenuto una funzione predefinita che dovrebbe analizzare un contenuto di una pagina web. E per alcune pagine Web specifiche voglio caricare e utilizzare parser specifici, quindi cerco di caricare js-script corretto per una pagina wep e questo script estende la funzionalità del parser predefinito.

Ormai provo solo eseguire codice script esterno, ma hanno tale errore: Unchecked runtime.lastError while running tabs.executeScript: No source code or file specified at Object.callback

Questo è il mio manifest.json:

{ 
"name": "Extension name", 
"version": "1.2", 
"description": "My chrome extension", 
"browser_action": { 
    "default_popup": "popup.html", 
}, 
"content_scripts": [{ 
    "css": [ 
     "style.css" 
    ], 
    "js": [ 
     "bower_components/jquery/dist/jquery.js", 
     "bower_components/bootstrap/dist/js/bootstrap.js", 
     "content.js" 
    ], 
    "matches": ["*://*/*"] 
}], 
"web_accessible_resources": [ 
    "frame.html", 
    "logo-48.png" 
], 
"icons": { 
    "16": "logo-16.png", 
    "48": "logo-48.png", 
    "128": "logo-128.png" 
}, 
"permissions": [ 
    "tabs", 
    "storage", 
    "http://*/", 
    "https://*/" 
], 
"manifest_version": 2 

}

Questo è popup .html

<!doctype html> 
<html> 
<head> 
    <title>Title</title> 
    <script src="popup.js"></script> 
</head> 
<body> 
    <ul> 
    <li>Some link</li> 
    </ul> 
</body> 
</html> 

E in popup.js eseguo scrip come questo:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.executeScript(tabs[0].id, {file: "http://127.0.0.1:8000/static/plugin/somesite.js"}); 
}); 

Cosa sto dong sbagliato, mi sono perso qualcosa? O dovrei usare un altro approccio per risolvere il problema?

+0

Osservazione (non collegata al tuo errore): '" http: // */"' corrisponde SOLO alle pagine di livello superiore. Puoi "" "' per un permesso generico o '" activeTab "' se hai solo bisogno di accedere alla scheda corrente. – Xan

+0

C'è un motivo per cui non è possibile caricare 'somesite.js' nella tua estensione? – Teepeemm

+0

Per catturare lastError, vedere https://stackoverflow.com/a/45603880/632951 – Pacerier

risposta

6

L'esecuzione di script da fonti esterne come si prova è vietata da google chrome e blocca o addirittura non pubblica la propria estensione. Tutti gli script devono essere nell'estensione. Ma c'è una soluzione, from google chrome doc:

The restriction against resources loaded over HTTP applies only to those resources which are directly executed. You're still free, for example, to make XMLHTTPRequest connections to any origin you like; the default policy doesn't restrict connect-src or any of the other CSP directives in any way.

Se avete bisogno male una sorgente esterna, si può fare una richiesta HTTP XML e utilizzare l'eval per il contenuto. Ecco una parte del codice di from google doc:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://127.0.0.1:8000/static/plugin/somesite.js", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     // WARNING! Might be evaluating an evil script! 
     var resp = eval("(" + xhr.responseText + ")"); 
     // Or this if it's work 
     chrome.tabs.executeScript(tabs[0].id, {code: xhr.responseText}); 
    } 
} 
xhr.send(); 

oppure è possibile utilizzare qualche libreria, $.get() with jquery o $http with angularjs. se si aggiunge eval nel codice è necessario aggiungere in questo manifest.json:

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"`, 
5

Come per la discussione qui: https://groups.google.com/a/chromium.org/forum/#!topic/chromium-extensions/LIH7LGXeQHo,

Running scripts from external sources may cause your extension to be unpublished or blocked.

Basta che fornisce un altro approccio, si potrebbe fare una chiamata AJAX allo script contenuti quindi chiamare chrome.tabs.executeScript

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    $.get("http://127.0.0.1:8000/static/plugin/somesite.js", function(result) { 
     chrome.tabs.executeScript(tabs[0].id, {code: result}); 
    }, "text"); 
}); 
+1

Impossibile scaricare ed eseguire uno script come "Esecuzione di script da fonti esterne"? È consentito da Google? – Kolyunya

1

l'opzione 'file' per executeScript riguarda solo i file incorporato nella tua estensione. Lo so, the documentation non è chiaro su quello e mentre potrebbe funzionare con gli URL, suona come un hack, non una funzionalità. Per caricare script da fonti esterne nella pagina attiva, di solito è necessario eseguire uno script che crei un tag script all'interno del DOM del documento caricato.

sento di aver risposto a parti di questa domanda prima qui: Why is chrome.tabs.executeScript() necessary to change the current website DOM and how can I use jQuery to achieve the same effect?

In sintesi:

1) al fine di avere accesso alle pagine web da l'estensione, è necessario aggiungere permissions per esso:

"permissions" : [ 
     "tabs", 
     [...] 
     "http://*/*", 
     "https://*/*" ], 

2) è necessario eseguire una sorta di codice che crea l'elemento di script DOM che carica quello che vi serve:

chrome.tabs.executeScript(tab.id, { 
    code : 'var script=document.createElement(\'script\');' + 
    'script.onload=function() { /*do something in the page after the script was loaded*/ };' + 
    'script.src=\'http://127.0.0.1:8000/static/plugin/somesite.js\';' + 
    'document.body.appendChild(script);' 
}, function (returnedValue) { 
    // do something in the extension context after the code was executed 
}); 

Dai un'occhiata alla funzione remex nel link qui sopra, che a mio avviso risolve molto la bruttezza di javascript scritto come una stringa come qui.

+0

Ma questo non verrà eseguito come codice di estensione. Funzionerà come JavaScript della pagina. – golddove

Problemi correlati