单击地址栏时返回不选择整个 URL

gcb*_*gcb 12 browser firefox address-bar

最近每个浏览器都改变了它的 URL 栏行为。当您单击地址栏时,它会选择整个 URL。

我是一名 Web 开发人员,所以大部分时间我只想编辑 URL 中的参数或添加到其中。这种自动选择行为很痛苦。我将指针准确对准我希望光标所在的位置,单击它,然后选择整个 URI,因此一旦我开始键入,所有内容都会被删除。

有没有办法clickSelectsAll在 Firefox 上恢复“ ”行为?

Seb*_*mon 14

Firefox,2020 年 3 月及之后

2020 年 3 月左右,该browser.urlbar.clickSelectsAll偏好已被删除。从那时起,这个错误一直在讨论中,建议补丁在哪里? - 这将涉及从头开始重新编译 Firefox。

由于clickSelectsAll不工作”重复在 Bugzilla 上累积,其中一个收到了Stephen McCarthy评论,其中描述了一种涉及编辑内部 Firefox 文件的解决方法,特别omni.ja是该zip文件基本上是一个包含大量内部文件的文件,例如 JavaScript浏览器 chrome 的模块,包括相关的modules/UrlbarInput.jsm. 此解决方法看起来是最简单的方法,但该方法无法按原样工作。

MDN 上有一个官方文档,描述了omni.ja应该如何重新打包。我还发现了一篇关于修改的Shallow Thoughts博客文章,omni.ja它更详细地描述了这个过程。然后,还有一件事需要担心:您需要omni.ja通过清除其启动缓存来强制 Firefox 使用修改后的内容,这我发现的In Pursuit Of Laziness博客文章中进行了解释。

修改内部文件

将所有这些资源放在一起,这些是当前在 Arch Linux(core/linux 5.8.1.arch1-1通过5.12.13.arch1-2)上使用 Firefox Nightly 81.0a1 (2020-08-20) 到 91.0a1 (2021-07-02)(64 位)或 Firefox的 shell 命令ESR 78(64 位)(可能)。1 如果您在任何时候遇到“权限被拒绝”错误,只需以 root 用户身份继续执行命令即可。这些需要在每次 Firefox 更新后执行。命令在后面解释。

您可以使用此 shell 脚本代替键入单个命令,该脚本可在我的GitHub 存储库中找到。 该脚本提供了一个用户友好的终端界面;它会自动查找 Firefox,更改omni.ja并处理缓存。它还会根据需要自动切换到 root 并创建备份。

命令

cd /tmp
mkdir omni
unzip -d omni -q /usr/lib/firefox/browser/omni.ja
sed -i 's/this\._preventClickSelectsAll = this\.focused;/this._preventClickSelectsAll = true;/' omni/modules/UrlbarInput.jsm
sed -i 's/this\._preventClickSelectsAll = this\._textbox\.focused;/this._preventClickSelectsAll = true;/' omni/chrome/browser/content/browser/search/searchbar.js
cd omni
zip -0DXqr omni.ja *
cd ..
mv omni/omni.ja /usr/lib/firefox/browser/omni.ja
chown ?user?:?group? /usr/lib/firefox/browser/omni.ja
rm -r omni
Run Code Online (Sandbox Code Playgroud)

重要笔记:

  • 更新 Firefox,然后在执行此操作之前将其关闭。Firefox 需要安装更新(即您可能必须在升级后启动 Firefox,然后再次关闭它)。

  • /usr/lib/firefox是Firefox的可能安装路径;您的路径可能不同,例如它可能是/usr/share/firefox. 您应该能够使用以下命令之一找到可能的路径:

    whereis -b firefox firefox-esr
    which firefox firefox-esr
    
    Run Code Online (Sandbox Code Playgroud)

    正确的omni.ja是在…/browser/omni.ja路径中。

  • 在执行任何这些之前,请确保omni.ja某处创建工作副本,以便在出现问题时有可用的备份。

  • 确保用?user?用户名和?group?文件原始所有权的用户组替换。据我所知,在大多数情况下,这应该是root:root,如果还没有的话。

  • 解压后,omni.ja您可能需要仔细检查

    • 该行this._preventClickSelectsAll = this.focused;存在于 中modules/UrlbarInput.jsm,并且
    • 该行this._preventClickSelectsAll = this._textbox.focused;存在于chrome/browser/content/browser/search/searchbar.js.

清除缓存

最后,Firefox 需要omni.ja通过清除缓存来正确加载新的。这是我发现最简单的两种不同选择。只需要其中一个选项。

  • 一种方法是简单地创建一个.purgecachesbrowser目录中命名的空文件。例如,您可以执行以下操作:

    touch /usr/lib/firefox/browser/.purgecaches
    
    Run Code Online (Sandbox Code Playgroud)

    您只需要在运行上述命令后创建该文件。启动时,Firefox 会在找到此文件时清除其启动缓存,并且还会尝试删除该文件。根据您最初安装 Firefox 的方式,自动删除文件可能会失败。即使这不会影响成功清除缓存,也要注意这一点。

  • 另一种方法是查找 Firefox 的桌面配置文件。查看/usr/share/applications/~/.local/share/applications/查找*.desktop文件名中带有firefoxnightly或可能mozilla或类似的东西)的文件。打开找到的文件。在我的系统上有两个:

    • 一个小的开始firefox-bin(通过Exec=
    • 一个大的,有三个引用 /usr/lib/firefox/firefox

    您想修改较大的:在每个/usr/lib/firefox/firefox(或适合您的任何路径)之后放置-purgecaches选项(也--purgecaches可以工作);所以配置条目之一可能如下所示:

    Exec=/usr/lib/firefox/firefox -purgecaches %u
    
    Run Code Online (Sandbox Code Playgroud)

    使用这种方法,您可能需要*.desktop在每次 Firefox 更新后编辑您的文件,这会减慢Firefox 的每次启动速度。

现在您可以通过单击桌面图标来启动 Firefox。

如果您不通过单击桌面图标启动 Firefox,而是使用终端,则还有另外两种选择:

  • 您可以firefox -purgecaches在终端中输入,
  • 或者您可以export MOZ_PURGE_CACHES=1在终端中输入,然后firefox在同一个终端中输入。

最后,您也可以直接清除缓存。脚本缓存,包括启动缓存,隐藏在.cache你的目录/home。路径看起来像/home/?user?/.cache/mozilla/firefox/?profileID?.?profileType?/startupCache. 删除这些目录将清除 Firefox 的启动缓存。

如果您在同一个 Firefox 安装中使用多个配置文件,请使用此方法。其他内置purgecaches方法仅清除Firefox 使用的第一个配置文件的缓存。

解释

  1. 首先,这些行使用实用程序 ( )将omni.ja文件(准 PKZIP 文件)解压缩到新创建的/tmp/omni目录中。unzipextra/unzip 6.0-14

    Exec=/usr/lib/firefox/firefox -purgecaches %u
    
    Run Code Online (Sandbox Code Playgroud)

    -d omni只是提取从文件/usr/lib/firefox/browser/omni.ja/tmp/omni目录; -q抑制输出(只是一个被膨胀和提取的文件列表)。

    unzip将以 status 退出,2并且在运行unzip命令时您会收到警告和类似这样的错误:

    cd /tmp
    mkdir omni
    unzip -d omni -q /usr/lib/firefox/browser/omni.ja
    
    Run Code Online (Sandbox Code Playgroud)

    别担心。这不会影响进程;状态2只是意味着检测到一些错误,但“[p]处理可能已经成功完成”,正如手册页所说。

  2. 接下来,这两行就地编辑适当的文件。该_preventClickSelectsAll属性控制选择是否在单击时发生。将其设置为true将防止这种行为。第一行地址为 URL 栏,第二行地址为搜索栏。

    warning [omni.ja]:  50008544 extra bytes at beginning or within zipfile (attempting to process anyway)
    error [omni.ja]:  reported length of central directory is -50008544 bytes too long (Atari STZip zipfile?  J.H.Holm ZIPSPLIT 1.1 zipfile?).  Compensating...
    
    Run Code Online (Sandbox Code Playgroud)
  3. omni.ja将使用zip实用程序 ( extra/zip 3.0-9)创建一个包含更改文件的新文件。

    sed -i 's/this\._preventClickSelectsAll = this\.focused;/this._preventClickSelectsAll = true;/' omni/modules/UrlbarInput.jsm
    sed -i 's/this\._preventClickSelectsAll = this\._textbox\.focused;/this._preventClickSelectsAll = true;/' omni/chrome/browser/content/browser/search/searchbar.js
    
    Run Code Online (Sandbox Code Playgroud)

    重要的是将*内部(每个文件)作为目标omni/,而不是omni/目录本身;我们不想创建一个omni.jawithomni作为根目录。进入和退出目录cd也确保了正确的文件层次结构,否则,zip仍然会omni在存档中包含额外的根目录。

    至于选项,-0将压缩级别设置为不压缩,只存储文件;-D避免在 zip 存档中为目录创建条目;-X不保存额外的文件属性;-q,再次抑制输出;-r确保文件以递归方式添加到其正确的目录路径中。

    这些是 MDN 文档中推荐的选项。您可能已经看到一个旧版本(在我编辑它之前)使用-9( -qr9XD,完全) 而不是-0,但这会导致问题:例如,显示键盘快捷键的工具提示的本地化无法在开发人员工具中加载。可能修改硬编码的 Firefox JavaScript Ctrl-Tab 面板行为的答案提到这-0zip创建omni.ja文件大小更接近原始文件的文件的选项。顺便说一句,这是避免这种奇怪的本地化问题的唯一选择。我在这个 GitHub 问题中详细解释了这一点

  4. 接下来,将创建omni.ja的移动到火狐browser目录(并替换文件;不要直接使用现有的omni.ja作为zip目标,否则文件将嵌套在现有的ZIP中),权限可以像原始文件一样设置,最后您可以删除该/tmp/omni目录。

    cd omni
    zip -0DXqr omni.ja *
    cd ..
    
    Run Code Online (Sandbox Code Playgroud)

    事实证明,该chown命令可能不是绝对必要的,但它确保新omni.ja文件与原始文件具有相同的所有者。或者,如果您以非 root 用户身份将原始文件复制到备份目录,则可以使用以下命令:

    mv omni/omni.ja /usr/lib/firefox/browser/omni.ja
    chown ?user?:?group? /usr/lib/firefox/browser/omni.ja
    rm -r omni
    
    Run Code Online (Sandbox Code Playgroud)

    当然,您可以使用另一个文件,例如/usr/lib/firefox/browser/crashreporter-override.ini作为参考。

恢复omni.ja备份以防出现问题

如果 Firefox 在这个过程之后似乎没有正确运行,或者根本没有,这个过程没有工作,很遗憾。您可以通过这样的简单操作mv(可能以 root 用户身份)恢复您的备份:

chown --reference=?your_backup_directory?/omni.ja /usr/lib/firefox/browser/omni.ja
chmod --reference=?your_backup_directory?/omni.ja /usr/lib/firefox/browser/omni.ja
Run Code Online (Sandbox Code Playgroud)

请记住再次清除缓存。

如果之前没有创建omni.ja,则需要重新下载 Firefox并解压缩包以找到替代的omni.ja.


顺便说一句,关于 Bugzilla 的建议解决方法有一个zip --update命令。完整的命令是:

mv ?your_backup_directory?/omni.ja ?your_firefox_browser_directory?/omni.ja
Run Code Online (Sandbox Code Playgroud)

… 和 …

unzip -q /usr/lib/firefox/browser/omni.ja modules/UrlbarInput.jsm chrome/browser/content/browser/search/searchbar.js -d omni
# Instead of
#unzip -q /usr/lib/firefox/browser/omni.ja -d omni
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使了解了zip文件层次结构,我也不能让它工作?-?不过,这会很好,因为它会加快这个过程。相反,我在启动 Firefox 时收到这样的错误:

zip -qr9XDu /usr/lib/firefox/browser/omni.ja *
# Instead of
#zip -qr9XD omni.ja *
#mv omni/omni.ja /usr/lib/firefox/browser/omni.ja
#chown ?username?:users /usr/lib/firefox/browser/omni.ja
Run Code Online (Sandbox Code Playgroud)

我想知道即使我篡改了构建,Mozilla 是否会自动报告此类错误……


相关问题:


1:它可能会在以后的版本中继续工作,并且可能也适用于旧版本;如果这篇文章发生重大变化,我只会更新版本。