從來沒貢獻過 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,很想從這裡下手,仔細研究才看懂走不通。