Files
navegator/dev/issues/completed/004-gestion-extensiones-chrome.md
T
Developer c165f2f788 docs: issues técnicas para nuevas funcionalidades
Agrega 19 issues técnicas documentando funcionalidades implementadas y pendientes.

Issues completadas (movidas a dev/issues/completed/):
- 001-conversor-web-markdown.md
- 002-accessibility-tree.md
- 003-gestion-cookies-perfil.md
- 004-gestion-extensiones-chrome.md
- 005-eliminar-timeouts-innecesarios.md

Issues implementadas:
- 006-manejo-tabs-ventanas.md
- 016-manejo-iframes.md
- 017-actions-api.md
- 018-file-uploads.md
- 019-expected-conditions-mejoradas.md

Issues pendientes (media prioridad):
- 007-alert-prompt-confirm-handling.md
- 008-screenshot-elementos-especificos.md
- 009-pdf-generation.md
- 010-device-emulation-completo.md
- 011-downloads-handling.md

Issues pendientes (baja prioridad / avanzado):
- 012-browser-contexts-multi-sesion.md
- 013-video-recording.md
- 014-network-mocking-avanzado.md
- 015-geolocation-permissions.md

Incluye también dev/NUEVAS_FUNCIONALIDADES.md con resumen completo.

Directorio: dev/
2026-03-25 00:49:06 +01:00

8.3 KiB

Issue #004: Administración de extensiones de Chrome

Tipo: Enhancement Prioridad: Media Estado: Pendiente

Descripción

Implementar sistema completo para cargar, gestionar y configurar extensiones de Chrome en perfiles de navegador.

Funcionalidad deseada

Carga de extensiones

  • Cargar extensiones desde archivos .crx (empaquetadas)
  • Cargar extensiones desempaquetadas (carpetas)
  • Cargar múltiples extensiones simultáneamente
  • Especificar extensiones en configuración de perfil

Gestión de extensiones

  • Listar extensiones instaladas en perfil
  • Habilitar/deshabilitar extensiones
  • Desinstalar extensiones
  • Actualizar extensiones
  • Obtener información de extensión (nombre, versión, ID)

Extensiones predefinidas

  • Configuraciones para extensiones populares
  • uBlock Origin - bloqueador de ads
  • Tampermonkey - userscripts
  • Cookie editors
  • Proxy switchers
  • User-agent switchers

Configuración de extensiones

  • Establecer configuración de extensión desde código
  • Importar/exportar configuraciones
  • Templates de configuración para casos comunes

Implementación técnica

Archivo sugerido

pkg/browser/extensions.go

Flags de Chrome necesarias

// Cargar extensión específica
"--load-extension=/path/to/extension"

// Cargar múltiples extensiones
"--load-extension=/path/ext1,/path/ext2,/path/ext3"

// Deshabilitar todas excepto las especificadas
"--disable-extensions-except=/path/ext1,/path/ext2"

// Desempaquetar y cargar .crx
"--load-extension=/path/to/extension.crx"

API propuesta

// === Configuración de extensiones ===

type ExtensionConfig struct {
    Path      string            // Ruta a extensión (carpeta o .crx)
    ID        string            // ID de extensión (opcional)
    Enabled   bool              // Habilitada por defecto
    Settings  map[string]string // Configuración específica
}

// Config.Extensions - campo para extensiones
type Config struct {
    // ... campos existentes ...
    Extensions         []*ExtensionConfig // Extensiones a cargar
    DisableOtherExts   bool               // Deshabilitar extensiones no especificadas
}

// === Gestión en runtime ===

// Extension representa una extensión instalada
type Extension struct {
    ID          string
    Name        string
    Version     string
    Path        string
    Enabled     bool
    Description string
}

// ListExtensions lista extensiones instaladas en el navegador actual
func (b *Browser) ListExtensions(ctx context.Context) ([]*Extension, error)

// LoadExtension carga una extensión en runtime
func (b *Browser) LoadExtension(ctx context.Context, path string) (*Extension, error)

// EnableExtension habilita una extensión
func (b *Browser) EnableExtension(ctx context.Context, extensionID string) error

// DisableExtension deshabilita una extensión
func (b *Browser) DisableExtension(ctx context.Context, extensionID string) error

// RemoveExtension desinstala una extensión
func (b *Browser) RemoveExtension(ctx context.Context, extensionID string) error

// GetExtensionSettings obtiene configuración de una extensión
func (b *Browser) GetExtensionSettings(ctx context.Context, extensionID string) (map[string]interface{}, error)

// SetExtensionSettings establece configuración de extensión
func (b *Browser) SetExtensionSettings(ctx context.Context, extensionID string, settings map[string]interface{}) error

// === Extensiones predefinidas ===

// PresetExtensions contiene configuraciones de extensiones populares
var PresetExtensions = map[string]*ExtensionConfig{
    "ublock-origin": {
        Path: "~/.navegator/extensions/ublock-origin",
        ID:   "cjpalhdlnbpafiamejdnhcphjbkeiagm",
    },
    "tampermonkey": {
        Path: "~/.navegator/extensions/tampermonkey",
        ID:   "dhdgffkkebhmkfjojejmpbldmpobfkfo",
    },
}

// LoadPresetExtension carga una extensión predefinida
func LoadPresetExtension(name string) (*ExtensionConfig, error)

Estructura de directorio de extensiones

~/.navegator/
├── profiles/
│   └── <nombre>/
│       └── Extensions/          # Extensiones instaladas del perfil
│           └── <extension-id>/
│               └── <version>/
└── extensions/                  # Extensiones compartidas
    ├── ublock-origin/
    │   ├── manifest.json
    │   └── ...
    └── tampermonkey/
        ├── manifest.json
        └── ...

Casos de uso

Caso 1: Lanzar con uBlock Origin

config := browser.DefaultConfig()
config.Extensions = []*browser.ExtensionConfig{
    {Path: "/path/to/ublock-origin"},
}
b, _ := browser.Launch(ctx, config)

Caso 2: Cargar extensión en runtime

ext, _ := b.LoadExtension(ctx, "/path/to/extension")
log.Printf("Cargada: %s v%s\n", ext.Name, ext.Version)

Caso 3: Usar extensión predefinida

config := browser.DefaultConfig()
ublock, _ := browser.LoadPresetExtension("ublock-origin")
config.Extensions = []*browser.ExtensionConfig{ublock}
b, _ := browser.Launch(ctx, config)

Caso 4: Gestionar extensiones existentes

// Listar todas
exts, _ := b.ListExtensions(ctx)
for _, ext := range exts {
    log.Printf("%s: %s\n", ext.Name, ext.Enabled)
}

// Deshabilitar extensión específica
b.DisableExtension(ctx, "extension-id-here")

Caso 5: Configurar extensión

// Configurar uBlock Origin con listas personalizadas
b.SetExtensionSettings(ctx, "cjpalhdlnbpafiamejdnhcphjbkeiagm", map[string]interface{}{
    "customFilterLists": []string{
        "https://example.com/my-filters.txt",
    },
})

Extensiones útiles para automatización

Stealth y anti-detección

  • Buster: Solver de CAPTCHAs
  • User-Agent Switcher: Cambiar user agent
  • Canvas Fingerprint Defender: Anti-fingerprinting

Scraping

  • uBlock Origin: Bloquear ads y trackers
  • Cookie Editor: Gestión avanzada de cookies
  • Header Editor: Modificar headers HTTP

Automatización

  • Tampermonkey: Ejecutar userscripts personalizados
  • Violentmonkey: Alternativa a Tampermonkey

Desarrollo

  • React DevTools: Inspeccionar componentes React
  • Vue.js DevTools: Inspeccionar aplicaciones Vue
  • Redux DevTools: Debugging de estado Redux

Obtener extensiones

Chrome Web Store

# URL de extensión en Chrome Web Store
https://chrome.google.com/webstore/detail/<extension-id>

# Descargar .crx con herramientas
# https://github.com/Rob--W/crxviewer

Desarrollo local

# Crear extensión simple
mkdir my-extension
cd my-extension
cat > manifest.json <<EOF
{
  "manifest_version": 3,
  "name": "My Extension",
  "version": "1.0",
  "description": "Custom extension"
}
EOF

CDP para gestión de extensiones

CDP no tiene soporte directo robusto para extensiones, pero podemos:

  1. Launch flags: Usar --load-extension al inicio
  2. Service workers: Comunicarse con background scripts de extensión vía chrome.runtime
  3. Extension pages: Navegar a chrome-extension://<id>/page.html
  4. Local storage: Acceder a storage de extensión si es accesible
// Ejecutar código en contexto de extensión
script := fmt.Sprintf(`
    chrome.runtime.sendMessage('%s', {action: 'configure'}, response => {
        return response;
    });
`, extensionID)

Consideraciones especiales

Manifest V3 vs V2

  • Chrome está migrando a Manifest V3
  • Algunas extensiones V2 dejarán de funcionar
  • Verificar compatibilidad al cargar extensiones

Permisos

  • Extensiones pueden requerir permisos específicos
  • Algunas operaciones requieren interacción manual la primera vez
  • Considerar pre-configurar permisos en perfil

Actualizaciones

  • Extensiones de Chrome Web Store se actualizan automáticamente
  • Extensiones locales no se actualizan
  • Implementar sistema de actualización manual si es necesario

Headless mode

  • Algunas extensiones no funcionan en modo headless
  • Extensiones con UI pueden requerir modo visible
  • Probar compatibilidad con --headless=new

Referencias