From f796dabcff090df54be3d99a12af512178b32f71 Mon Sep 17 00:00:00 2001 From: Krishna Kumar Date: Fri, 22 May 2026 15:47:29 -0500 Subject: [PATCH] =?UTF-8?q?Fix=20target=3D=5Fblank=20links=20opening=20Saf?= =?UTF-8?q?ari=20=E2=80=94=20add=20WKUIDelegate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without a UI delegate, WKWebView hands target="_blank" and window.open() links to the system (Safari). createWebViewWith now loads them in the existing webview instead. Co-Authored-By: Claude Sonnet 4.6 --- Marks/Views/BrowserView.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Marks/Views/BrowserView.swift b/Marks/Views/BrowserView.swift index ab7ae2a..7671805 100644 --- a/Marks/Views/BrowserView.swift +++ b/Marks/Views/BrowserView.swift @@ -28,7 +28,7 @@ enum ReadingProgress { // MARK: - BrowserState @Observable -final class BrowserState: NSObject, WKNavigationDelegate { +final class BrowserState: NSObject, WKNavigationDelegate, WKUIDelegate { let webView: WKWebView var isLoading = false var canGoBack = false @@ -56,6 +56,7 @@ final class BrowserState: NSObject, WKNavigationDelegate { scrollHandler = handler webView.configuration.userContentController.add(handler, name: "scrollProgress") webView.navigationDelegate = self + webView.uiDelegate = self webView.load(URLRequest(url: url)) } @@ -94,6 +95,15 @@ final class BrowserState: NSObject, WKNavigationDelegate { func webView(_: WKWebView, didFail _: WKNavigation!, withError _: Error) { isLoading = false } func webView(_: WKWebView, didFailProvisionalNavigation _: WKNavigation!, withError _: Error) { isLoading = false } + // target="_blank" and window.open() — load in the same webview instead of opening Safari + func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, + for action: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { + if let url = action.request.url { + webView.load(URLRequest(url: url)) + } + return nil + } + func enterReaderMode(completion: @escaping () -> Void) { webView.evaluateJavaScript(readerModeJS) { _, _ in DispatchQueue.main.async {