Problem
safari-browser js "<JS>" --large 在結果非空時,stdout 卻完全為空(0 bytes)。不加 --large 則一切正常。
實際情境:抽取 Plaud 會議摘要(2000+ 中文字)時踩到 —— js "...innerText..." --large > file.md 落地 0 字,拿掉 --large 才正常落地 2008 字。
Type
bug
穩定重現
JS="var s=''; for(var i=0;i<400;i++){ s+='測試資料行'+i+'內容ABC\n'; } s;"
safari-browser js "$JS" --url <tab> # → stdout 5489 字元(正常)
safari-browser js "$JS" --url <tab> --large # → stdout 0 字元(空!)
同一段 JS、同一個 tab,唯一差別是 --large flag。實測 5489 vs 0,穩定重現。
Root cause(已定位到行)
Sources/SafariBrowser/SafariBridge.swift:1254-1257 的 doJavaScriptLarge:
let lenStr = try await doJavaScript("window.__sbResultLen", target: target)
guard let totalLen = Int(lenStr.trimmingCharacters(in: .whitespacesAndNewlines)), totalLen > 0 else {
return ""
}
AppleScript 把 JS number 回成浮點字串(如 "5489.0")。Int("5489.0") 回傳 nil → 觸發 guard ... else { return "" } → 整個 chunked read 回傳空字串。
非 --large 路徑(Sources/SafariBrowser/Commands/JSCommand.swift:73-74)早已修過同一個坑,註解明寫:
// AppleScript returns numbers as "9.0" — parse via Double then truncate
let len = Int(Double(lenStr.trimmingCharacters(in: .whitespacesAndNewlines)) ?? 0)
但 doJavaScriptLarge 沒同步這個修法 —— 典型「修一處漏一處」型 regression。
Expected
--large 應回傳與不加 --large 相同的內容(只是改用 chunked transfer 傳輸)。
Actual
--large 開啟時 stdout 完全為空,且無任何錯誤訊息 —— 靜默 data loss。
修復建議(一行)
SafariBridge.swift:1255 改用既有 pattern:
guard let totalLen = Int(Double(lenStr.trimmingCharacters(in: .whitespacesAndNewlines)) ?? 0), totalLen > 0 else {
return ""
}
Impact
使用者抽取大型網頁文字(長逐字稿、長 summary)用 --large + stdout 重導向時會得到空檔案,且無任何錯誤提示 —— 靜默 data loss,最危險的失敗模式。--output <file> 路徑同樣經過 doJavaScriptLarge(JSCommand.swift:58),推測會一併受影響(寫出 0 byte 檔),建議一併驗證。
環境
- macOS Darwin 25.5.0
- safari-browser binary build 2026-05-04(
/Users/che/bin/safari-browser)
備註:另一個觀察(已排除,不另開)
曾觀察到 open <url> --url <substring> 一次沒導航 matched tab,但用「確定存在的 tab」乾淨重現時 open --url 運作完全正常(open fa637946 --url 5743cb51 → 5743cb51 變 No-match、fa637946 找得到)。無法穩定重現,研判為偶發的 Safari 視窗焦點狀態問題,不開為 bug。
Problem
safari-browser js "<JS>" --large在結果非空時,stdout 卻完全為空(0 bytes)。不加--large則一切正常。實際情境:抽取 Plaud 會議摘要(2000+ 中文字)時踩到 ——
js "...innerText..." --large > file.md落地 0 字,拿掉--large才正常落地 2008 字。Type
bug
穩定重現
同一段 JS、同一個 tab,唯一差別是
--largeflag。實測 5489 vs 0,穩定重現。Root cause(已定位到行)
Sources/SafariBrowser/SafariBridge.swift:1254-1257的doJavaScriptLarge:AppleScript 把 JS number 回成浮點字串(如
"5489.0")。Int("5489.0")回傳nil→ 觸發guard ... else { return "" }→ 整個 chunked read 回傳空字串。非
--large路徑(Sources/SafariBrowser/Commands/JSCommand.swift:73-74)早已修過同一個坑,註解明寫:但
doJavaScriptLarge沒同步這個修法 —— 典型「修一處漏一處」型 regression。Expected
--large應回傳與不加--large相同的內容(只是改用 chunked transfer 傳輸)。Actual
--large開啟時 stdout 完全為空,且無任何錯誤訊息 —— 靜默 data loss。修復建議(一行)
SafariBridge.swift:1255改用既有 pattern:Impact
使用者抽取大型網頁文字(長逐字稿、長 summary)用
--large+ stdout 重導向時會得到空檔案,且無任何錯誤提示 —— 靜默 data loss,最危險的失敗模式。--output <file>路徑同樣經過doJavaScriptLarge(JSCommand.swift:58),推測會一併受影響(寫出 0 byte 檔),建議一併驗證。環境
/Users/che/bin/safari-browser)備註:另一個觀察(已排除,不另開)
曾觀察到
open <url> --url <substring>一次沒導航 matched tab,但用「確定存在的 tab」乾淨重現時open --url運作完全正常(open fa637946 --url 5743cb51→ 5743cb51 變 No-match、fa637946 找得到)。無法穩定重現,研判為偶發的 Safari 視窗焦點狀態問題,不開為 bug。