El botón Eliminar (botón Supr) no funciona en Firefox cuando los sitios no pueden anular los atajos de teclado (es decir, permisos.default.shortcuts = 2)

El botón Eliminar (botón Supr) no funciona en Firefox cuando los sitios no pueden anular los atajos de teclado (es decir, permisos.default.shortcuts = 2)

El valor predeterminado permissions.default.shortcutses 0, que permite que las páginas web anulen la respuesta normal de Firefox a los atajos de teclado. Por ejemplo, Ctrl-R normalmente recargará la página, pero si permissions.default.shortcuts = 0, Outlook Web Access interpretará Ctrl-R como "Responder a este mensaje".

Cuando se deja este valor predeterminado, los botones Backspacey Deletefuncionan como se esperaba, tanto en las barras de URL y de búsqueda, como en los campos de entrada de texto de las páginas web: Backspaceelimina el carácter a la izquierda del cursor de texto y Deleteelimina el carácter a la derecha de el cursor de texto.

La configuración permissions.default.shortcuts = 2impide que los sitios anulen los atajos de teclado, de modo que (por ejemplo) Ctrl-R recargará constantemente la página actual, independientemente de cuál sea esa página. (Esto también se puede hacer por sitio). Pero también tiene un efecto secundario extraño: el Deletebotón continúa funcionando cuando se usa en la URL y las barras de búsqueda, pero no hace nada cuando se usa en un campo de entrada de texto. No hay fallas ni comportamientos aberrantes; el texto simplemente no se modifica.

En Firefox 66.0.3 y posteriores, Backspacesigue funcionando normalmente. En Firefox 66.0.1 y anteriores, por el contrario, Backspaceel problema es peor Delete(detalles al final).

Nota: La respuesta aceptada ahora contiene una solución (parcial), y el resto de esta pregunta es principalmente información que proporcioné en un intento de ayudar a otra persona a descubrir qué estaba mal y cómo solucionarlo.Entonces, si está leyendo esta pregunta porque usted mismo está experimentando este problema y necesita una solución, probablemente pueda pasar a la respuesta aceptada desde aquí.y solo lea el resto de la pregunta si eso no resuelve su problema o si tiene curiosidad.

Posiblemente relacionado: lista de atajos de teclado de Mozilla (https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly) incluye, en el apartado "Edición", la entrada:

Command     Shortcut
Delete      Del

No tengo idea de cómo eso puede considerarse un "atajo", a diferencia de la entrada de texto normal (en particular, Backspaceesnoaparece como un "atajo" en la sección de edición), ni por qué no permitir que los sitios lo "anulen" debería resultar en que no suceda nada en absoluto, en lugar dealgosiendo eliminado. Pero la lista de Del/ Deletecomo método abreviado de teclado parece un posible vínculo entre la causa (no permitir que los sitios anulen los métodos abreviados de teclado) y el efecto ( Deleteno funciona en campos de entrada de texto, en sitios web).

También he verificado que no es necesario que un sitio intente anular nada (en absoluto) para observar este error; el siguiente HTML es suficiente (tanto para que Deletefuncione como se esperaba if permissions.default.shortcuts = 0como para que no haga nada if permissions.default.shortcuts = 2):

<!DOCTYPE html>
<html>
<body>

Text box: <input type="text">

</body>
</html>

Este comportamiento también es consistente en numerosos sitios web reales (he confirmado Stack Exchange, Google y la página de correo electrónico de Outlook Web App de mi universidad), y no he observado ningún sitio web en el que no ocurra. Ocurre independientemente de si uso el botón Eliminar en el teclado integrado de mi computadora portátil o en mi teclado USB.

Finalmente, observé los siguientes resultados en Javascript Key Event Tester (https://unixpapa.com/js/testkey.html) (nada suprimido, se muestran todos los valores de los atributos, cuadro de entrada de texto enfocado antes de escribir): Backspaceproporciona:

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

independientemente del valor de permissions.default.shortcuts(o browser.backspace_action, para aquellos que leen la letra pequeña a continuación). Al dividir la línea conjunta (presumiblemente debido a que se aplica el retroceso a un retorno de carro) y omitir los atributos que resultan ser los mismos para todas estas pruebas, se obtiene:

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

Por el contrario, presionar Deleteda

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

si permissions.default.shortcuts = 0(es decir, cuando Deletefunciona como se esperaba), pero sólo

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

if permissions.default.shortcuts = 2(es decir, cuando Deleteno hace nada en los campos de entrada de texto). Es decir, la tecla de activación está presente, pero falta la tecla de pulsación. (Lo cual es extraño).

Entonces, mi pregunta central es:¿Cómo evito que los sitios web anulen los atajos de teclado reales de Firefox, que realmente hacen algo, sin romperse Delete?

Algunos detalles técnicos sobre mi sistema (puedo proporcionar más si es útil, aunque el hecho de que obtuve resultados similares (o peores) en otras dos computadoras (de la biblioteca) sugiere que probablemente esto no sea específico del sistema o del hardware): Estoy usando Firefox 71.0 (64 bits), en Ubuntu (18.04.1), en una computadora portátil Dell Precision 5540 (i7-9750H). Mi teclado externo es un Microsoft Natural Ergonómico Keyboard 4000, para el cual no he instalado ningún software especial ni he reasignado ninguna tecla.

cat /etc/default/keyboardda

# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

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

BACKSPACE="guess"

¿Cómo Backspacese rompe también (y más) en 66.0.1 y versiones anteriores?: ¿Qué pasa si presionas?Backspace sinenfocar un campo de entrada de texto está controlado por browser.backspace_action. 0(el valor predeterminado en Windows) indica "navegar a la página anterior", 1indica "desplazarse hacia arriba" e 2indica "no hacer nada".

Sin embargo, en versiones de Firefox anteriores a 66.0.2 o 66.0.3 (no estoy seguro de cuál), la configuración permissions.default.shortcuts = 2hace que Backspacese comporte igual independientemente de si un campo de entrada de texto está enfocado.

Entonces, si browser.backspace_actionestá configurado en 2, presionar Backspaceestá tan roto como Deleteestá, pero nada más. Si browser.backspace_actionse establece en 1, es sólo marginalmente peor; la página saltará inesperadamente, pero no sucederá nada más. Pero si está configurado en 0(que es, nuevamente, el valor predeterminado de Windows), al presionar Backspace, incluso con un cuadro de entrada de texto enfocado, saldrá de la página para regresar a la anterior.

(Inicialmente creí que el Backspaceproblema era específico de Windows, porque lo observé en computadoras (biblioteca universitaria) que ejecutaban Windows y Firefox 66.0.1, pero no en computadoras (biblioteca universitaria) que ejecutaban MacOS y Firefox 66.0.3 (ni en la mía). computadora, ejecutando Linux y Firefox 77.0.1). Pero resulta que esa diferencia de dos versiones menores se da cuando alguien en Mozilla parcheó el código para corregir ese error tal como se aplicaba a Backspace, pero se olvidó de hacer algunas cosas. se aplicó (más suavemente) a Delete.)

Respuesta1

La solución inmediata es compilar Firefox desde el código fuente, después de aplicar el parche (para la versión estable actual, 71.0.1, aunque debería ser el mismo para muchas versiones anteriores (al menos hasta la 66.0.x, y probablemente posteriores), aparte de diferencias en numeración de líneas y 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 cualquiera que no hable diff, eso significa: después de modificar el archivo browser/base/content/browser-sets.incpara reemplazar la línea

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

con

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

Como se indica enhttps://bugzilla.mozilla.org/show_bug.cgi?id=1445942, también existía un problema análogo Backspacey se solucionó en alguna subversión de Firefox 66. Por lo tanto, el problema "solo para Windows" que observé en realidad no era específico del sistema operativo, sino un resultado de la versión de Firefox. que tiene la biblioteca de mi universidad en sus máquinas con Windows (66.0.1), estando ligeramente por detrás de la versión en sus Mac (66.0.3), y muy por detrás de la versión en mi propia computadora, Linux (71.0.1).

He enviado un nuevo error a Bugzilla,https://bugzilla.mozilla.org/show_bug.cgi?id=1604970, con el parche de arriba. Entonces, con suerte, la respuesta a esta pregunta pronto será simplemente "Actualizar Firefox".

Sin embargo, incluso cuando eso suceda, planeo dejar esta pregunta (y respuesta) para que cualquiera que se quede con una versión anterior de Firefox y la encuentre pueda beneficiarse. Porque se trata de una solución relativamente sencilla (aunque más bien consume mucho tiempo de CPU), pero poco intuitiva para un problema desagradable.

información relacionada