fix(mac): render Canvas HTML correctly

main
Peter Steinberger 2025-12-12 20:01:12 +00:00
parent 27a7d9f9d1
commit 4ecd35c275
2 changed files with 19 additions and 8 deletions

View File

@ -20,10 +20,12 @@ enum CanvasScheme {
static func mimeType(forExtension ext: String) -> String { static func mimeType(forExtension ext: String) -> String {
switch ext.lowercased() { switch ext.lowercased() {
case "html", "htm": "text/html; charset=utf-8" // Note: WKURLSchemeHandler uses URLResponse(mimeType:), which expects a bare MIME type
case "js", "mjs": "application/javascript; charset=utf-8" // (no `; charset=...`). Encoding is provided via URLResponse(textEncodingName:).
case "css": "text/css; charset=utf-8" case "html", "htm": "text/html"
case "json", "map": "application/json; charset=utf-8" case "js", "mjs": "application/javascript"
case "css": "text/css"
case "json", "map": "application/json"
case "svg": "image/svg+xml" case "svg": "image/svg+xml"
case "png": "image/png" case "png": "image/png"
case "jpg", "jpeg": "image/jpeg" case "jpg", "jpeg": "image/jpeg"
@ -37,4 +39,3 @@ enum CanvasScheme {
} }
} }
} }

View File

@ -22,12 +22,13 @@ final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler {
let response = self.response(for: url) let response = self.response(for: url)
let mime = response.mime let mime = response.mime
let data = response.data let data = response.data
let encoding = self.textEncodingName(forMimeType: mime)
let urlResponse = URLResponse( let urlResponse = URLResponse(
url: url, url: url,
mimeType: mime, mimeType: mime,
expectedContentLength: data.count, expectedContentLength: data.count,
textEncodingName: "utf-8") textEncodingName: encoding)
urlSchemeTask.didReceive(urlResponse) urlSchemeTask.didReceive(urlResponse)
urlSchemeTask.didReceive(data) urlSchemeTask.didReceive(data)
urlSchemeTask.didFinish() urlSchemeTask.didFinish()
@ -175,7 +176,7 @@ final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler {
</body> </body>
</html> </html>
""" """
return CanvasResponse(mime: "text/html; charset=utf-8", data: Data(html.utf8)) return CanvasResponse(mime: "text/html", data: Data(html.utf8))
} }
private func welcomePage(sessionRoot: URL) -> CanvasResponse { private func welcomePage(sessionRoot: URL) -> CanvasResponse {
@ -190,5 +191,14 @@ final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler {
""" """
return self.html(body, title: "Canvas") return self.html(body, title: "Canvas")
} }
}
private func textEncodingName(forMimeType mimeType: String) -> String? {
if mimeType.hasPrefix("text/") { return "utf-8" }
switch mimeType {
case "application/javascript", "application/json", "image/svg+xml":
return "utf-8"
default:
return nil
}
}
}