Descrizione
Utilizza l'API userScripts per eseguire gli script utente nel contesto degli script utente.
Autorizzazioni
userScriptsPer utilizzare l'API User Scripts, browser.userScripts, aggiungi l'autorizzazione "userScripts" al file manifest.json e "host_permissions" per i siti su cui vuoi eseguire gli script.
{
"name": "User script test extension",
"manifest_version": 3,
"minimum_chrome_version": "120",
"permissions": [
"userScripts"
],
"host_permissions": [
"*://example.com/*"
]
}
Disponibilità
Concetti e utilizzo
Uno script utente è uno snippet di codice inserito in una pagina web per modificarne l'aspetto o il comportamento. A differenza di altre funzionalità delle estensioni, come gli script dei contenuti e l'API browser.scripting, l'API User Scripts consente di eseguire codice arbitrario. Questa API è obbligatoria per le estensioni che eseguono script forniti dall'utente che non possono essere inviati come parte del pacchetto dell'estensione.
Attiva l'utilizzo dell'API userScripts
Dopo che l'estensione ha ricevuto l'autorizzazione per utilizzare l'API userScripts, gli utenti devono attivare un'opzione specifica per consentire all'estensione di utilizzare l'API. Il pulsante di attivazione/disattivazione specifico richiesto e il comportamento dell'API quando è disattivata variano in base alla versione di Chrome.
Utilizza il seguente controllo per determinare quale pulsante di attivazione/disattivazione l'utente deve attivare, ad esempio durante l'onboarding di un nuovo utente:
let version = Number(navigator.userAgent.match(/(Chrome|Chromium)\/([0-9]+)/)?.[2]);
if (version >= 138) {
// Allow User Scripts toggle will be used.
} else {
// Developer mode toggle will be used.
}
Le sezioni seguenti descrivono i diversi pulsanti di attivazione/disattivazione e come attivarli.
Versioni di Chrome precedenti alla 138 (pulsante di attivazione/disattivazione della modalità sviluppatore)
In qualità di sviluppatore di estensioni, hai già attivato la modalità sviluppatore nella tua installazione di Chrome. Anche i tuoi utenti devono attivare la modalità sviluppatore.
Puoi copiare e incollare le seguenti istruzioni nella documentazione dell'estensione per i tuoi utenti
- Vai alla pagina Estensioni inserendo
chrome://extensionsin una nuova scheda. (Per impostazione predefinita, gli URLchrome://non sono collegabili.) Attiva la modalità sviluppatore facendo clic sull'interruttore accanto a Modalità sviluppatore.
Pagina Estensioni (chrome://extensions)
Chrome 138 e versioni successive (pulsante di attivazione/disattivazione Consenti script utente)
Il pulsante di attivazione/disattivazione Consenti script utente si trova nella pagina dei dettagli di ogni estensione (ad esempio chrome://extensions/?id=YOUR_EXTENSION_ID).
Puoi copiare e incollare le seguenti istruzioni nella documentazione dell'estensione per i tuoi utenti:
- Vai alla pagina Estensioni inserendo
chrome://extensionsin una nuova scheda. (Per impostazione predefinita, gli URLchrome://non sono collegabili.) - Fai clic sul pulsante "Dettagli" nella scheda dell'estensione per visualizzare informazioni dettagliate sull'estensione.
- Fai clic sul pulsante di attivazione/disattivazione accanto a Consenti script utente.
Verifica la disponibilità dell'API
Ti consigliamo di eseguire il seguente controllo per determinare se l'API userScripts è abilitata,
poiché funziona in tutte le versioni di Chrome. Questo controllo tenta di chiamare un metodo browser.userScripts() che dovrebbe sempre riuscire quando l'API è disponibile. Se questa chiamata genera un errore, l'API non è disponibile:
function isUserScriptsAvailable() {
try {
// Method call which throws if API permission or toggle is not enabled.
browser.userScripts.getScripts();
return true;
} catch {
// Not available.
return false;
}
}
Lavora in mondi isolati
Sia gli script utente che gli script dei contenuti possono essere eseguiti in un mondo isolato o nel mondo principale. Un isolated world è un ambiente di esecuzione non accessibile a una pagina host o ad altre estensioni. In questo modo, uno script utente può modificare il proprio ambiente JavaScript senza influire sulla pagina host o sugli script utente e dei contenuti di altre estensioni. Al contrario, gli script utente (e gli script dei contenuti) non sono visibili alla pagina host o agli script utente e dei contenuti di altre estensioni. Gli script in esecuzione nel mondo principale sono accessibili alle pagine host e ad altre estensioni e sono visibili alle pagine host e ad altre estensioni. Per selezionare il mondo, passa "USER_SCRIPT" o "MAIN" quando chiami userScripts.register().
Per configurare una Content Security Policy per il mondo USER_SCRIPT, chiama userScripts.configureWorld():
browser.userScripts.configureWorld({
csp: "script-src 'self'"
});
Messaggistica
Come gli script dei contenuti e i documenti fuori schermo, gli script utente comunicano con altre parti di un'estensione utilizzando la messaggistica (ovvero possono chiamare runtime.sendMessage() e runtime.connect() come farebbe qualsiasi altra parte di un'estensione). Tuttavia, vengono ricevuti utilizzando gestori di eventi dedicati (ovvero non utilizzano onMessage o onConnect). Questi gestori sono chiamati runtime.onUserScriptMessage e runtime.onUserScriptConnect. I gestori dedicati semplificano l'identificazione dei messaggi provenienti dagli script utente, che sono un contesto meno attendibile.
Prima di inviare un messaggio, devi chiamare configureWorld() con l'argomento messaging impostato su true. Tieni presente che gli argomenti csp e messaging possono essere passati contemporaneamente.
browser.userScripts.configureWorld({
messaging: true
});
Aggiornamenti delle estensioni
Gli script utente vengono cancellati quando un'estensione viene aggiornata. Puoi aggiungerli di nuovo eseguendo il codice nel gestore di eventi runtime.onInstalled nel service worker dell'estensione. Rispondi solo al motivo "update" passato al callback dell'evento.
Esempio
Questo esempio è tratto dall'esempio userScript nel nostro repository di esempi.
Registra uno script
L'esempio seguente mostra una chiamata di base a register(). Il primo argomento è un array di oggetti che definiscono gli script da registrare. Sono disponibili più opzioni di quelle mostrate qui.
browser.userScripts.register([{
id: 'test',
matches: ['*://*/*'],
js: [{code: 'alert("Hi!")'}]
}]);
Tipi
ExecutionWorld
Il mondo JavaScript in cui deve essere eseguito uno script utente.
Enum
"MAIN"
Specifica l'ambiente di esecuzione del DOM, ovvero l'ambiente di esecuzione condiviso con il codice JavaScript della pagina host.
"USER_SCRIPT"
Specifica l'ambiente di esecuzione specifico per gli script utente ed è esente dal CSP della pagina.
InjectionResult
Proprietà
-
documentId
stringa
Il documento associato all'inserimento.
-
errore
stringa facoltativa
L'errore, se presente.
erroreresultsi escludono a vicenda. -
frameId
numero
Il frame associato all'inserimento.
-
risultato
any optional
Il risultato dell'esecuzione dello script.
InjectionTarget
Proprietà
-
allFrames
boolean facoltativo
Indica se lo script deve essere inserito in tutti i frame della scheda. Il valore predefinito è false. Questo non deve essere vero se è specificato
frameIds. -
documentIds
string[] facoltativo
Gli ID dei documentId specifici in cui inserire i dati. Questo valore non deve essere impostato se è impostato
frameIds. -
frameIds
number[] facoltativo
Gli ID dei frame specifici in cui eseguire l'inserimento.
-
tabId
numero
L'ID della scheda in cui inserire il codice.
RegisteredUserScript
Proprietà
-
allFrames
boolean facoltativo
Se il valore è true, l'inserimento verrà eseguito in tutti i frame, anche se il frame non è quello più in alto nella scheda. Ogni frame viene controllato in modo indipendente per i requisiti per gli URL; non verrà inserito nei frame secondari se i requisiti per gli URL non sono soddisfatti. Il valore predefinito è false, il che significa che viene trovata una corrispondenza solo per il frame superiore.
-
excludeGlobs
string[] facoltativo
Specifica i pattern con caratteri jolly per le pagine in cui NON verrà inserito questo user script.
-
excludeMatches
string[] facoltativo
Esclude le pagine in cui altrimenti verrebbe inserito questo script utente. Per ulteriori dettagli sulla sintassi di queste stringhe, consulta Pattern di corrispondenza.
-
id
stringa
L'ID dello script utente specificato nella chiamata API. Questa proprietà non deve iniziare con "_" perché è riservata come prefisso per gli ID script generati.
-
includeGlobs
string[] facoltativo
Specifica i pattern con caratteri jolly per le pagine in cui verrà inserito questo script utente.
-
js
ScriptSource[] facoltativo
L'elenco di oggetti ScriptSource che definiscono le origini degli script da inserire nelle pagine corrispondenti. Questa proprietà deve essere specificata per ${ref:register} e, se specificata, deve essere un array non vuoto.
-
corrisponde a
string[] facoltativo
Specifica le pagine in cui verrà inserito questo script utente. Per ulteriori dettagli sulla sintassi di queste stringhe, consulta Pattern di corrispondenza. Questa proprietà deve essere specificata per ${ref:register}.
-
runAt
RunAt facoltativo
Specifica quando i file JavaScript vengono inseriti nella pagina web. Il valore preferito e predefinito è
document_idle. -
mondo
ExecutionWorld facoltativo
L'ambiente di esecuzione JavaScript in cui eseguire lo script. Il valore predefinito è
`USER_SCRIPT`. -
worldId
stringa facoltativa
Chrome 133+ browser.* da Chrome 148Specifica l'ID del mondo dello script utente in cui eseguire l'operazione. Se omesso, lo script verrà eseguito nel mondo degli script utente predefinito. Valido solo se
worldviene omesso o èUSER_SCRIPT. I valori con trattini bassi iniziali (_) sono riservati.
ScriptSource
Proprietà
-
codice
stringa facoltativa
Una stringa contenente il codice JavaScript da inserire. È necessario specificare esattamente uno dei due valori:
fileocode. -
file
stringa facoltativa
Il percorso del file JavaScript da inserire relativo alla directory root dell'estensione. È necessario specificare esattamente uno dei due valori:
fileocode.
UserScriptFilter
Proprietà
-
ids
string[] facoltativo
getScriptsrestituisce solo gli script con gli ID specificati in questo elenco.
UserScriptInjection
Proprietà
-
injectImmediately
boolean facoltativo
Indica se l'inserimento deve essere attivato nel target il prima possibile. Tieni presente che questo non garantisce che l'inserimento avvenga prima del caricamento pagina, poiché la pagina potrebbe essere già stata caricata quando lo script raggiunge la destinazione.
-
js
L'elenco di oggetti ScriptSource che definiscono le origini degli script da inserire nella destinazione.
-
destinazione
Dettagli che specificano la destinazione in cui inserire lo script.
-
mondo
ExecutionWorld facoltativo
Il "mondo" JavaScript in cui eseguire lo script. Il valore predefinito è
USER_SCRIPT. -
worldId
stringa facoltativa
Specifica l'ID del mondo dello script utente in cui eseguire l'operazione. Se omesso, lo script verrà eseguito nel mondo degli script utente predefinito. Valido solo se
worldviene omesso o èUSER_SCRIPT. I valori con trattini bassi iniziali (_) sono riservati.
WorldProperties
Proprietà
-
csp
stringa facoltativa
Specifica il CSP globale. Il valore predefinito è il CSP mondiale
`ISOLATED`. -
messaggistica
boolean facoltativo
Specifica se le API di messaggistica sono esposte. Il valore predefinito è
false. -
worldId
stringa facoltativa
Chrome 133+ browser.* da Chrome 148Specifica l'ID del mondo di script utente specifico da aggiornare. Se non viene fornito, aggiorna le proprietà del mondo degli script utente predefinito. I valori con trattini bassi iniziali (
_) sono riservati.
Metodi
configureWorld()
browser.userScripts.configureWorld(
properties: WorldProperties,
): Promise<void>
Configura l'ambiente di esecuzione `USER_SCRIPT`.
Parametri
-
proprietà
Contiene la configurazione del mondo dello script utente.
Resi
-
Promise<void>
Promessa che si risolve una volta configurato il mondo.
execute()
browser.userScripts.execute(
injection: UserScriptInjection,
): Promise<InjectionResult[]>
Inserisce uno script in un contesto di destinazione. Per impostazione predefinita, lo script verrà eseguito in 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 ha terminato il caricamento. Se lo script restituisce una promise, il browser attenderà che la promise venga risolta e restituirà il valore risultante.
Parametri
-
iniezione
Resi
-
Promise<InjectionResult[]>
getScripts()
browser.userScripts.getScripts(
filter?: UserScriptFilter,
): Promise<RegisteredUserScript[]>
Restituisce tutti gli script utente registrati dinamicamente per questa estensione.
Parametri
-
filtro
UserScriptFilter facoltativo
Se specificato, questo metodo restituisce solo gli script utente corrispondenti.
Resi
-
Promise<RegisteredUserScript[]>
Promise che si risolve con gli script registrati. La promessa verrà rifiutata se si verifica un errore.
getWorldConfigurations()
browser.userScripts.getWorldConfigurations(): Promise<WorldProperties[]>
Recupera tutte le configurazioni del mondo registrate.
Resi
-
Promise<WorldProperties[]>
Promise che si risolve con le configurazioni del mondo registrate.
register()
browser.userScripts.register(
scripts: RegisteredUserScript[],
): Promise<void>
Registra uno o più script utente per questa estensione.
Parametri
-
script
Contiene un elenco di script utente da registrare.
Resi
-
Promise<void>
Promessa che si risolve una volta che gli script sono stati completamente registrati. La promessa verrà rifiutata se si verifica un errore.
resetWorldConfiguration()
browser.userScripts.resetWorldConfiguration(
worldId?: string,
): Promise<void>
Reimposta la configurazione per un ambiente di script utente. Tutti gli script che vengono inseriti nel mondo con l'ID specificato utilizzeranno la configurazione predefinita del mondo.
Parametri
-
worldId
stringa facoltativa
L'ID del mondo degli script utente da reimpostare. Se omesso, reimposta la configurazione del mondo predefinito.
Resi
-
Promise<void>
Promessa che si risolve quando la configurazione viene reimpostata.
unregister()
browser.userScripts.unregister(
filter?: UserScriptFilter,
): Promise<void>
Annulla la registrazione di tutti gli script utente registrati dinamicamente per questa estensione.
Parametri
-
filtro
UserScriptFilter facoltativo
Se specificato, questo metodo annulla la registrazione solo degli script utente corrispondenti.
Resi
-
Promise<void>
Promise che si risolve una volta annullata completamente la registrazione degli script. La promessa verrà rifiutata se si verifica un errore.
update()
browser.userScripts.update(
scripts: RegisteredUserScript[],
): Promise<void>
Aggiorna uno o più script utente per questa estensione.
Parametri
-
script
Contiene un elenco di script utente 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 o la convalida del file oppure se gli ID specificati non corrispondono a uno script completamente registrato, non viene aggiornato alcuno script.
Resi
-
Promise<void>
Promise che si risolve una volta che gli script sono stati completamente aggiornati. La promessa verrà rifiutata se si verifica un errore.