diff --git a/Sources/FreeDock/Models/DockApplicationFileDropPlanner.swift b/Sources/FreeDock/Models/DockApplicationFileDropPlanner.swift index 5f5d5c4..07a7c6c 100644 --- a/Sources/FreeDock/Models/DockApplicationFileDropPlanner.swift +++ b/Sources/FreeDock/Models/DockApplicationFileDropPlanner.swift @@ -134,6 +134,14 @@ enum DockApplicationFileDropPlanner { return .failure(.nonLocalFileURL) } + // Foundation versions disagree about `URL.path` for opaque relative + // file URLs such as `file:Document.txt`. Classify the stable lexical + // form first so the result is deterministic across supported macOS + // releases. + if hasOpaqueRelativeFilePath(url) { + return .failure(.relativePath) + } + let path = url.path guard !path.isEmpty else { return .failure(.missingPath) @@ -146,4 +154,17 @@ enum DockApplicationFileDropPlanner { URL(fileURLWithPath: path).standardizedFileURL ) } + + private static func hasOpaqueRelativeFilePath(_ url: URL) -> Bool { + let absoluteString = url.absoluteString + guard let schemeSeparator = absoluteString.firstIndex(of: ":") else { + return false + } + + let resource = absoluteString[absoluteString.index(after: schemeSeparator)...] + let pathResource = resource.prefix { character in + character != "?" && character != "#" + } + return !pathResource.isEmpty && !pathResource.hasPrefix("//") + } }