diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 8dc311ff3152..9e050efd5b76 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 trimmed.hasPrefix("/") { + 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() {