From 2f9f531e6a088703c6b65fb3bca9e9fcb29c1b92 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 16 May 2026 16:43:26 +0900 Subject: [PATCH 1/2] fix(browser): handle absolute local file paths --- Sources/Panels/BrowserPanel.swift | 5 +++++ cmuxTests/GhosttyConfigTests.swift | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 8dc311ff3152..c695a9137428 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -4555,6 +4555,11 @@ private func browserBareHostCandidate(_ lowercasedInput: String) -> String { func resolveBrowserNavigableURL(_ input: String) -> URL? { let trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return nil } + + if NSString(string: trimmed).isAbsolutePath { + return URL(fileURLWithPath: trimmed) + } + guard !trimmed.contains(" ") else { return nil } // Check localhost/loopback before generic URL parsing because diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 67e8f6256599..abdd83efb542 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -1207,6 +1207,22 @@ final class BrowserNewTabNavigationSeedTests: XCTestCase { } } +final class BrowserNavigableURLResolverTests: XCTestCase { + func testAbsoluteFilePathResolvesToFileURL() throws { + let url = try XCTUnwrap(resolveBrowserNavigableURL("/Users/example/Desktop/report.html")) + + XCTAssertTrue(url.isFileURL) + XCTAssertEqual(url.path, "/Users/example/Desktop/report.html") + } + + func testAbsoluteFilePathWithSpacesResolvesToFileURL() throws { + let url = try XCTUnwrap(resolveBrowserNavigableURL("/Users/example/Desktop/disk cleanup report.html")) + + XCTAssertTrue(url.isFileURL) + XCTAssertEqual(url.path, "/Users/example/Desktop/disk cleanup report.html") + } +} + @MainActor final class BrowserPanelRemoteStoreTests: XCTestCase { func testRemoteWorkspacePanelsShareWorkspaceScopedWebsiteDataStore() { From a40ee7d4d48f0d67efb9597ff03718d5555f5f16 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 16 May 2026 16:56:19 +0900 Subject: [PATCH 2/2] refactor(browser): simplify absolute path check --- Sources/Panels/BrowserPanel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index c695a9137428..9e050efd5b76 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -4556,7 +4556,7 @@ func resolveBrowserNavigableURL(_ input: String) -> URL? { let trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return nil } - if NSString(string: trimmed).isAbsolutePath { + if trimmed.hasPrefix("/") { return URL(fileURLWithPath: trimmed) }