O botão Excluir (botão del) é quebrado no Firefox quando os sites são impedidos de substituir atalhos de teclado (ou seja, permissions.default.shortcuts = 2)

O botão Excluir (botão del) é quebrado no Firefox quando os sites são impedidos de substituir atalhos de teclado (ou seja, permissions.default.shortcuts = 2)

O valor padrão para permissions.default.shortcutsé 0, que permite que as páginas da web substituam a resposta normal do Firefox aos atalhos de teclado. Por exemplo, Ctrl-R normalmente recarregará a página, mas se permissions.default.shortcuts = 0, o Outlook Web Access interpretará Ctrl-R como "Responder a esta mensagem".

Quando esse padrão é deixado de lado, os botões Backspacee Deletefuncionam conforme o esperado, tanto nas barras de URL e de pesquisa quanto nos campos de entrada de texto nas páginas da web: Backspaceexclui o caractere à esquerda do cursor de texto e Deleteexclui o caractere à direita do o cursor de texto.

A configuração permissions.default.shortcuts = 2impede que os sites substituam os atalhos do teclado, para que (por exemplo) Ctrl-R recarregue consistentemente a página atual, independentemente de qual seja essa página. (Isso também pode ser feito por site.) Mas também tem um efeito colateral estranho: o Deletebotão continua funcionando quando usado na URL e nas barras de pesquisa, mas não faz nada quando usado em um campo de entrada de texto. Não há falhas ou comportamento aberrante; o texto é simplesmente deixado inalterado.

No Firefox 66.0.3 e posterior, Backspacecontinua funcionando normalmente. No Firefox 66.0.1 e anteriores, por outro lado, Backspaceestá pior do que Deleteestá (detalhes no final).

Observação: a resposta aceita agora contém uma solução (parcial), e o restante desta pergunta consiste principalmente em informações que forneci na tentativa de ajudar alguém a descobrir o que estava errado e como corrigi-lo.Portanto, se você está lendo esta pergunta porque está enfrentando esse problema e precisa de uma solução, provavelmente poderá pular para a resposta aceita aquie leia o restante da pergunta apenas se isso não resolver o seu problema ou se você estiver curioso.

Possivelmente relacionado: lista de atalhos de teclado da Mozilla (https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly) inclui, na seção "Edição", a entrada:

Command     Shortcut
Delete      Del

Não tenho ideia de como isso pode ser considerado um "atalho", em oposição à entrada de texto normal (notadamente, Backspaceénãolistado como um "atalho" na seção de edição), nem por que não permitir que os sites o "substituam" deveria resultar em nada acontecer, em vez dealgosendo excluído. Mas a listagem de Del/ Deletecomo atalho de teclado parece um possível link entre causa (não permitir que sites substituam atalhos de teclado) e efeito ( Deletenão funciona em campos de entrada de texto, em sites).

Também verifiquei que não é necessário que um site realmente tente substituir alguma coisa (absolutamente) para observar esse bug; o seguinte HTML é suficiente (tanto para Deletefuncionar como esperado if permissions.default.shortcuts = 0, quanto para não fazer nada if permissions.default.shortcuts = 2):

<!DOCTYPE html>
<html>
<body>

Text box: <input type="text">

</body>
</html>

Esse comportamento também é consistente em vários sites reais (confirmei o Stack Exchange, o Google e a página de e-mail do Outlook Web App da minha universidade) e não observei nenhum site em que isso não ocorresse. Isso ocorre independentemente de eu usar o botão Excluir no teclado integrado do meu laptop ou no teclado USB.

Por fim, observei os seguintes resultados no Javascript Key Event Tester (https://unixpapa.com/js/testkey.html) (nada suprimido, todos os valores de atributos mostrados, caixa de entrada de texto focada antes da digitação): Backspacefornece:

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

independentemente do valor de permissions.default.shortcuts(ou browser.backspace_action, para quem lê as letras miúdas abaixo). Dividir a linha conjunta (presumivelmente devido ao retrocesso ser aplicado a um retorno de carro) e omitir os atributos que acabam sendo os mesmos para todos esses testes, dá:

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

Em contraste, pressionar Delete

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

if permissions.default.shortcuts = 0(isto é, quando Deletefunciona como esperado), mas apenas

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

if permissions.default.shortcuts = 2(ou seja, quando Deletenão faz nada nos campos de entrada de texto). Ou seja, o keyup está presente, mas o keydown está faltando. (O que é bizarro.)

Então, minha questão central é:Como evito que sites substituam os atalhos de teclado reais do Firefox, que realmente fazem alguma coisa, sem quebrar Delete?

Alguns detalhes técnicos sobre meu sistema (posso fornecer mais se isso for útil, embora o fato de ter obtido resultados semelhantes (ou piores) em dois outros computadores (biblioteca) sugira que isso provavelmente não é específico do sistema ou do hardware): Estou usando o Firefox 71.0 (64 bits), no Ubuntu (18.04.1), em um laptop Dell Precision 5540 (i7-9750H). Meu teclado externo é um Microsoft Natural Ergonomic Keyboard 4000, para o qual não instalei nenhum software especial, nem remapeei nenhuma tecla.

cat /etc/default/keyboard

# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

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

BACKSPACE="guess"

Como Backspacetambém está (e extra-) quebrado em 66.0.1 e anteriores: O que acontece se você pressionarBackspace semfocar um campo de entrada de texto é controlado por browser.backspace_action. 0(o padrão no Windows) indica “navegar para a página anterior”, 1indica “rolar para cima” e 2indica “não fazer nada”.

No entanto, nas versões do Firefox anteriores a 66.0.2 ou 66.0.3 (não tenho certeza de qual), a configuração permissions.default.shortcuts = 2faz com que Backspacese comporte da mesma forma, independentemente de um campo de entrada de texto estar em foco.

Portanto, se browser.backspace_actionestiver definido como 2, pressionar Backspaceestará tão quebrado quanto Deleteestá, mas nada mais. Se browser.backspace_actionestiver definido como 1, será apenas um pouco pior; a página irá saltar inesperadamente, mas nada mais acontecerá. Mas se estiver definido como 0(que é, novamente, o padrão do Windows!), pressionar Backspace, mesmo com uma caixa de entrada de texto em foco, sairá da página para retornar à anterior!

(Inicialmente, acreditei Backspaceque o problema fosse específico do Windows, porque o observei em computadores (biblioteca universitária) executando Windows e Firefox 66.0.1, mas não em computadores (biblioteca universitária) executando MacOS e Firefox 66.0.3 (nem no meu próprio computador, rodando Linux e Firefox 77.0.1). Mas acontece que essa diferença de duas versões secundárias abrange quando alguém na Mozilla corrigiu o código para corrigir esse bug conforme ele se aplicava Backspace, mas se esqueceu de fazer algumas correções para ele. aplicava-se (mais suavemente) a Delete.)

Responder1

A solução imediata é compilar o Firefox a partir do código-fonte, após aplicar o patch (para a versão estável atual, 71.0.1, embora deva ser o mesmo para muitas versões anteriores (pelo menos até 66.0.x, e provavelmente mais), além de diferenças na numeração de linhas e hashes):

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"/>

Para quem não fala diff, isso significa: depois de modificar o arquivo browser/base/content/browser-sets.incpara substituir a linha

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

com

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

Como indicado emhttps://bugzilla.mozilla.org/show_bug.cgi?id=1445942, um problema análogo também existia Backspacee foi corrigido em alguma subversão do Firefox 66. Portanto, o problema "somente Windows" que observei não era na verdade específico do sistema operacional, mas um resultado da versão do Firefox que minha biblioteca universitária tem em suas máquinas Windows (66.0.1) está um pouco atrás da versão em seus Macs (66.0.3), e bem atrás da versão do meu computador Linux (71.0.1).

Enviei um novo bug para o Bugzilla,https://bugzilla.mozilla.org/show_bug.cgi?id=1604970, com o patch acima. Então, esperançosamente, a resposta a esta pergunta será em breve simplesmente “Atualizar o Firefox”.

Mesmo quando isso acontecer, pretendo deixar esta pergunta (e resposta) ativa, para que qualquer pessoa que tenha uma versão mais antiga do Firefox e tropeçar nela possa se beneficiar. Porque esta é uma solução relativamente simples (embora bastante demorada da CPU), mas dificilmente intuitiva, para um problema desagradável.

informação relacionada