Skip to content

fix: js --large flag stdout 為空(doJavaScriptLarge 用 Int() 解析 AppleScript 浮點長度,漏了 non-large 路徑既有的 Double-parse 修法) #74

Description

@kiki830621

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-1257doJavaScriptLarge

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions