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 }