package browser import ( "fmt" ) // CdpNavBack retrocede una entrada en el historial de navegacion de la pestana activa. // Obtiene el historial via Page.getNavigationHistory, calcula el indice anterior y // navega a esa entrada via Page.navigateToHistoryEntry. // Retorna error si ya estamos al inicio del historial. func CdpNavBack(c *CDPConn) error { if c == nil { return fmt.Errorf("cdp nav back: conexion nula") } result, err := c.sendCDP("Page.getNavigationHistory", nil) if err != nil { return fmt.Errorf("cdp nav back: obtener historial: %w", err) } currentIndexRaw, ok := result["currentIndex"] if !ok { return fmt.Errorf("cdp nav back: respuesta sin currentIndex") } currentIndex, ok := currentIndexRaw.(float64) if !ok { return fmt.Errorf("cdp nav back: currentIndex tipo inesperado: %T", currentIndexRaw) } entriesRaw, ok := result["entries"] if !ok { return fmt.Errorf("cdp nav back: respuesta sin entries") } entries, ok := entriesRaw.([]any) if !ok { return fmt.Errorf("cdp nav back: entries tipo inesperado: %T", entriesRaw) } idx := int(currentIndex) - 1 if idx < 0 { return fmt.Errorf("cdp nav back: ya en el inicio del historial") } if idx >= len(entries) { return fmt.Errorf("cdp nav back: indice %d fuera de rango (len=%d)", idx, len(entries)) } entry, ok := entries[idx].(map[string]any) if !ok { return fmt.Errorf("cdp nav back: entrada[%d] tipo inesperado: %T", idx, entries[idx]) } entryIDRaw, ok := entry["id"] if !ok { return fmt.Errorf("cdp nav back: entrada sin campo id") } entryIDFloat, ok := entryIDRaw.(float64) if !ok { return fmt.Errorf("cdp nav back: entry id tipo inesperado: %T", entryIDRaw) } entryID := int(entryIDFloat) _, err = c.sendCDP("Page.navigateToHistoryEntry", map[string]any{"entryId": entryID}) if err != nil { return fmt.Errorf("cdp nav back: navegar a entrada %d: %w", entryID, err) } return nil }