Descripción
Usa la API de userScripts para ejecutar secuencias de comandos del usuario en el contexto de las secuencias de comandos del usuario.
Permisos
userScriptsPara usar la API de User Scripts, browser.userScripts, agrega el permiso "userScripts" a tu manifest.json y "host_permissions" para los sitios en los que quieras ejecutar secuencias de comandos.
{
"name": "User script test extension",
"manifest_version": 3,
"minimum_chrome_version": "120",
"permissions": [
"userScripts"
],
"host_permissions": [
"*://example.com/*"
]
}
Disponibilidad
Conceptos y uso
Una secuencia de comandos del usuario es un fragmento de código que se inserta en una página web para modificar su apariencia o comportamiento. A diferencia de otras funciones de extensión, como las secuencias de comandos de contenido y la API de browser.scripting, la API de secuencias de comandos del usuario te permite ejecutar código arbitrario. Esta API es obligatoria para las extensiones que ejecutan secuencias de comandos proporcionadas por el usuario que no se pueden enviar como parte del paquete de la extensión.
Habilita el uso de la API de userScripts
Después de que tu extensión reciba el permiso para usar la API de userScripts, los usuarios deberán habilitar un botón de activación específico para permitir que tu extensión use la API. El parámetro de activación específico requerido y el comportamiento de la API cuando está inhabilitada varían según la versión de Chrome.
Usa la siguiente verificación para determinar qué botón de activación debe habilitar el usuario, por ejemplo, durante la integración de un usuario nuevo:
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.
}
En las siguientes secciones, se describen los diferentes parámetros de configuración y cómo habilitarlos.
Versiones de Chrome anteriores a la 138 (botón de activación del modo de desarrollador)
Como desarrollador de extensiones, ya tienes habilitado el modo de desarrollador en tu instalación de Chrome. Tus usuarios también deben habilitar el modo de desarrollador.
Puedes copiar y pegar las siguientes instrucciones en la documentación de tu extensión para tus usuarios
- Ingresa
chrome://extensionsen una pestaña nueva para ir a la página Extensiones. (Por diseño, las URLs dechrome://no se pueden vincular). Para habilitar el modo de desarrollador, haz clic en el interruptor junto a Modo de desarrollador.
Página de extensiones (chrome://extensions)
Chrome 138 y versiones posteriores (botón de activación Permitir secuencias de comandos del usuario)
El botón de activación Permitir secuencias de comandos de usuario se encuentra en la página de detalles de cada extensión (por ejemplo, chrome://extensions/?id=YOUR_EXTENSION_ID).
Puedes copiar y pegar las siguientes instrucciones en la documentación de tu extensión para los usuarios:
- Ingresa
chrome://extensionsen una pestaña nueva para ir a la página Extensiones. (Por diseño, las URLs dechrome://no se pueden vincular). - Haz clic en el botón "Detalles" de la tarjeta de la extensión para ver información detallada sobre ella.
- Haz clic en el interruptor junto a Permitir secuencias de comandos del usuario.
Verifica la disponibilidad de la API
Te recomendamos que realices la siguiente verificación para determinar si la API de userScripts está habilitada,
ya que funciona en todas las versiones de Chrome. Esta verificación intenta llamar a un método browser.userScripts() que siempre debería tener éxito cuando la API está disponible. Si esta llamada arroja un error, la API no está disponible:
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;
}
}
Trabaja en mundos aislados
Tanto las secuencias de comandos de usuario como las de contenido se pueden ejecutar en un entorno aislado o en el entorno principal. Un mundo aislado es un entorno de ejecución al que no pueden acceder una página de host ni otras extensiones. Esto permite que una secuencia de comandos de usuario cambie su entorno de JavaScript sin afectar la página host ni las secuencias de comandos de usuario y contenido de otras extensiones. Por el contrario, los scripts de usuario (y los scripts de contenido) no son visibles para la página de host ni para los scripts de usuario y contenido de otras extensiones. Las secuencias de comandos que se ejecutan en el mundo principal son accesibles para las páginas de host y otras extensiones, y son visibles para las páginas de host y otras extensiones. Para seleccionar el mundo, pasa "USER_SCRIPT" o "MAIN" cuando llames a userScripts.register().
Para configurar una política de seguridad del contenido para el mundo USER_SCRIPT, llama a userScripts.configureWorld():
browser.userScripts.configureWorld({
csp: "script-src 'self'"
});
Mensajería
Al igual que las secuencias de comandos de contenido y los documentos fuera de pantalla, las secuencias de comandos de usuario se comunican con otras partes de una extensión a través de la mensajería (lo que significa que pueden llamar a runtime.sendMessage() y runtime.connect() como lo haría cualquier otra parte de una extensión). Sin embargo, se reciben con controladores de eventos dedicados (es decir, no usan onMessage ni onConnect). Estos controladores se llaman runtime.onUserScriptMessage y runtime.onUserScriptConnect. Los controladores dedicados facilitan la identificación de los mensajes de las secuencias de comandos de usuario, que son un contexto menos confiable.
Antes de enviar un mensaje, debes llamar a configureWorld() con el argumento messaging establecido en true. Ten en cuenta que los argumentos csp y messaging se pueden pasar al mismo tiempo.
browser.userScripts.configureWorld({
messaging: true
});
Actualizaciones de extensiones
Las secuencias de comandos del usuario se borran cuando se actualiza una extensión. Puedes volver a agregarlos ejecutando código en el controlador de eventos runtime.onInstalled en el service worker de la extensión. Responde solo al motivo "update" que se pasa a la devolución de llamada del evento.
Ejemplo
Este ejemplo proviene de la muestra de userScript en nuestro repositorio de muestras.
Registra una secuencia de comandos
En el siguiente ejemplo, se muestra una llamada básica a register(). El primer argumento es un array de objetos que definen las secuencias de comandos que se registrarán. Hay más opciones de las que se muestran aquí.
browser.userScripts.register([{
id: 'test',
matches: ['*://*/*'],
js: [{code: 'alert("Hi!")'}]
}]);
Tipos
ExecutionWorld
Es el mundo de JavaScript en el que se ejecutará una secuencia de comandos del usuario.
Enum
"MAIN"
Especifica el entorno de ejecución del DOM, que es el entorno de ejecución compartido con el JavaScript de la página de host.
"USER_SCRIPT"
Especifica el entorno de ejecución que es específico de las secuencias de comandos del usuario y está exento de la CSP de la página.
InjectionResult
Propiedades
-
documentId
string
Es el documento asociado con la inserción.
-
error
string opcional
El error, si lo hay.
erroryresultson mutuamente excluyentes. -
frameId
número
Es el marco asociado con la inserción.
-
resultado
any optional
Es el resultado de la ejecución de la secuencia de comandos.
InjectionTarget
Propiedades
-
allFrames
booleano opcional
Indica si la secuencia de comandos debe insertarse en todos los marcos de la pestaña. La configuración predeterminada es "false". Esto no debe ser verdadero si se especifica
frameIds. -
documentIds
string[] opcional
Son los IDs de documentIds específicos en los que se insertarán los datos. No se debe configurar si se establece
frameIds. -
frameIds
number[] opcional
Son los IDs de los marcos específicos en los que se insertará el contenido.
-
tabId
número
Es el ID de la pestaña en la que se insertará.
RegisteredUserScript
Propiedades
-
allFrames
booleano opcional
Si es verdadero, se insertará en todos los marcos, incluso si el marco no es el que está más arriba en la pestaña. Cada marco se verifica de forma independiente para comprobar si cumple con los requisitos de las URLs. No se insertará en los marcos secundarios si no se cumplen estos requisitos. El valor predeterminado es falso, lo que significa que solo se hace coincidir el marco superior.
-
excludeGlobs
string[] opcional
Especifica patrones de comodín para las páginas en las que NO se insertará esta secuencia de comandos del usuario.
-
excludeMatches
string[] opcional
Excluye las páginas en las que, de lo contrario, se insertaría esta secuencia de comandos del usuario. Consulta Patrones de coincidencia para obtener más detalles sobre la sintaxis de estas cadenas.
-
id
string
Es el ID de la secuencia de comandos del usuario especificada en la llamada a la API. Esta propiedad no debe comenzar con un "_", ya que está reservado como prefijo para los IDs de secuencias de comandos generados.
-
includeGlobs
string[] opcional
Especifica patrones de comodín para las páginas en las que se insertará esta secuencia de comandos del usuario.
-
js
ScriptSource[] opcional
Es la lista de objetos ScriptSource que definen las fuentes de las secuencias de comandos que se insertarán en las páginas coincidentes. Esta propiedad se debe especificar para ${ref:register} y, cuando se especifica, debe ser un array no vacío.
-
coincide con
string[] opcional
Especifica en qué páginas se insertará esta secuencia de comandos del usuario. Consulta Patrones de coincidencia para obtener más detalles sobre la sintaxis de estas cadenas. Esta propiedad se debe especificar para ${ref:register}.
-
runAt
RunAt opcional
Especifica cuándo se insertan los archivos JavaScript en la página web. El valor preferido y predeterminado es
document_idle. -
mundo
ExecutionWorld opcional
Es el entorno de ejecución de JavaScript en el que se ejecutará la secuencia de comandos. El valor predeterminado es
`USER_SCRIPT`. -
worldId
string opcional
Chrome 133 y versiones posteriores browser.* desde Chrome 148Especifica el ID del entorno de la secuencia de comandos del usuario en el que se ejecutará. Si se omite, la secuencia de comandos se ejecutará en el entorno de secuencias de comandos de usuario predeterminado. Solo es válido si se omite
worldo si esUSER_SCRIPT. Los valores con guiones bajos iniciales (_) están reservados.
ScriptSource
Propiedades
-
código
string opcional
Es una cadena que contiene el código JavaScript que se insertará. Se debe especificar exactamente uno de los valores
fileocode. -
archivo
string opcional
Es la ruta de acceso del archivo de JavaScript que se insertará en relación con el directorio raíz de la extensión. Se debe especificar exactamente uno de los valores
fileocode.
UserScriptFilter
Propiedades
-
ids
string[] opcional
getScriptssolo devuelve las secuencias de comandos con los IDs especificados en esta lista.
UserScriptInjection
Propiedades
-
injectImmediately
booleano opcional
Indica si la inserción se debe activar en el destino lo antes posible. Ten en cuenta que esto no garantiza que la inserción se produzca antes de la carga de la página, ya que es posible que la página ya se haya cargado cuando la secuencia de comandos llegue al destino.
-
js
Es la lista de objetos ScriptSource que definen las fuentes de las secuencias de comandos que se insertarán en el destino.
-
objetivo
Son los detalles que especifican el destino en el que se insertará la secuencia de comandos.
-
mundo
ExecutionWorld opcional
Es el "mundo" de JavaScript en el que se ejecutará la secuencia de comandos. El valor predeterminado es
USER_SCRIPT. -
worldId
string opcional
Especifica el ID del entorno de la secuencia de comandos del usuario en el que se ejecutará. Si se omite, la secuencia de comandos se ejecutará en el entorno de secuencias de comandos de usuario predeterminado. Solo es válido si se omite
worldo si esUSER_SCRIPT. Los valores con guiones bajos iniciales (_) están reservados.
WorldProperties
Propiedades
-
csp
string opcional
Especifica el CSP del mundo. El valor predeterminado es el CSP mundial de
`ISOLATED`. -
mensajería
booleano opcional
Especifica si se exponen las APIs de mensajería. El valor predeterminado es
false. -
worldId
string opcional
Chrome 133 y versiones posteriores browser.* desde Chrome 148Especifica el ID del entorno de secuencias de comandos de usuario específico que se actualizará. Si no se proporciona, actualiza las propiedades del entorno de secuencias de comandos del usuario predeterminado. Los valores con guiones bajos iniciales (
_) están reservados.
Métodos
configureWorld()
browser.userScripts.configureWorld(
properties: WorldProperties,
): Promise<void>
Configura el entorno de ejecución de `USER_SCRIPT`.
Parámetros
-
propiedades
Contiene la configuración del entorno de la secuencia de comandos del usuario.
Muestra
-
Promise<void>
Es una promesa que se resuelve una vez que se configura el mundo.
execute()
browser.userScripts.execute(
injection: UserScriptInjection,
): Promise<InjectionResult[]>
Inserta una secuencia de comandos en un contexto de destino. De forma predeterminada, la secuencia de comandos se ejecutará en document_idle o de inmediato si la página ya se cargó. Si se establece la propiedad injectImmediately, la secuencia de comandos se insertará sin esperar, incluso si la página no terminó de cargarse. Si la secuencia de comandos se evalúa como una promesa, el navegador esperará a que se resuelva y devolverá el valor resultante.
Parámetros
-
inyección
Muestra
-
Promise<InjectionResult[]>
getScripts()
browser.userScripts.getScripts(
filter?: UserScriptFilter,
): Promise<RegisteredUserScript[]>
Muestra todas las secuencias de comandos de usuario registradas de forma dinámica para esta extensión.
Parámetros
-
filter
UserScriptFilter opcional
Si se especifica, este método solo devuelve las secuencias de comandos del usuario que coinciden con él.
Muestra
-
Promise<RegisteredUserScript[]>
Es una promesa que se resuelve con las secuencias de comandos registradas. La promesa se rechazará si se produce un error.
getWorldConfigurations()
browser.userScripts.getWorldConfigurations(): Promise<WorldProperties[]>
Recupera todas las configuraciones de mundo registradas.
Muestra
-
Promise<WorldProperties[]>
Es la promesa que se resuelve con las configuraciones de mundo registradas.
register()
browser.userScripts.register(
scripts: RegisteredUserScript[],
): Promise<void>
Registra una o más secuencias de comandos de usuario para esta extensión.
Parámetros
-
secuencias de comandos
Contiene una lista de secuencias de comandos de usuario que se registrarán.
Muestra
-
Promise<void>
Es una promesa que se resuelve una vez que las secuencias de comandos se registraron por completo. La promesa se rechazará si se produce un error.
resetWorldConfiguration()
browser.userScripts.resetWorldConfiguration(
worldId?: string,
): Promise<void>
Restablece la configuración de un entorno de secuencias de comandos del usuario. Cualquier secuencia de comandos que se inserte en el entorno con el ID especificado usará la configuración predeterminada del entorno.
Parámetros
-
worldId
string opcional
Es el ID del entorno de la secuencia de comandos del usuario que se restablecerá. Si se omite, se restablece la configuración del mundo predeterminado.
Muestra
-
Promise<void>
Es una promesa que se resuelve cuando se restablece la configuración.
unregister()
browser.userScripts.unregister(
filter?: UserScriptFilter,
): Promise<void>
Cancela el registro de todas las secuencias de comandos de usuario registradas de forma dinámica para esta extensión.
Parámetros
-
filter
UserScriptFilter opcional
Si se especifica, este método solo cancela el registro de las secuencias de comandos del usuario que coincidan con él.
Muestra
-
Promise<void>
Es la promesa que se resuelve una vez que se cancela por completo el registro de las secuencias de comandos. La promesa se rechazará si se produce un error.
update()
browser.userScripts.update(
scripts: RegisteredUserScript[],
): Promise<void>
Actualiza una o más secuencias de comandos del usuario para esta extensión.
Parámetros
-
secuencias de comandos
Contiene una lista de secuencias de comandos de usuario que se actualizarán. Una propiedad solo se actualiza para la secuencia de comandos existente si se especifica en este objeto. Si se producen errores durante el análisis de la secuencia de comandos o la validación del archivo, o si los IDs especificados no corresponden a una secuencia de comandos completamente registrada, no se actualizará ninguna secuencia de comandos.
Muestra
-
Promise<void>
Es la promesa que se resuelve una vez que las secuencias de comandos se actualizan por completo. La promesa se rechazará si se produce un error.