c165f2f788
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/
289 lines
8.3 KiB
Markdown
289 lines
8.3 KiB
Markdown
# 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
|
|
|
|
```go
|
|
// 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
|
|
|
|
```go
|
|
// === 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
|
|
```go
|
|
config := browser.DefaultConfig()
|
|
config.Extensions = []*browser.ExtensionConfig{
|
|
{Path: "/path/to/ublock-origin"},
|
|
}
|
|
b, _ := browser.Launch(ctx, config)
|
|
```
|
|
|
|
### Caso 2: Cargar extensión en runtime
|
|
```go
|
|
ext, _ := b.LoadExtension(ctx, "/path/to/extension")
|
|
log.Printf("Cargada: %s v%s\n", ext.Name, ext.Version)
|
|
```
|
|
|
|
### Caso 3: Usar extensión predefinida
|
|
```go
|
|
config := browser.DefaultConfig()
|
|
ublock, _ := browser.LoadPresetExtension("ublock-origin")
|
|
config.Extensions = []*browser.ExtensionConfig{ublock}
|
|
b, _ := browser.Launch(ctx, config)
|
|
```
|
|
|
|
### Caso 4: Gestionar extensiones existentes
|
|
```go
|
|
// 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
|
|
```go
|
|
// 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
|
|
```go
|
|
// 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
|
|
|
|
- Chrome Extensions: https://developer.chrome.com/docs/extensions/
|
|
- Load unpacked extensions: https://developer.chrome.com/docs/extensions/mv3/getstarted/
|
|
- Chrome Extension IDs: https://robwu.nl/crxviewer/
|
|
- Manifest V3: https://developer.chrome.com/docs/extensions/mv3/intro/
|
|
- Extension CLI flags: https://peter.sh/experiments/chromium-command-line-switches/
|