当网站被阻止覆盖键盘快捷键(即,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 按键事件测试器中观察到了以下结果 (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(即,当Delete文本输入字段中不执行任何操作时)。也就是说,keyup 存在,但 keydown 缺失。(这很奇怪。)

因此,我的核心问题是:如何防止网站覆盖实际的 Firefox 键盘快捷键,而不会破坏它Delete

关于我的系统的一些技术细节(如果有用的话我可以提供更多信息,尽管我在另外两台(图书馆)电脑上获得了类似(或更差)的结果,这表明这可能不是系统或硬件特定的):我在 Ubuntu(18.04.1)上使用 Firefox 71.0(64 位),在 Dell Precision 5540 笔记本电脑(i7-9750H)上。我的外接键盘是 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”问题实际上不是操作系统特有的,而是由于我的大学图书馆在其 Windows 机器上的 Firefox 版本(66.0.1)略微落后于其 Mac 上的版本(66.0.3),并且远远落后于我自己的 Linux 计算机(71.0.1)上的版本。

我已经向 Bugzilla 提交了一个新的错误,https://bugzilla.mozilla.org/show_bug.cgi?id=1604970,使用上面的补丁。因此,希望这个问题的答案很快就会是“升级 Firefox”。

即使发生这种情况,我还是打算保留这个问题(和答案),以便任何使用旧版 Firefox 的人都能从中受益。因为这是一个相对简单(但耗费 CPU 时间)但不太直观的解决棘手问题的方法。

相关内容