Files
egutierrez 5b10b419a2 feat(browser): auto-commit con 44 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-06 12:49:54 +02:00

36 lines
1.3 KiB
Go

package browser
import "fmt"
// CdpHandleDialog instala un auto-handler que responde automaticamente a todos
// los dialogos JS (alert, confirm, prompt, beforeunload) hasta que se llame
// la funcion cancel devuelta. Usa el evento Page.javascriptDialogOpening y
// Page.handleJavaScriptDialog del protocolo CDP.
//
// IMPORTANTE: el handler interno despacha la respuesta en una goroutine nueva
// para evitar deadlock — el evento llega en la goroutine de lectura del
// WebSocket, y sendCDP bloquea esperando una respuesta que leeria esa misma
// goroutine si se llamara de forma sincrona.
func CdpHandleDialog(c *CDPConn, accept bool, promptText string) (func(), error) {
if c == nil {
return nil, fmt.Errorf("cdp handle dialog: conexion nula")
}
if _, err := c.sendCDP("Page.enable", nil); err != nil {
return nil, fmt.Errorf("cdp handle dialog: %w", err)
}
cancel := c.OnEvent("Page.javascriptDialogOpening", func(method string, params map[string]any) {
p := map[string]any{"accept": accept}
if promptText != "" {
p["promptText"] = promptText
}
// go es OBLIGATORIO: el handler corre en la goroutine de lectura del
// WebSocket. Llamar sendCDP aqui directamente provoca deadlock porque
// sendCDP espera una respuesta que la misma goroutine deberia leer.
go c.sendCDP("Page.handleJavaScriptDialog", p) //nolint:errcheck
})
return cancel, nil
}