Кнопка «Удалить» (кнопка del) не работает в Firefox, когда сайтам запрещено переопределять сочетания клавиш (например, permissions.default.shortcuts = 2)

Кнопка «Удалить» (кнопка del) не работает в Firefox, когда сайтам запрещено переопределять сочетания клавиш (например, permissions.default.shortcuts = 2)

Значение по умолчанию для permissions.default.shortcuts0, что позволяет веб-страницам переопределять обычный ответ Firefox на сочетания клавиш. Например, Ctrl-R обычно перезагружает страницу, но если permissions.default.shortcuts = 0, то Outlook Web Access вместо этого интерпретирует Ctrl-R как «Ответить на это сообщение».

Если оставить это значение по умолчанию без изменений, кнопки Backspaceи Deleteбудут работать так, как и ожидалось, как в строках 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

если permissions.default.shortcuts = 0(т.е. когда Deleteработает так, как ожидается), но только

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

если permissions.default.shortcuts = 2(т.е. когда Deleteничего не делает в полях ввода текста). То есть keyup присутствует, но keydown отсутствует. (Что странно.)

Итак, мой главный вопрос:Как запретить веб-сайтам переопределять настоящие сочетания клавиш Firefox, которые действительно что-то делают, не нарушая работу Delete?

Несколько технических подробностей о моей системе (могу предоставить больше, если это будет полезно, хотя тот факт, что я получил похожие (или худшие) результаты на двух других (библиотечных) компьютерах, говорит о том, что это, вероятно, не зависит от системы или оборудования): я использую Firefox 71.0 (64-разрядную версию), на Ubuntu (18.04.1), на ноутбуке 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"

Как Backspaceтакже (и дополнительно) сломано в 66.0.1 и более ранних версиях: Что произойдет, если вы нажметеBackspace безфокусировка на поле ввода текста управляется с помощью browser.backspace_action. 0(по умолчанию в Windows) означает «перейти на предыдущую страницу», 1означает «прокрутить вверх» и 2означает «ничего не делать».

Однако в версиях Firefox до 66.0.2 или 66.0.3 (я не уверен, какой именно) настройка 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», которую я наблюдал, на самом деле не была связана с операционной системой, а была результатом того, что версия Firefox, установленная в моей университетской библиотеке на компьютерах с Windows (66.0.1), немного отставала от версии на компьютерах Mac (66.0.3) и значительно отставала от версии на моем компьютере с Linux (71.0.1).

Я отправил новый баг в Bugzilla,https://bugzilla.mozilla.org/show_bug.cgi?id=1604970, с патчем выше. Так что, надеюсь, ответ на этот вопрос скоро будет просто "Обновите Firefox".

Но даже когда это произойдет, я планирую оставить этот вопрос (и ответ), чтобы любой, кто застрял со старой версией Firefox и случайно наткнулся на нее, мог извлечь пользу. Потому что это относительно простое (хотя и довольно затратное по времени ЦП), но едва ли интуитивное решение неприятной проблемы.

Связанный контент