Permite force-instalar extensiones self-hosted bajo managed policy indicando
un update_url propio (p.ej. file:// a un update.xml local que apunta a un .crx).
Necesario para cargar extensiones propias (como la de captura de web_proxy)
cuando hay una managed policy activa y --load-extension queda desactivado en
Chromium 137+. Forma simple '<id>' sigue usando el update_url por defecto.
Rediseño de apply_chromium_extension_policy y nueva función de purga in-place,
tras resolver por qué las extensiones bloqueadas reaparecían en Chromium 148.
- apply_chromium_extension_policy: añade --block (ExtensionInstallBlocklist).
Reemplaza el modo ExtensionSettings "*": blocked (que rompía las extensiones
unpacked vía --load-extension, p.ej. la de captura de web_proxy con el error
'Loading of unpacked extensions is disabled by the administrator') por una
blocklist específica. FIX RAÍZ: los backups se guardan fuera de policies/managed/
(en policy-backups/), porque Chromium lee TODOS los archivos del directorio
managed/ sin filtrar extensión de nombre — un extensions.json.bak ahí se mergea
con la policy y reinyecta las extensiones del backup (location=7).
- clean_chrome_profile_extensions (nueva): purga in-place de un perfil existente
(borra carpetas de Extensions/ + refs en Preferences/Secure Preferences) dejando
solo la whitelist. Complementa la policy: la policy evita reinstalación, esta
desinstala lo ya presente. Requiere chromium cerrado.
Ambas: dominio browser, grupo navegator, guard de auto-ejecución, dry-run.
Cierra el gap de reproducibilidad entre PCs del proyecto web_scraping:
la organizacion de extensiones y el CDP global dejaban de ser pasos
manuales con sudo documentados en prosa.
- apply_chromium_extension_policy: escribe ExtensionInstallForcelist
(whitelist via --keep) en /etc/chromium/policies/managed/extensions.json
de forma idempotente, con backup automatico y validacion JSON. --dry-run
previsualiza sin tocar el sistema.
- apply_chromium_cdp_flag: gestiona /etc/chromium.d/cdp (CDP global).
Loopback por defecto, --network para bind 0.0.0.0 (con aviso), --remove
para desactivar, --dry-run para previsualizar. Idempotente con backup.
Ambas: dominio browser, grupo navegator, impuras (escriben en /etc via
sudo), guard de auto-ejecucion (ejecutables con fn run y sourceables).
Docs del proyecto (CONVENTIONS.md reglas 8/9, CHROMIUM_SYSTEM.md
inventario + tabla accionable) ahora apuntan a 'fn run apply_chromium_*'
como metodo canonico en vez de editar los archivos de /etc a mano.
Funciones nuevas del dominio browser (grupo navegator):
- cdp_move_mouse_human / cdp_click_human: movimiento de raton con curva
de Bezier cubica, easing y micro-jitter para imitar comportamiento
humano y reducir deteccion de automatizacion.
- cdp_wait_idle: espera network-idle contando requests en vuelo via
eventos CDP Network.*; inmune a extensiones que mutan el DOM
(Dark Reader, uBlock) y a animaciones JS.
- list_chrome_profiles: lista perfiles de un user-data-dir (extensiones,
nombre legible, preferencias).
- prepare_chrome_profile (bash): clona un user-data-dir conservando solo
una whitelist de extensiones (default uBlock Origin Lite).
Modificadas:
- chrome_launch: Linux-first (chromium/google-chrome/brave antes que
chrome.exe), KeepExtensions y Setpgid para matar el arbol con cdp_close.
- cdp_close: kill por grupo de proceso.
Todas con tests verdes (go test ./functions/browser ok).