我的第一個 Firefox bug - PDF 尋找列「找不到」音效
從來沒貢獻過 Firefox 本體,很久以前嘗試,光是 build 環境要裝 Visual C++ 等開發工具,太麻煩就放棄了。
現在我的環境有 WSL,又見 mozilla 文件已經寫得很詳細,就再來洗頭看看。
文件:Firefox Contributors’ Quick Reference
記錄在 Bug 1905331,功能很小,就是「尋找列」(Findbar) 找不到東西時會有一個 beep 音效,但 PDF 檢視時少了這個聲音,就把它加上去而已:
1905331 - Findbar in PDF viewer doesn't play "not found" sound
這個 bug 也是弄了 3 個月才結案,merge 後再跑 2 個月,11/26 才跟著 Firefox 133 正式上線。
安裝到能 build 起來已經不容易
官方說明(Firefox Source Docs)其實很不錯,更快的方式應該是找 mentor 或在 chat 問路,但我還是先自己試試。
文件:Getting Set Up To Work On The Firefox Codebase
Windows 下會教你用 MozillaBuild 安裝,會建立專用的 shell 設好獨立環境,缺點是會跟本來慣用的 shell 切開,有些東西像 git 也是另外裝一套,但確保跑得起來是第一優先啦,不做抵抗。
具體就是以下指令跑成功,該裝的就裝完了:
python3 bootstrap.py --vcs=git
但初期我還遇到 build script / 原始碼有些檔案沒處理好 python open
編碼的問題,也是追了一下。
然後 git pull 之後就能建自己的 Firefox 了:
./mach build
./mach run
在 WSL 跑 hg-git 慢到不行
WSL 遇過在 Windows 目錄跑執行檔會突然變超慢的問題(參考,把執行檔搬到 WSL 目錄竟然就沒事了),用前面裝的環境就剛好迎面撞上。
另 Firefox 原始碼還是用 Mercurial 做版本控制,如果要用 git 就要裝 hg-git 來中介,加上原始碼規模不小,結果一些 git 指令都要等非常久,久到中間一定要做別的事才行。
好用的 SearchFox
Mozilla 的程式碼搜尋,還支援 blame,重點是真的快。
https://searchfox.org/
哪那麼多 Findbar 呀
2008 年寫過 Firefox 3.0 的擴充套件,當時也改過 Findbar,記得 XUL 原始碼只有 gBrowser 裡面有 findbar,很輕鬆就能變造它的外觀和行為。
現在就不一樣了,tabbrowser
(全域的 gBrowser)裡面有從某處初始化 findbar 的邏輯,widgets/browser-custom-element
裡面有視情況建立 FinderParent
(remoteBrowser 時) 或一般 Finder
(non-remote) 的分歧,
然後 PDF 的 viewer 模組裡又有自己的 findbar,這東西還有部分是從 pdfjs repo 不定期複製過來的,……各種各種。
這邊 trace code 和認識多年來的架構變更、引進概念(例如 fission 是什麼、modalHighlight
是什麼)也是個門檻。
還好 findbar 是相對冷門的功能,本身變動沒有很多。
Phabricator 協作平台
類似工具我之前主要是用 GitLab,還是第一次知道 Phabricator(音同 fabricator),配合 moz-phab 這個指令用起來很方便。
除了 Phabricator 本身有很多協作功能外,在 commit message 和遠端 branch 管理方面也可以省很多心力,
因為新的 branch 在用 moz-phab push 時就會自動生成對應的 Differential 頁面(跟本來的 branch name 已經無關),並把訊息塞到 commit message,
之後如果 review 來回要做 force push 也沒關係,只要在 commit message 保留 Differential Revision: .../D215196
這段文字,所有記錄就會回到同一頁,reviewer 也能看到你硬改了哪些東西。
Random fail 的測試
推上 Phabricator 的東西並不會跑所有測試,我這次接觸到的 CI 主要在程式要 land(類似所謂 merge 進主線)的時候,會由有權限的人 Pushing to Try,我才上去看測試死在哪,例如這具屍體。
之前工作時很頭痛的 random fail 問題,或稱 intermittent test / flaky test,就是平常跑都會過,偏偏就偶爾會死掉卡住 CI,這種要找出死因可能很花時間,於是常常不了了之。
這邊見識到 Firefox 的作法是有一個小組會去抓出案例,研究後登記起來,也提供查詢: Sheriffed intermittent failures。
然後跑測試時有一個 verify
flag,對特定測試重複跑很多次,判斷是 intermittent 還是真的錯誤。
用 chat 求助
其實這個 bug 真正實作和討論的時間並不長,中間拖比較久是 reviewer 擺著,最後在 chat 求助才有人幫 land。
Extension API 的 Find
API
原來跟瀏覽器的 findbar 根本沒關係呀!
之前一直想動 Findbar,很想從這裡下手,仔細研究才看懂走不通。
有 0 個意見
☂