package webutil import ( "fmt" "html" "net/url" "strings" ) // SanitizeCrashPageOriginalURI validates and sanitizes a URI for display on a crash page. // Only http, https, and dumb schemes are allowed. Non-allowlisted schemes such as // javascript:, data:, and vbscript: are intentionally rejected to prevent XSS when // the URI is rendered into crash page HTML. func SanitizeCrashPageOriginalURI(originalURI string) string { originalURI = strings.TrimSpace(originalURI) if originalURI == "" { return "" } parsed, err := url.Parse(originalURI) if err != nil { return "" } switch strings.ToLower(parsed.Scheme) { case "http", "https": if parsed.Host == "" { return "" } return parsed.String() case "dumb": if parsed.Host == "" && parsed.Opaque == "" { return "" } return parsed.String() default: // Security: reject all non-allowlisted schemes (javascript:, data:, vbscript:, etc.) return "" } } // BuildCrashPageHTML returns a self-contained HTML page for renderer crash recovery. func BuildCrashPageHTML(originalURI string) string { escapedURI := html.EscapeString(originalURI) return fmt.Sprintf(` Renderer crashed

Renderer process ended

The current page was interrupted. You can reload it to continue browsing.

%s
`, escapedURI, escapedURI) }