5b10b419a2
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
36 lines
1.3 KiB
Go
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
|
|
}
|