當網站被阻止覆蓋鍵盤快速鍵(即,permissions.default.shortcuts = 2)時,Firefox 中的刪除按鈕(del 按鈕)會損壞

當網站被阻止覆蓋鍵盤快速鍵(即,permissions.default.shortcuts = 2)時,Firefox 中的刪除按鈕(del 按鈕)會損壞

permissions.default.shortcuts預設值為0,它允許網頁覆蓋 Firefox 對鍵盤快捷鍵的正常回應。例如,Ctrl-R 通常會重新載入頁面,但如果permissions.default.shortcuts = 0,則 Outlook Web Access 會將 Ctrl-R 解釋為「回覆此郵件」。

當保留此預設值時,BackspaceDelete按鈕將按預期工作,無論是在 URL 和搜尋欄中,還是在網頁上的文本輸入欄位中:Backspace刪除文字遊標左側的字符,並Delete刪除文字遊標右側的字符文本游標.

設定permissions.default.shortcuts = 2會阻止網站覆蓋鍵盤快速鍵,因此(例如)Ctrl-R 將始終重新載入目前頁面,無論該頁面是什麼。 (這也可以在每個網站的基礎上完成。)但它也有一個奇怪的副作用:該Delete按鈕在 URL 和搜尋欄中使用時繼續工作,但在文字輸入欄位中使用時不執行任何操作。沒有崩潰或異常行為;文字保持不變。

在 Firefox 66.0.3 及更高版本中,Backspace繼續正常運作。相較之下,在 Firefox 66.0.1 及更早版本中,Backspace情況比現在更糟Delete(詳情請見最後)。

注意:接受的答案現在包含一個(部分)解決方案,這個問題的其餘部分主要是我提供的信息,試圖幫助其他人找出問題所在以及如何修復它。因此,如果您正在閱讀這個問題是因為您自己遇到了這個問題並且需要解決方案,您可以從這裡跳到已接受的答案,並且僅在無法解決您的問題或您感到好奇時才閱讀問題的其餘部分。

可能相關:Mozilla 的鍵盤快速鍵清單(https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly) 在「編輯」部分中包含以下條目:

Command     Shortcut
Delete      Del

我不知道這怎麼可能被認為是一個“快捷方式”,而不是正常的文字輸入(特別是Backspace不是在編輯部分中列為“快捷方式”),也不為什麼不允許網站“覆蓋”它應該導致什麼也不會發生,而不是某物正在被刪除。但是Del/作為鍵盤快捷鍵的清單Delete似乎是原因(不允許網站覆蓋鍵盤快捷鍵)和結果(Delete在網站上的文字輸入欄位中不起作用)之間可能存在的聯繫。

我還驗證了,沒有必要讓一個網站實際嘗試覆蓋任何內容(根本)來觀察這個錯誤;下面的 HTML 就足夠了(如果 ,則可以Delete按預期工作,如果permissions.default.shortcuts = 0,則不執行任何操作permissions.default.shortcuts = 2):

<!DOCTYPE html>
<html>
<body>

Text box: <input type="text">

</body>
</html>

這種行為在許多實際網站上也是一致的(我已經確認了 Stack Exchange、Google 和我大學的 Outlook Web App 電子郵件頁面),而且我還沒有觀察到任何網站上沒有發生這種情況。無論我使用筆記型電腦內建鍵盤還是 USB 鍵盤上的刪除按鈕,都會發生這種情況。

最後,我在 Javascript Key Event Tester 中觀察到以下結果(https://unixpapa.com/js/testkey.html)(沒有任何抑制,顯示所有屬性值,在鍵入之前聚焦文字輸入框): Backspace給出:

keydown  keyCode=8         which=8         charCode=0        
         shiftKey=false ctrlKey=false altKey=false metaKey=false
         key=Backspace char=undefined location=0 repeat=false
         keyIdentifier=undefined keyLocation=undefinedkeyup    keyCode=8         which=8         charCode=0        
         shiftKey=false ctrlKey=false altKey=false metaKey=false
         key=Backspace char=undefined location=0 repeat=false
         keyIdentifier=undefined keyLocation=undefined

無論 的值如何permissions.default.shortcuts(或者browser.backspace_action,對於那些閱讀下面細則的人)。分割連體行(大概是由於退格鍵應用於回車符),並省略所有這些測試中結果相同的屬性,給出:

keydown  keyCode=8         which=8
         key=Backspace
keyup    keyCode=8         which=8
         key=Backspace

相反,按下Delete給出

keydown  keyCode=46  (.)   which=46  (.)
         key=Delete
keyup    keyCode=46  (.)   which=46  (.)
         key=Delete

if permissions.default.shortcuts = 0(即,當Delete按預期工作時),但僅

keyup    keyCode=46  (.)   which=46  (.)
         key=Delete

if permissions.default.shortcuts = 2(即,whenDelete在文字輸入欄位中不執行任何操作)。也就是說,keyup 存在,但 keydown 缺失。 (這很奇怪。)

所以,我的中心問題是:如何防止網站覆蓋實際的 Firefox 鍵盤快速鍵,這些快捷鍵實際上可以執行某些操作,而不會中斷Delete

關於我的系統的一些技術細節(如果有用的話,我可以提供更多信息,儘管我在另外兩台(圖書館)計算機上獲得了類似(或更差)的結果這一事實表明,這可能不是特定於系統或硬體的):我在 Dell Precision 5540 筆記型電腦 (i7-9750H) 上的 Ubuntu (18.04.1) 上使用 Firefox 71.0(64 位元)。我的外接鍵盤是 Microsoft Natural Ergonomic Keyboard 4000,我沒有為此安裝任何特殊軟體,也沒有重新映射任何按鍵。

cat /etc/default/keyboard給出

# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""

BACKSPACE="guess"

在 66.0.1 及更早版本中也是如何Backspace(和額外)被破壞的: 如果按下會發生什麼Backspace 沒有文字輸入欄位的焦點由 控制browser.backspace_action0(Windows 上的預設設定)表示“導航到上一頁”,1表示“向上捲動”,2表示“不執行任何動作”。

但是,在 66.0.2 或 66.0.3 之前的 Firefox 版本中(我不確定是哪一個),無論文字輸入欄位是否獲得焦點,設定permissions.default.shortcuts = 2都會使行為相同。Backspace

因此,如果browser.backspace_action設定為2,則按下時Backspace會像現在一樣損壞Delete,但僅此而已。如果browser.backspace_action設定為1,情況只會稍微惡化;頁面會意外跳轉,但不會發生其他任何事情。但如果將其設為0(這又是 Windows 預設設定!),Backspace即使文字輸入框處於焦點狀態,按 也會離開頁面返回到上一頁!

(我最初認為該Backspace問題是Windows 特有的,因為我在運行Windows 和Firefox 66.0.1 的(大學圖書館)計算機上觀察到了該問題,但在運行MacOS 和Firefox 66.0.3 的(大學圖書館)計算機上沒有觀察到該問題(也不是在我自己的計算機上)計算機,運行 Linux 和 Firefox 77.0.1)但事實證明,兩個小版本的差異恰好包含在 Mozilla 的某人修補代碼以修復該錯誤時Backspace,但忽略了對其進行一些操作:它(更溫和地)適用於Delete

答案1

直接的解決方案是在應用補丁後從原始程式碼建立 Firefox(對於當前穩定版本 71.0.1,儘管它對於許多版本(至少到 66.0.x,可能更進一步)應該是相同的),除了行編號和哈希值的差異):

diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc
index c90f3aa340..ffd8727350 100644
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -180,7 +180,7 @@
     <key id="key_paste"
          key="&pasteCmd.key;"
          modifiers="accel"/>
-    <key id="key_delete" keycode="VK_DELETE" command="cmd_delete"/>
+    <key id="key_delete" keycode="VK_DELETE" command="cmd_delete" reserved="false"/>
     <key id="key_selectAll" key="&selectAllCmd.key;" modifiers="accel"/>

     <key keycode="VK_BACK" command="cmd_handleBackspace" reserved="false"/>

對於不說話的人來說diff,這意味著:修改文件後browser/base/content/browser-sets.inc替換該行

<key id="key_delete" keycode="VK_DELETE" command="cmd_delete"/>

<key id="key_delete" keycode="VK_DELETE" command="cmd_delete" reserved="false"/>

如中所示https://bugzilla.mozilla.org/show_bug.cgi?id=1445942,過去也存在類似的問題Backspace,並在 Firefox 66 的某些子版本中得到修復。圖書館的Windows 電腦(66.0.1) 上的版本略低於Mac 電腦(66.0.3) 上的版本,並且遠遠落後於我自己的Linux 電腦(71.0.1) 上的版本。

我向 Bugzilla 提交了一個新錯誤,https://bugzilla.mozilla.org/show_bug.cgi?id=1604970,與上面的補丁一起。因此,希望這個問題的答案很快就會是簡單的「升級 Firefox」。

不過,即使發生這種情況,我也打算保留這個問題(和答案),以便任何使用舊版 Firefox 的人在偶然發現它時都能受益。因為這是一個相對簡單(如果相當消耗 CPU 時間)但很難直觀的解決令人討厭的問題的方法。

相關內容