Descrizione
Utilizza l'API chrome.scripting
per eseguire script in contesti diversi.
Autorizzazioni
scripting
Disponibilità
Manifest
Per utilizzare l'API chrome.scripting
, dichiara l'autorizzazione "scripting"
nel manifest, oltre alle autorizzazioni host per le pagine in cui inserire gli script. Utilizza il tasto "host_permissions"
o l'autorizzazione "activeTab"
, che concede autorizzazioni host temporanee. L'esempio seguente utilizza l'autorizzazione activeTab.
{
"name": "Scripting Extension",
"manifest_version": 3,
"permissions": ["scripting", "activeTab"],
...
}
Concetti e utilizzo
Puoi utilizzare l'API chrome.scripting
per inserire JavaScript e CSS nei siti web. È simile a quello che puoi fare con gli script
dei contenuti. Tuttavia, utilizzando lo spazio dei nomi chrome.scripting
, le estensioni
possono prendere decisioni in fase di runtime.
Target di iniezione
Puoi utilizzare il parametro target
per specificare un target in cui inserire JavaScript o CSS.
L'unico campo obbligatorio è tabId
. Per impostazione predefinita, un'iniezione viene eseguita nel
frame principale della scheda specificata.
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
files : [ "script.js" ],
})
.then(() => console.log("script injected"));
Per eseguire l'annuncio in tutti i frame della scheda specificata, puoi impostare il valore booleano allFrames
su true
.
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
files : [ "script.js" ],
})
.then(() => console.log("script injected in all frames"));
Puoi anche inserire codice in frame specifici di una scheda specificando ID frame individuali. Per saperne di più sugli ID frame, consulta l'chrome.webNavigation
API.
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), frameIds : [ frameId1, frameId2 ]},
files : [ "script.js" ],
})
.then(() => console.log("script injected on target frames"));
Codice iniettato
Le estensioni possono specificare il codice da inserire tramite un file esterno o una variabile di runtime.
File
I file vengono specificati come stringhe che sono percorsi relativi alla directory root dell'estensione. Il seguente codice inserirà il file script.js
nel frame principale
della scheda.
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
files : [ "script.js" ],
})
.then(() => console.log("injected script file"));
Funzioni di runtime
Quando inserisci JavaScript con scripting.executeScript()
, puoi specificare una
funzione da eseguire anziché un file. Questa funzione deve essere una variabile
disponibile per il contesto dell'estensione corrente.
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : getTitle,
})
.then(() => console.log("injected a function"));
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor() {
document.body.style.backgroundColor = getUserColor();
}
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : changeBackgroundColor,
})
.then(() => console.log("injected a function"));
Puoi aggirare questo problema utilizzando la proprietà args
:
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor(backgroundColor) {
document.body.style.backgroundColor = backgroundColor;
}
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : changeBackgroundColor,
args : [ getUserColor() ],
})
.then(() => console.log("injected a function"));
Stringhe di runtime
Se inserisci CSS all'interno di una pagina, puoi anche specificare una stringa da utilizzare nella proprietà css
. Questa opzione è disponibile solo per scripting.insertCSS()
; non puoi eseguire una stringa utilizzando scripting.executeScript()
.
function getTabId() { ... }
const css = "body { background-color: red; }";
chrome.scripting
.insertCSS({
target : {tabId : getTabId()},
css : css,
})
.then(() => console.log("CSS injected"));
Gestire i risultati
I risultati dell'esecuzione di JavaScript vengono passati all'estensione. Per ogni frame è incluso un solo risultato. Il frame principale è garantito per essere il primo indice dell'array risultante; tutti gli altri frame sono in un ordine non deterministico.
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
func : getTitle,
})
.then(injectionResults => {
for (const {frameId, result} of injectionResults) {
console.log(`Frame ${frameId} result:`, result);
}
});
scripting.insertCSS()
non restituisce alcun risultato.
Promesse
Se il valore risultante dell'esecuzione dello script è una promessa, Chrome attenderà che la promessa venga risolta e restituirà il valore risultante.
function getTabId() { ... }
async function addIframe() {
const iframe = document.createElement("iframe");
const loadComplete =
new Promise(resolve => iframe.addEventListener("load", resolve));
iframe.src = "https://example.com";
document.body.appendChild(iframe);
await loadComplete;
return iframe.contentWindow.document.title;
}
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
func : addIframe,
})
.then(injectionResults => {
for (const frameResult of injectionResults) {
const {frameId, result} = frameResult;
console.log(`Frame ${frameId} result:`, result);
}
});
Esempi
Annulla la registrazione di tutti gli script di contenuti dinamici
Il seguente snippet contiene una funzione che annulla la registrazione di tutti gli script di contenuti dinamici che l'estensione ha registrato in precedenza.
async function unregisterAllDynamicContentScripts() {
try {
const scripts = await chrome.scripting.getRegisteredContentScripts();
const scriptIds = scripts.map(script => script.id);
return chrome.scripting.unregisterContentScripts({ ids: scriptIds });
} catch (error) {
const message = [
"An unexpected error occurred while",
"unregistering dynamic content scripts.",
].join(" ");
throw new Error(message, {cause : error});
}
}
Per provare l'API chrome.scripting
,
installa l'esempio di scripting dal repository degli esempi di estensioni di Chrome.
Tipi
ContentScriptFilter
Proprietà
-
ids
string[] facoltativo
Se specificato,
getRegisteredContentScripts
restituirà solo gli script con un ID specificato in questo elenco.
CSSInjection
Proprietà
-
css
stringa facoltativa
Una stringa contenente il CSS da inserire. È necessario specificare esattamente uno dei valori
files
ecss
. -
file
string[] facoltativo
Il percorso dei file CSS da inserire, relativo alla directory root dell'estensione. È necessario specificare esattamente uno dei valori
files
ecss
. -
origine
StyleOrigin facoltativo
L'origine dello stile per l'inserimento. Il valore predefinito è
'AUTHOR'
. -
target
Dettagli che specificano il target in cui inserire il CSS.
ExecutionWorld
Il mondo JavaScript in cui eseguire uno script.
Enum
"ISOLATED"
Specifica il mondo isolato, ovvero l'ambiente di esecuzione univoco per questa estensione.
"MAIN"
Specifica il mondo principale del DOM, ovvero l'ambiente di esecuzione condiviso con JavaScript della pagina host.
InjectionResult
Proprietà
-
documentId
stringa
Chrome 106+Il documento associato all'inserimento.
-
frameId
numero
Chrome 90+Il frame associato all'inserimento.
-
risultato
qualsiasi facoltativo
Il risultato dell'esecuzione dello script.
InjectionTarget
Proprietà
-
allFrames
booleano facoltativo
Indica se lo script deve essere inserito in tutti i frame all'interno della scheda. Il valore predefinito è false. Questo non deve essere vero se
frameIds
è specificato. -
documentIds
string[] facoltativo
Chrome 106+Gli ID di documentId specifici da inserire. Questo valore non deve essere impostato se è impostato
frameIds
. -
frameIds
number[] facoltativo
Gli ID di frame specifici da inserire.
-
tabId
numero
L'ID della scheda in cui inserire il codice.
RegisteredContentScript
Proprietà
-
allFrames
booleano facoltativo
Se viene specificato il valore true, viene inserito in tutti i frame, anche se il frame non è il primo nella scheda. Ogni frame viene controllato in modo indipendente per i requisiti dell'URL; non verrà inserito nei frame secondari se i requisiti dell'URL non vengono soddisfatti. Il valore predefinito è false, il che significa che viene abbinato solo il frame principale.
-
css
string[] facoltativo
L'elenco dei file CSS da inserire nelle pagine corrispondenti. Vengono inseriti nell'ordine in cui appaiono in questo array, prima che venga costruito o visualizzato qualsiasi DOM per la pagina.
-
excludeMatches
string[] facoltativo
Esclude le pagine in cui altrimenti verrebbe inserito questo script di contenuti. Per ulteriori dettagli sulla sintassi di queste stringhe, consulta Pattern di corrispondenza.
-
id
stringa
L'ID del content script, specificato nella chiamata API. Non deve iniziare con "_" perché è riservato come prefisso per gli ID script generati.
-
js
string[] facoltativo
L'elenco dei file JavaScript da inserire nelle pagine corrispondenti. Questi vengono inseriti nell'ordine in cui appaiono in questo array.
-
matchOriginAsFallback
booleano facoltativo
Chrome 119+Indica se lo script può essere inserito nei frame in cui l'URL contiene uno schema non supportato, in particolare: about:, data:, blob: o filesystem:. In questi casi, l'origine dell'URL viene controllata per determinare se lo script deve essere inserito. Se l'origine è
null
(come nel caso degli URL dei dati), l'origine utilizzata è il frame che ha creato il frame corrente o il frame che ha avviato la navigazione a questo frame. Tieni presente che questo potrebbe non essere il frame principale. -
corrisponde a
string[] facoltativo
Specifica le pagine in cui verrà inserito questo script di contenuti. Per ulteriori dettagli sulla sintassi di queste stringhe, consulta Pattern di corrispondenza. Deve essere specificato per
registerContentScripts
. -
persistAcrossSessions
booleano facoltativo
Specifica se questo script dei contenuti verrà mantenuto nelle sessioni future. Il valore predefinito è true.
-
runAt
RunAt facoltativo
Specifica quando i file JavaScript vengono inseriti nella pagina web. Il valore preferito e predefinito è
document_idle
. -
mondo
ExecutionWorld facoltativo
Chrome 102+L'ambiente JavaScript in cui eseguire lo script. Il valore predefinito è
ISOLATED
.
ScriptInjection
Proprietà
-
args
any[] facoltativo
Chrome 92+Gli argomenti da passare alla funzione fornita. Questo è valido solo se è specificato il parametro
func
. Questi argomenti devono essere serializzabili in JSON. -
file
string[] facoltativo
Il percorso dei file JS o CSS da inserire, relativo alla directory principale dell'estensione. È necessario specificare esattamente uno dei seguenti valori:
files
ofunc
. -
injectImmediately
booleano facoltativo
Chrome 102+Indica se l'inserimento deve essere attivato nella destinazione il prima possibile. Tieni presente che non è garantito che l'inserimento avvenga prima del caricamento della pagina, in quanto la pagina potrebbe essere già stata caricata quando lo script raggiunge la destinazione.
-
target
Dettagli che specificano il target in cui inserire lo script.
-
mondo
ExecutionWorld facoltativo
Chrome 95+L'ambiente JavaScript in cui eseguire lo script. Il valore predefinito è
ISOLATED
. -
func
void optional
Chrome 92+Una funzione JavaScript da inserire. Questa funzione verrà serializzata e poi deserializzata per l'inserimento. Ciò significa che tutti i parametri associati e il contesto di esecuzione andranno persi. È necessario specificare esattamente uno dei seguenti valori:
files
ofunc
.La funzione
func
ha questo aspetto:() => {...}
StyleOrigin
L'origine di una modifica dello stile. Per saperne di più, consulta Origini dello stile.
Enum
"AUTHOR"
"USER"
Metodi
executeScript()
chrome.scripting.executeScript(
injection: ScriptInjection,
): Promise<InjectionResult[]>
Inserisce uno script in un contesto di destinazione. Per impostazione predefinita, lo script verrà eseguito alle ore document_idle
o immediatamente se la pagina è già stata caricata. Se la proprietà injectImmediately
è impostata, lo script verrà inserito senza attendere, anche se la pagina non è stata caricata completamente. Se lo script restituisce una promessa, il browser attenderà che la promessa venga risolta e restituirà il valore risultante.
Parametri
-
iniezione
I dettagli dello script da inserire.
Resi
-
Promise<InjectionResult[]>
Chrome 90+
getRegisteredContentScripts()
chrome.scripting.getRegisteredContentScripts(
filter?: ContentScriptFilter,
): Promise<RegisteredContentScript[]>
Restituisce tutti gli script di contenuti registrati dinamicamente per questa estensione che corrispondono al filtro specificato.
Parametri
-
filtro
ContentScriptFilter facoltativo
Un oggetto per filtrare gli script registrati dinamicamente dell'estensione.
Resi
-
Promise<RegisteredContentScript[]>
insertCSS()
chrome.scripting.insertCSS(
injection: CSSInjection,
): Promise<void>
Inserisce un foglio di stile CSS in un contesto di destinazione. Se vengono specificati più frame, le iniezioni non riuscite vengono ignorate.
Parametri
-
iniezione
I dettagli degli stili da inserire.
Resi
-
Promise<void>
Chrome 90+
registerContentScripts()
chrome.scripting.registerContentScripts(
scripts: RegisteredContentScript[],
): Promise<void>
Registra uno o più script di contenuti per questa estensione.
Parametri
-
script
Contiene un elenco di script da registrare. Se si verificano errori durante l'analisi dello script/la convalida del file o se gli ID specificati esistono già, non vengono registrati script.
Resi
-
Promise<void>
removeCSS()
chrome.scripting.removeCSS(
injection: CSSInjection,
): Promise<void>
Rimuove un foglio di stile CSS inserito in precedenza da questa estensione da un contesto di destinazione.
Parametri
-
iniezione
I dettagli degli stili da rimuovere. Tieni presente che le proprietà
css
,files
eorigin
devono corrispondere esattamente al foglio di stile inserito tramiteinsertCSS
. Il tentativo di rimuovere un foglio di stile inesistente è un'operazione nulla.
Resi
-
Promise<void>
unregisterContentScripts()
chrome.scripting.unregisterContentScripts(
filter?: ContentScriptFilter,
): Promise<void>
Annulla la registrazione degli script di contenuti per questa estensione.
Parametri
-
filtro
ContentScriptFilter facoltativo
Se specificato, annulla la registrazione solo degli script di contenuti dinamici che corrispondono al filtro. In caso contrario, tutti gli script di contenuti dinamici dell'estensione vengono annullati.
Resi
-
Promise<void>
updateContentScripts()
chrome.scripting.updateContentScripts(
scripts: RegisteredContentScript[],
): Promise<void>
Aggiorna uno o più script di contenuti per questa estensione.
Parametri
-
script
Contiene un elenco di script da aggiornare. Una proprietà viene aggiornata per lo script esistente solo se è specificata in questo oggetto. Se si verificano errori durante l'analisi dello script/la convalida del file o se gli ID specificati non corrispondono a uno script completamente registrato, non vengono aggiornati script.
Resi
-
Promise<void>