沒穿方服

索引

顯示╱隱藏內文
顯示具有 Firefox 標籤的文章。 顯示所有文章
顯示具有 Firefox 標籤的文章。 顯示所有文章

這個新功能是什麼

就是古老 IE 每點一個連結,轉到新頁面時會「嗒」一聲的音效。

Noise 轉為 web extension 後就一直沒做這功能,因為時機太難判斷,之前用 webRequest + webNavigation + History API 怎麼配都弄不好,尤其在一些 SPA 或嵌入很多廣告的網頁,會發瘋叫個不停。

直到 Firefox 147 支援 Navigation API,雖然使用情境仍複雜,但有比較清楚的介面定義,至少能安心實作。

「Navigate」的中文翻譯

另一個難題是 navigate 中文要翻成什麼。

一般翻成「瀏覽」、「導覽」,或「導航」,但缺乏上下文時都太曖昧。

參考 Windows 翻譯(檔案總管用的,IE 概念上就是 explorer 的延伸,所以音效也一樣)是用「開始瀏覽」和「導覽開始」,其實也看不懂。

Win 10 系統音效中的「開始瀏覽」

Firefox DevTools 的翻譯是「導航」:

Firefox 147 DevTools「主控台」面板訊息

我最後使用「瀏覽導航」,作為事件選項之一感覺還可以。

Navigate 具體發生時機

應用樣態多元,所以使用者其實不太能預期發生時機。

不如現在就安裝 Noise,搭配不同 navigationType 設定不同音效,在日常生活中慢慢認識它。

Noise 4.3 選項畫面「瀏覽導航」例子

示例(影片有聲音)

Noise 4.2.0 新功能「Multiple Sounds」

可以在事件上綁定「多個」聲音,可選擇是否隨機播放。

安裝 Noise:

註:套件裡面「沒有提供」影片中的聲音檔,要自己去生喔。

看似簡單的 CopyTabTitleUrl (web extension), 其實有選項「Use Extended Edit Mode 🧪」可以打開實驗性功能,但數量也太膨大了吧🧪🧪🧪,看它 wiki 上的 format 說明,到底是怎麼發展成這個小天地的?

選單成果

我沒有全部看懂,但湊出一個 format 能夠將 URL 中的 fbclidutm_source 等追蹤碼去掉:
${linkSrcUrl.replaceAll('[?&](fbclid|utm_\w+)=[^&#]+','')}


設定介面也很難懂,瘋狂科學家風格

選項畫面

貼圖記錄,十年後可以回來看古代 UI。

分頁群組太過搶眼

Firefox 138 開始支援分頁群組(Tab Groups),預設顯示是在群組下面劃一條線,結果有點太醒目,造成無法一眼辨認「目前分頁」在哪。

自救

我已經好久沒用 userChrome.css,先貼圖,詳細記在後面。

userChrome.css 內容

用法是到 about:config 開啟 toolkit.legacyUserProfileCustomizations.stylesheets,然後到 Profile 資料夾自己新增 chrome/userChrome.css 檔案。

主要策略是用 CSS color-mix() 把預設背景色調暗。 另外有把關閉按鈕拿掉,內容如下:

2026-06-20: Firefox 152 更新了定義,新版為:

.tab-background {
  &:is([selected], [multiselected]) {
    background-color: color-mix(in srgb, var(--tab-background-color-selected) 70%, black) !important;
  }
}

.tabbrowser-tab[selected] .tab-close-button {
  color: white !important;
}
.tabbrowser-tab[selected]:not(:hover) .tab-close-button {
  display: none !important;
}

以下為舊版,已經沒用了。

.tabbrowser-tab[selected] .tab-background {
  background-color: color-mix(in srgb, var(--tab-selected-bgcolor) 70%, black) !important;
}

.tabbrowser-tab[selected] .close-icon {
  color: white !important;
}
.tabbrowser-tab[selected]:not(:hover) .close-icon {
  display: none !important;
}

開啟方式

  1. 確認 Firefox 版本在 135.0 以上(2025/2/4 釋出)
  2. 進入 about:config,找出 accessibility.typeaheadfind.wrappedSoundURL, 改成「beep」或一個指向 wav 檔案的 file:// URI(例如 file:///C:/%E9%9F%B3%E6%95%88/dorya.wav)即可

說明

Ctrl + F 文字尋找功能「已達頁尾,從頁首重新搜尋」這個狀態叫做 wrapped,目前各瀏覽器處理 wrap 的行為大致一樣,就是直接跳到另一端,缺點是不容易注意到。 相關討論 20 年前就存在,例如:

增加音效或許不是完善解方,但在很多情況下也夠用了。

可以用的值

新增的 accessibility.typeaheadfind.wrappedSoundURL 設定和 Accessibility.typeaheadfind.soundURL 類似,具體可用的值為:

  • 空字串(預設值)
    不會出聲,跟舊版行為相同
  • 字串 beep
    發出系統嗶聲,跟舊版「找不到指定文字」的音效相同
  • 字串 default
    發出古代 Firefox 的預設音效,很像屁聲,這不是我亂加的,是原始行為
  • 指向 WAV 聲音檔的路徑
    因為底層是用 nsISound 實作所以只支援 wav。 格式必須是 file URI,也就是以 file:// 開頭,不確定的話可以把音檔拖進瀏覽器,再複製網址列的文字即可

這個功能我等了七年

其實最早在 2008 年寫的擴充元件 Noise 裡就有實作這個功能,但隨著 Firefox 57(2017/11/14)改變架構讓 XPCOM 套件全滅,接下來就一直沒有替代方案,在長文研究時真的很痛苦。

2024 六月處理了一個 findbar bug,其實也是為這個音效做準備,這次一個 commit 就結案,只是等待 review 推進也是拖了一個月。

滑鼠點兩下選取一個字詞(word)的功能,在 Windows 下預設會包含字後面的空白,無視 DOM 元素邊界,還會把全形空白包進去。

平時不太會察覺,發現時往往不舒服,例如:

這個行為在 Chrome 也是一樣,但好像無解,只有 Firefox 可以用 about:config 改掉:

layout.word_select.eat_space_to_next_word 改成 false就可以了,參考


其他跟選取空白有關的選項:

  • layout.word_select.stop_at_punctuation

    不要包含標點符號,預設 true

  • layout.word_select.stop_at_underscore

    不要包含底線,預設 false

  • editor.word_select.delete_space_after_doubleclick_selection

    編輯文字時,點兩下選取後再刪除,會把字前後的空白也刪掉,若不是點兩下選取就沒有效果,預設 false
    參考 Bug 由來

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

偵測「請輸入代號……」就自動送帳密,太過方便了,送出敏感資訊時,還是經過人手操作卡一道比較好。

執行畫面

Script 放在 Greasy Fork → PTT 半自動登入
原始碼也有放在 Github


現有的自動登入方案

這邊說的 PTT 是指 https://term.ptt.cc/,採用修改版 PttChrome(登入後按右鍵「關於」就能看到)在網頁上提供類似純文字介面的操作,是官方維護、使用者眾的服務。當年上線消息:[公告] 使用瀏覽器直接連線至批踢踢

BBS 沒有自動登入功能,早期都是靠連線軟體(例如 PCMan)的自動回應,看見「請輸入代號……」就自動回答。

當直接用瀏覽器上站變成主流,需求就落到擴充套件或 user script 上。 參考一些目前解法:

  1. term.ptt autologin by swstar / 2017

    實作是把 window.WebSocket 換掉以便在 open handler 送出帳密。

  2. term.ptt.cc 自動登入 by maple3142 / 2018

    除了登入,還提供自動跳過一些畫面的功能。 實作是捕捉 PttChrome 的 console 輸出(loginfo),解析訊息判斷發生什麼事,再做反應。

  3. PttChrome+term.ptt.cc Add-on by alan23273850 / 2019

    功能眾多,自動登入只是其一。 實作是比對畫面 innerText 做自動回應。

    這幾支 user script 有一個共通限制,就是要把帳密直接寫在 script 裡才能使用。

  4. PTT Auto Login by c910335 / 2021

    這個不是 user script 而是 Chrome 擴充,利用瀏覽器的密碼管理員儲存/取得密碼,終於不必再寫死帳密了。

    但 Firefox 由於未支援 PasswordCredential,所以是不能用的。


新路數

「如果登入表單是一般 HTML <form>,應該就能沿用密碼管理員了吧?」

之前雖然想過,但一直沒試成功,最近用 <dialog> 避開跟 PttChrome 介面打架,場景乾淨之下就試出來了。

不過只有 Firefox 成功,Chrome 就無法讓密碼管理員跳出來(詢問要不要存密碼),所以 Chrome 的話會退回 PasswordCredential 解法。

實際使用上,只要做一次表單登入並儲存密碼,之後每次登入就只要按 Enter 即可。
如果臨時不想登入,也可以把對話框關掉,就回歸一般使用。


特色總結

  • 不要在 script 內文寫明帳號、密碼
  • 使用瀏覽器的密碼管理員
  • 支援 Firefox(測過版本 126.0.1)
  • 按下「送出」或 Enter 才真正執行登入

很基本的功能,按下鍵盤 PageDown 的時候應該要捲動網頁吧? 為什麼沒捲呢?

因為 focus(焦點)不在你要捲動的東西上啊。 於是寫了一個套件 FocuScroll,可以設定快速鍵,按下去會修正焦點,讓捲動鍵發揮作用就是了。

主要精神是聚焦在可以捲動的主要內容上,我自己很常用,覺得對鍵盤瀏覽來說很重要。



舉例,有此現象的網頁:

  1. Javadoc - Overview (Java SE 10 & JDK 10 ) Javadoc,預期 PageDown 會捲動右邊的大框框,但實際不會

    現在版本是 Java 10,一進去就會自動跳到「搜尋框」所以 PageDown 不會捲動; Java 8 之前的版本則是因為焦點一開始在 <frameset> 最外層,而不是最大那一塊 <frame> 內容,所以也不會動。

  2. 內嵌 codepen 或 youtube 等等使用 <iframe> 的網頁,點了裡面按鈕,焦點就被吃進去,再按 PageDown 就不會捲動外面那層了。
    例如這邊放個跟捲軸有關的 youtube 影片,點播放以後 就不能捲動這篇文章了。

原理和免責

如何找到真正要捲動的內容區塊? 其實我還沒想到很好的方法,現在是從畫面中央的元素開始,透過一些硬做的規則搜尋,細節會改來改去,但原則是要通過一些已知形式,都寫在原始碼的測試中。 可以想見一定有支援不了的網頁,那就再加測試、再修正吧。


Firefox 設定快速鍵的方法

藏在擴充套件管理的小齒輪圖示,裡面的「管理鍵盤快速鍵」功能。

Firefox「管理鍵盤快速鍵」功能

為什麼沒有人注意這個問題

鍵盤瀏覽比較會碰到這個問題,如果是用滑鼠滾輪,或筆電的觸控板滾動就不會遇到。

文件網站如 MDNMicrosoft Learn 有提供中文翻譯,有時候確實有幫助,像我就是看中文比較快。

但不是每個網頁都翻譯品質良好,差的時候,或者不確定差不差的時候就很尷尬,要切回原文確認,反而浪費時間。

有些領域則是已經習慣原文,但 google 搜到翻譯版連結,點進去反而陌生。

功能不親切的網站也是問題,例如 zh-hant.reactjs.org,要改語言就會離開目前主題(會跳去首頁)。

於是寫了一個瀏覽器套件 Delocalizer,它是 localize 的相反。

圖示是長得像丸子串的東西

提供一個工具列按鈕,「轉換目前頁面」會抓 URL 裡的 locale 部份(zh.xxx.comxxx.com/zh/yyy),把它拿掉,再把 accept-language 請求標頭改成 en,讓網站吐英文。

Firefox 版工具列按鈕

也可以設定 xx 網站自動轉換,或者從 google 點連結才自動轉換。 以下是選項畫面:

選項畫面

隨意感想: