7
9
2024
20

我正在使用的火狐扩展(2024年版)

距离上次分享好久了,于是又来啦~

桌面版

每一项第一行是扩展标题和链接,第二行是扩展自己的描述信息,第三行(如有)是我为写本文添加的介绍和评论。

篡改猴
使用用户脚本自由地改变网络
复制链接/标签名称和地址
将链接名称和地址复制到剪贴板
复制链接地址
使用快捷键 "a" 来复制链接地址
对着链接点右键,然后按 a 键就可以复制到链接啦。
书签搜索
使用已加为书签的搜索引擎搜索选定文本
我在访问哪个 Cloudflare® 数据中心?
显示正在访问的 Cloudflare® 名称信息
云盘万能钥匙
您的云盘智能助手
大概没什么用了吧……
About Sync
Show information about Firefox Sync.
同步出现问题时用过。它也可以直接发送请求、修改服务端的信息,比如删掉已卸载扩展的同步数据啥的。
Auto Tab Discard
如果您打开了很多标签页,这个扩展能提升浏览器速度并减少内存占用。
就是标签页休眠啦。
Behind The Overlay Revival
Click to close any overlay popup on any website.
一键关弹窗,不用找关闭按钮在哪里。
Bypass Paywalls
Bypass News Sites' Paywalls
cliget
Download login-protected files from the command line.
为下载的文件生成 wget / curl 的命令行。我现在很少用了,主要用途是在服务器上下载不能直接下载的文件。
Control Panel for YouTube
Gives you more control over YouTube by adding missing options and UI improvements
这个扩展功能不少,我主要用的地方有:隐藏短视频(浪费时间)、自动生成的音乐合集(我从来不听这个)、即将开播的视频(又不能看,显示着干嘛)、已观看完毕的视频。隐藏视频结尾总是挡到我看内容的卡片、结束时的推荐视频。将短视频播放器重定向到有进度条的正常播放器。
Cookie Quick Manager
An addon to manage (view, search, create, edit, delete, backup, restore) cookies.
Dark Reader
适用于所有网站的暗色主题。关爱眼睛,就使用 Dark Reader 进行日常浏览。
Decentraleyes
保护您免受集中式的内容交付网络(CDN)的跟踪。
Discard Tab
Adds Discard action to tab right-click
手动休眠标签页,避免浪费系统资源。
Flagfox
显示描述当前服务器位置的国旗。
Foxy Gestures
适用于 Firefox 的鼠标手势
FoxyImage
Collection of Image Related Actions
Google™ Translator
A handy multi-language translator built on top of Google translate.
Header Editor
管理浏览器请求,包括修改请求头和响应头、重定向请求、取消请求
用来做一些 hack 操作的,比如添加 referrer、跨域头;在新标签页中查看 imgur 的图片(不要给我网页);让 Grafana 不走代理、直连数据源以加快加载速度。这扩展在火狐上还能修改响应体。
I don't care about cookies
Get rid of cookie warnings from almost all websites!
Image Max URL
Finds larger or original versions of images
Link Status Redux
Shows an indicator on a popup panel along with the link address when the mouse cursor is over a link to a page you bookmarked or visited before.
显示链接的上次访问时间用的。
matrix.to opener
在你的 Matrix 客户端中直接打开 matrix.to 链接
MergEase • GitHub Code Review
Diff tool for GitHub pull requests
更准确地 diff GitHub 提交和 pull request,有点像 difft,是把 diff 发给服务端来生成的。
Mind the Time
Keep track of how much time you spend on the web, and where you spend it. A ticker shows the time spent at the current site or total time spent on the web today. A summary page shows data for today and recent history.
Octotree - GitHub code tree
GitHub on steroids
给 GitHub 的侧边栏文件树。
Popup window
將 Tab 彈出至獨立視窗,去除頁籤列、網址列和書籤列等介面
这扩展在 Wayfire 上不太好用,弹窗和原本窗口会跟在一起,而且关闭的时候容易关到弹窗后边的窗口。
Push to Kindle
Send web articles to your Kindle
哦,这个应该没用了……
Redirect Link
Redirect a link to somewhere else.
用于打开网页对应的互联网档案馆或者 archive.today 存档用的。
Redirector
Automatically redirect content based on user-defined rules.
和上边那个名字相似、但功能完全不同。自动重定向用的,比如看图要看原图、绕开 link.zhihu.com、统一中文维基百科中间的语种路径、把移动版 URL 重定向到桌面版、去掉 b23.tv 的小尾巴等等。
Reload PAC button
A button to reload the PAC definitions
Rotate and Zoom Image
Allows to rotate and zoom images directly on any website from context menu.
RSS Reader Extension (by Inoreader)
Build your own newsfeed
装了这个才能用快捷键让 InoReader 在后台打开文章。
RSSPreview
Preview RSS feeds in browser
ScrollAnywhere
使用鼠标中键在页面上的任何位置拖动滚动条。还支持“抓取和拖动”样式和动画。
横着滚、竖着滚、滚来滚去~
SingleFile
将一个完整的页面保存到单个 HTML 文件中
Snap Links
Select multiple links, checkboxes and other elements and act on them such as open them in new tabs or check/un-check them.
SponsorBlock for YouTube - 跳过赞助商广告
跳过 YouTube 视频中的赞助广告、订阅提醒等片段。标记视频中的赞助广告来节约大家的时间。
Stylus
Stylus 是一个调整网页外观的用户样式管理器。它可以让您轻松为许多热门网站安装主题和皮肤。
给网页加自定义 CSS 用的,我的用途有:叫网页不要使用奇奇怪怪的 Windows / MacOS 系字体;把暗色网页弄亮堂一点,避免在白天看不清;在各种文档网页里标记访问过的链接,免得老是点过去才发现内容已经读过了,或者不容易找到自己频繁访问的链接;去掉讨厌的圆角。
Textarea Cache
Allows to save automatically the content in a text input field.
不小心关掉了正在编写、尚未提交的内容,可以用它来恢复。
Tile Tabs WE
Take tabs from parent windows and arrange them in layouts of tiled sub-windows.
这扩展在 Wayland 上不能移动窗口,不过还是可以把窗口调整为合适平铺的大小,并可选加上滚动同步啥的。
Tree Style Tab - 树状标签页管理
以树状结构显示标签页。
uBlacklist
在谷歌的搜索结果中屏蔽特定的网站显示。
内容农场走开!
uBlock Origin
一款高效的网络请求过滤工具,占用极低的内存和 CPU。
Unpaywall
Legally get full text of scholarly articles as you browse.
User-Agent Switcher and Manager
Spoof websites trying to gather information about your web navigation to deliver distinct content you may not want
有时候还是不得不假装自己在用 Google Chrome 或者 Windows。
v2ex plus
优雅便捷的 V2EX 扩展
Vimium
The Hacker's Browser. Vimium provides keyboard shortcuts for navigation and control in the spirit of Vim.
wxIF
View the EXIF/IPTC/XMP data for images.
YouTube Anti Translate Updated
A small extension to disable YT video titles autotranslation.
机器翻译太难懂啦。Google 从来都意识不到人是可以会多种语言的。

移动版

由于获取方式的差异,这个列表没有扩展描述。不过大部分都和桌面版是重复的。

篡改猴
我在访问哪个 Cloudflare® 数据中心?
ClearURLs
Control Panel for YouTube
Cookie Quick Manager
Dark Reader
Decentraleyes
Google Search Fixer
Header Editor
Push to Kindle
Stylus
Text Reflow WE
uBlacklist
uBlock Origin
Unpaywall
Video Background Play Fix
在后台继续播放视频和音频,可以用于在后台播放 YouTube Music。
Web Archives
打开当前页面的存档页面。移动版没有右键菜单所以用不了 Redirect Link。

代码

桌面版的列表是在 about:addons 页面,打开 devtools 执行以下代码取得的:

const r = $$('addon-card').map(
  (el) => {
    return {
      title: el.querySelector('h3').textContent,
      desc: el.querySelector('.addon-description').textContent,
      id: el.getAttribute('addon-id'),
    }
  }
)

let parts = []
for(let ext of r) {
  parts.push(`<dt><a href="https://addons.mozilla.org/firefox/addon/${encodeURIComponent(ext.id)}/">${ext.title}</a></dt>\n<dd>${ext.desc}</dd>`)
}

console.log(parts.join('\n'))

而移动版是在 about:debugging 页面,连接上移动版火狐之后,执行以下代码获取的:

const r = $$('[data-qa-target-type="extension"]').map(
  (el) => {
    return {
      title: el.querySelector('[title]').title,
      id: el.querySelector('dd').textContent,
    }
  }
)

let parts = []
for(let ext of r) {
  parts.push(`<dt><a href="https://addons.mozilla.org/android/addon/${encodeURIComponent(ext.id)}/">${ext.title}</a></dt>`)
}

console.log(parts.join('\n'))
Category: 火狐 | Tags: web 火狐 WebExtensions
7
25
2019
6

火狐远程调试火狐

F12。F1。开启 chrome 调试。开启远程调试。汉堡菜单,Web 开发者,浏览器工具箱。

如上操作,就可以打开一个专用火狐实例,连接到之前的火狐上,用来调试火狐的界面(chrome)了。

然而这里有个问题:这样你没法调试任何独占式的弹出菜单。不管是各种右键菜单,还是地址栏补全、汉堡菜单,它们一出现,就会捕获键盘鼠标,你根本不能操作别的窗口了。

遇到这种占用整个 X 服务器的情况,一种策略就是我上一篇文章里调试 fcitx 时那样,通过 ssh 连过来调试。然而火狐的 devtools 显然需要一个 X 服务器才能运行的。所以可以在另一台电脑上调试。当然单机也是有办法的啦——xephyr 就是为此而生的。pacman -S xorg-server-xephyr 就可以了。然后 Xephyr :1 -screen 1024x768 启动。

可还有个问题:之前的 devtools 打开的时候没给机会指定它在哪个 X 服务器上运行呀。虽然 GTK 有能力把窗口从一个服务器转移到另一个,但那也是需要程序主动配合的。不过既然叫「远程调试」的,应该也能像 Firefox for Android 那样通过网络连接才对?

于是搜了一下,果然找到篇 MDN 的文章讲这个的。简单地说就是加个参数就好啦:

DISPLAY=:1 firefox-nightly -no-remote -profile tmp --start-debugger-server 6100

最后要加个端口号,因为默认是 6000,和 X 服务器的冲突了……(我是说怎么明明在监听怎么就是连不上呢,原来连错程序了 QAQ)

然后在另一个火狐实例里打开 about:debugging 去连接就好啦。本地(localhost)连接的话,不需要额外的配置也不需要确认的。如果不是本地连接,还需要去 about:config 改两个选项。


花了些时间,把显示成两行的地址栏补全给弄回来啦~

火狐地址栏两行补全

样式表在这里。想用的话记得要把 toolkit.legacyUserProfileCustomizations.stylesheets 设置为 true 才会加载 userChrome.css 哦。

Category: 火狐 | Tags: 火狐
11
21
2017
28

我正在使用的火狐扩展

早就说了要介绍我在用的火狐扩展,现在终于来啦。

桌面版

Android 版

Android 版上使用的扩展比较少,大部分是桌面上用的扩展同时支持 Android,所以同步过来了。只有一个例外:Text Reflow WE

这个扩展是我移植到 Web Extensions 的。在点击内容时限制文本宽度,从而限制需要不断地横向滚动。原本是 Opera Mobile 的特色功能,后来我换到火狐时找了个替代品,结果它没更新了,不支持57+,我就移植了一下。代码十分简单,本来是一个 user script 就可以搞定的内容,但是 Android 上好像没 user script 扩展……


2017年11月25日更新:

装回了 cliget,一个为下载项生成 wget / curl / aria2 调用命令的工具。虽然因为没有 XUL API 可以修改保存对话框了,但是作者找到了一种不错的办法,把候选下载项保存到一个列表里方便取用。会有误判,忽略就好。这个列表是下载对话框弹出的时候就会更新,所以挺适合下载大的「百k盘」文件,下载链接超时失效之后可以获取一个新的让 wget 接着下。

暂时把 uBlock Origin 换回了 Adblock Plus。界面比前者好看许多,可惜还是没有规则使用计数和最后使用时间记录,不方便清理失效的规则。

启用了 ScrollAnywhere,因为妨碍 Foxy Gestures 使用右键的 bug 已经解决了。我使用的是 Nightly 版本所以很快就用上了,Linux 发行版如 Arch 也有做 backport。

考虑换回 GreaseMonkey,不过发现有一个 bug 导致它不能在特定网站上触发安装操作。

Category: 火狐 | Tags: 火狐 WebExtensions web
9
24
2017
13

书签搜索:藏在书签里的搜索引擎

最近开始用 Firefox nightly 了。纯 WebExtensions 时代就要来临了,然而 WebExtensions 还不能访问浏览器搜索引擎,所以我没办法选中文本,然后选个正确的搜索引擎了……

我之前使用的是 FireGuestures。选中文本,一个手势弹出我所有的搜索引擎,然后选一个使用。挺好挺方便。然而看现在使用 WebExtensions 的搜索扩展,因为无法访问浏览器搜索引擎,所以都是内置了几个搜索引擎,最多让用户手动添加自己想要使用的。多麻烦啊,而且还要维护额外的数据。

而火狐从一开始就可以「为此搜索引擎添加关键词」(如下图)。虽然也叫「搜索引擎」,但是并不是搜索栏用的那个,而是带关键字的书签。对于 GET 请求的搜索,是在 URL 里把搜索词写作「%s」。对于 POST 请求,「PostData」是用户看不到、扩展也访问不到的,也不能被同步。不过大部分搜索都是 GET 嘛。功能上是弱了一些,比如不能在只有关键词、没有搜索词的时候打开主页。但是书签可以同步呀!

添加用来搜索的书签

于是,利用书签来存储、同步搜索引擎的扩展——书签搜索——诞生了!效果图如下:

使用「书签搜索」上下文菜单

(这个其实是之前《改了一下 GTK 3 的默认主题》的配图 :-)

感兴趣就前往安装书签搜索吧~喜欢请给小星星(AMO 和 GitHub 都可以给星星的哦)~遇到问题请点击右侧「用户支持网站」报告~


这是我的第一个 WebExtensions 扩展,也是第一个正式发布的火狐扩展(其实也支持 Google Chrome 和 Opera;Microsoft Edge 没有尝试,大概也支持吧)。WebExtensions 写起来比 XUL 舒服很多,最主要是文档全面了!不用像写 XUL 那样,拿浏览器工具箱找要修改的 DOM,然后满世界找自己需要的 API。WebExtensions 提供的 API 就那么点,在 MDN 上都有写。另外就是 JavaScript 这些年来进步很大,越来越像 Python 了!可惜 Google Chrome 和 Opera 它们的扩展还不使用 Promise、不能用 await,不然写起来更舒服了。

8
31
2017
17

新的火狐,新的旅程

Firedoge

今年底火狐将不再支持旧的基于 XUL 的扩展了。火狐53已经不支持 GTK 2 了。每人一只与众不同的火狐的时代行将结束,而生活仍要继续。

使用 ESR 版本只是短暂地续命罢了,stylo 也用不了。正巧ヨイツの賢狼ホロ[archlinuxcn] 仓库打包了可以与已有版本共存的 firefox-nightly 包,于是新的旅程开始了。

一开始,我尝试喂给它旧的 profile(复制了一份,然后用 firefox-nightly -no-remote -P 启动)。我原本有64个扩展,结果只有六个还兼容……

不如像之前升级火狐4那样,重练好了。重新取一块干净的画布,从头开始。

结果比预期中的好很多。

首先,新火狐很快。我不想办法关动画了。我不担心开新的窗口耗时了。多进程的架构也使得我不那么害怕单个标签页卡死导致什么也做不了了。不过不知道是进步明显,还是我那几十个XUL扩展太拖累了。

然后,同步很好用。虽然同步的内容有限,但是比手工搬移一些数据好多了,也可以把标签页发送到另外的设备阅读。同步的数据包括:书签,历史,表单自动填充,密码,从AMO安装的扩展(不过只会安装最新稳定版),部分首选项(只是一部分,所以还是有不少需要手动调整)。打开的标签页也可以从另外的设备看到。我同时也在 Android 上登录了同步,这样访问历史可以同步,方便在不同的场景下继续阅读。

不过也有点问题。首先是 tampermonkey 支持同步从URL安装的脚本,但是呢,一开始它没同步过来,我手动安装了。然后它又不知道什么时候同步了一份,于是重复了。删掉重复的,又过了一段时间,同步过来的那份也消失了……

还有一些设置上的调整。about:config 打开,搜索 x-western,改成 sans-serif 字体。剩下的中日韩字体设置,这次我直接在 fontconfig 那边配置了,就不用在火狐里点来点去的了。

安装中文语言包之后([archlinuxcn] 源里有),搜索 locale,把 en-US 改成 zh-CN。

搜索 urlbar,关闭自动填充、双击全选、隐藏 http:// 和 ftp://,地址栏建议数量增加为15,关闭搜索引擎的建议。

定制一下工具栏,使用紧凑布局,把不需要的扔掉,用得少的放进收纳盒里去。RSS 按钮丢最右上角好了。侧栏还是显示左边吧,那按钮也放左边来。

导入旧的书签。开了同步的话,注意一定不要从备份中恢复书签!因为恢复的时候会删掉已有的所有书签,包含移动端书签。导出成 HTML 再导入就会合并了。

打开 InoReader 设置界面,把 InoReader 添加为RSS阅读器。

最后就是各种扩展了。许多扩展没有迁移到 Web Extensions,但是一些还是有替代方案的。具体可以看这个表格。然后是配置这些扩展,包含各种扩展数据的导入。

还有很多扩展没有替代品,那也只能放弃了。有些扩展目前是不可能在 Web Extensions 上实现的。至于 UI,算了,接受现实吧。其实 nightly 的 GTK 3 界面做得比最开始的版本已经好了很多。

哦对了,我还换了个轻量级主题。之前使用的 White Lily,已经下架很久了。这次我换了这个,明快简洁,挺好看的。

具体扩展的介绍,我单独写了一篇

在导入网易云音乐的播放列表(我没有登录)的时候,我还发现一个事儿:火狐52的 devtools 有 bug,并不会显示 localStorage……

总体感受,忍痛割爱之后,又是一片新天地。nightly 确实很快。

Category: 火狐 | Tags: 火狐 网页 浏览器
3
27
2014
7

火狐远程调试初体验

开始啦

首先要启用远程调试功能。在桌面端火狐里按快捷键Ctrl-Shift-K调用开发者工具,点左上角的「设置」按钮,勾选「启用远程调试」。移动端火狐也通过「设置」页启用远程调试。

启用远程调试

设置端口转发。使用 USB 连接并且在 Android 设备上启用了 adb 的话,可以使用如下命令来转发:

adb forward tcp:6000 tcp:6000

我使用 Wi-Fi 网络连接。因为移动端火狐只监听了 127.0.0.1 这个地址,所以外边连不上去。我使用 socat 命令来转发一下。我编译的 Android 版 socat 程序可在这边下载

socat tcp-listen:6000,fork,bind=192.168.1.XXX,reuseaddr tcp:127.0.0.1:6000

桌面端在「Web 开发者」菜单里选择「连接…」,然后填入移动端的 IP 地址。如果使用 adb 进行端口转发的话使用默认的「localhost」就可以了。

连接到远程设备

开始连接之后,被连接的火狐(这里即移动设备上那个)会弹窗询问是否允许。确认之后就可以看到远程设备的标签页以及 chrome 页面(即截图里那个「主进程」)了。

选择连接到的标签页

然后就跳出来一个新的开发者工具窗口了。我这里选择的是火狐自己那个 chrome 页面(「主进程」):

调试移动端火狐

大家可以看到,我在 Android 上的火狐上也安装了 Adblock Plus 哦~

小惊喜

桌面端火狐启用远程调试chrome 调试后,可以在「Web 开发者」菜单里看到「浏览器工具箱」这么一项。它会开启一个-P参数为default-chrome-debugger-chrome参数为chrome://browser/content/devtools/framework/toolbox-process-window.xul的新火狐实例,通过远程调试接口连接到当前火狐实例上,实现对火狐顶层 chrome 窗口的调试。不过直接执行在 htop 里看到的命令并不能开启调试器,大概是因为这时候需要被调试的火狐不知道有人要调试它吧。虽然火狐自带的开发者工具功能比较弱,不过能对顶层 chrome 窗口进行调试还是很不错的 :-)

参考资料

Category: 火狐 | Tags: Android 火狐
3
25
2014
0

火狐开发者工具、Object.watch 以及地址栏图标

之前通过 userChrome.js 脚本把火狐的地址栏图标弄回来了,但是一直有这么个问题:打开一个会自动跳转的标签页,比如 t.co 或者登陆状态下的 Google 搜索结果时,首先会显示跳转前的网站的图标(这没问题),然后开始载入新页面了(这问题也不大),然后新页面是使用 HTTPS 的(比如 MDN),于是就会看到地址栏图标后边已经变成绿色、显示出了站点信息(如「Mozilla Foundation (US)」),但是图标仍旧是跳转前的图标

经过探索,我发现火狐在载入新页面时并不会及时更改网站的图标(即该 tab 对象的.image属性;大概是因为默认情况下,即标签页里那个图标,它会被「载入中」的图标取代),但是其它信息都会及时更改,这才造成了不一致。既然这段时间取不到网站的图标,那么用默认图标好了。但问题是,怎么知道地址栏的 URL 已经改变了呢?

我试过在urlbar上监听change事件。Firebug 在调试chrome://browser/content/browser.xul页面时说会有这么个事件,但是真正在 chrome 里运行时却发现没有这样的事件被触发。

还想到了通过 Object.watch 方法要监听tab.linkedBrowser.currentURI属性的更改,但是好像也没有被调用。也许那个 nsIURI 对象一直在那里,只是它的值在变而已。

期间还试过 addProgressListener。大概是用法不对,无果。

后来结合了以上两个方案,决定监听urlbar.value的更改。这下终于好用了。有点小坑的是,因为一直在尝试各种方案,没仔细看文档,结果没注意注册到.watch方法中的函数要返回实际要设置的属性值,把火狐地址栏搞坏掉了……

在调试过程中,浏览器控制台(取代了以前的「错误控制台」,快捷键还是Ctrl-Shift-J)比「代码片断速记器」好用(它实际上是火狐自带调试工具中的「Web 控制台」运行在 chrome 上的版本):

火狐的「浏览器控制台」

  • chrome 脚本中的console.log等日志会记录在浏览器控制台,并且可以按关键字过滤(比如我今天一直在用的userChrome
  • 浏览器控制台支持 Tab 补全
  • 代码片断速记器每次打开之后需要手动切换「在浏览器环境中执行」
  • 代码片断速记器中不支持选择即复制、中键点击即粘贴功能,不支持 GTK 自定义的编辑快捷键
  • 浏览器控制台中直接记录对象的话,点击之后会出现和代码片断速记器Ctrl-i快捷键一样的「对象查看器」

不过浏览器控制台不支持将日志中的对象直接在脚本中使用(Firebug 支持)。

哦还有,MozRepl 在开启 chrome 调试的时候,是连接到最后一个有焦点的火狐窗口的(而不一定是chrome://browser/content/browser.xul这个)。期间搞错了一次,发现里边竟然连gBrowser变量都没有 -_-|||

最后,辛辛苦苦接着出来的新版代码(其实没改多少):

if(location == "chrome://browser/content/browser.xul"){

  var eTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"]
                    .getService(Components.interfaces.nsIEffectiveTLDService);

  function updateIcon(event){
    var tab = event.target;
    if(tab != gBrowser.selectedTab){
      return;
    }
    var icon = tab.image || 'chrome://mozapps/skin/places/defaultFavicon.png';
    var identity = document.getElementById('identity-box');
    if('chromeUI'.indexOf(identity.className) != -1){
      // already has a pretty icon as list-style-image
      icon = '';
    }
    console.log('updateIcon', icon, tab.linkedBrowser.currentURI.spec, event);
    document.getElementById('page-proxy-favicon').src = icon;
    if('verifiedDomain'.indexOf(identity.className) != -1){
      var identityLabel = document.getElementById('identity-icon-labels');
      identityLabel.collapsed = false;

      var domain;
      try{
        domain = eTLDService.getBaseDomain(tab.linkedBrowser.currentURI);
      }catch(ex){ // NS_ERROR_HOST_IS_IP_ADDRESS
        domain = tab.linkedBrowser.currentURI.host;
      }

      document.getElementById('identity-icon-label').value = domain;
    }
  }

  var container = gBrowser.tabContainer;
  // includes TabSelect (.selected is modified)
  container.addEventListener("TabAttrModified", updateIcon, false);
  document.getElementById('urlbar').watch('value', function(prop, oldval, newval){
    console.log('urlbar value changed to ' + newval);
    document.getElementById('page-proxy-favicon').src = 'chrome://mozapps/skin/places/defaultFavicon.png';
    return newval;
  }, false);

  })();
}
Category: 火狐 | Tags: 火狐 userChrome
3
9
2014
8

GM 脚本:GMail 日期正常化

我所谓的「正常化」,就是适合人而不是机器读取的格式啦。比如你们说「12/2/14」这是哪天呢……明明可以显示成「20YY年M月DD日 上午H:MM」这样子的(鼠标移过去会出现),但是为什么非要我去移鼠标呢。于是就有了这个很简单的脚本:

// ==UserScript==
// @name           GMail 日期正常化
// @namespace      http://lilydjwg.is-programmer.com/
// @description    将 GMail 中的日期使用更适合人阅读的形式显示
// @include        https://mail.google.com/*
// @grant	   none
// ==/UserScript==

var doit = function(){
  var elements = document.querySelectorAll('span[alt]');
  for(var i=0, len=elements.length; i<len; i++){
    elements[i].textContent = elements[i].getAttribute('alt');
  }
};
document.addEventListener('overflow', doit);
window.addEventListener('focus', doit);

点此安装

Category: 火狐 | Tags: gmail GreaseMonkey
11
27
2013
10

恢复火狐地址栏图标及 HTTPS 站点标识

大约一年前,火狐 14 发布的时候,取消了在地址栏显示网站图标的功能,而且重新设计了 HTTPS 网站的标识。那个白色背景上的绿色标识我很不喜欢,于是通过给 omni.ja 文件打补丁的方法恢复了之前的样式:

  • HTTP 网站图标:

    HTTP favicon

  • HTTPS 域名显示:

    HTTPS domain

  • HTTPS 「经营者」显示:

    HTTPS identity

  • 部分 chrome URL 显示(我自己照着改的):

    Chrome URL

可是,火狐 21 对这部分代码进行了重构,我找不到相关部分的代码了。于是,我一直还在使用火狐 20。直到前几天。

实际上,恢复在地址栏显示网站的扩展有不少,但无一例外,它们都只是恢复网站图标的显示。有个插件也恢复了 HTTPS 网站的浅蓝色域名显示,但是没有已认证的「经营者」的绿色显示。而且,它的代码是通过定时器每隔几百毫秒就执行一次,相比事件响应的方法太没效率了。

于是,使用代码片断速记器(默认快捷键Shift+F4),配合 Firebug 查看 chrome://browser/content/browser.xul,根据之前的样式表,我终于得到了以下解决方案(实际上上边的截图是我这个解决方案应用之后的)——

首先,安装 userChromeJS 扩展。这个扩展使得在火狐启动时加载 userChrome.js 文件。

其次,userChrome.js 文件,使地址栏显示网站图标并在正确的时机切换。它位于火狐配置目录下的 chrome 目录下:(注意已有新版

if(location == "chrome://browser/content/browser.xul"){
  (function(){

  var eTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"]
                    .getService(Components.interfaces.nsIEffectiveTLDService);

  function updateIcon(event){
    var tab = event.target;
    if(tab != gBrowser.selectedTab){
      return;
    }
    var icon = tab.image || 'chrome://mozapps/skin/places/defaultFavicon.png';
    document.getElementById('page-proxy-favicon').src = icon;
    var identity = document.getElementById('identity-box');
    if('verifiedDomain'.indexOf(identity.className) != -1){
      var identityLabel = document.getElementById('identity-icon-labels');
      identityLabel.collapsed = false;

      var domain = eTLDService.getBaseDomain(tab.linkedBrowser.lastURI);
      document.getElementById('identity-icon-label').value = domain;
    }
  }

  var container = gBrowser.tabContainer;
  container.addEventListener("TabSelect", updateIcon, false);
  container.addEventListener("TabAttrModified", updateIcon, false);

  })();
}

这部分,特别是标签页事件,参考了 MDN 的相关文档

最后,HTTPS 和 chrome URL 的样式文件,放到同目录下的 userChrome.css 中,有点长:

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");

/* 地址栏图标 */
#identity-box {
  background-image: linear-gradient(hsl(0,0%,98%), hsl(0,0%,92%));
  box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset;
  -moz-border-end: 1px solid rgba(0,0,0,.1);
  -moz-margin-end: 3px !important;
}

#identity-box:hover:active,
#identity-box[open="true"] {
  background-image: linear-gradient(hsl(0,0%,92%), hsl(0,0%,82%));
  box-shadow: 0 1px 1px hsla(0,0%,0%,.3) inset,
              0 1px 3px hsla(0,0%,0%,.3) inset;
}

/* Text colors for each:
 *
 * rgb(38, 76, 129) hsl(215, 55, 33)
 * rgb(71, 153, 0)  hsl(92, 100, 30)
 * rgb(229, 115, 0) hsl(30, 100, 45)
 */

#identity-box.verifiedDomain {
  background-image: linear-gradient(hsl(215,60%,92%), hsl(215,58%,88%));
  box-shadow: 0 1px 0 hsla(215,54%,33%,.05) inset;
  -moz-border-end-color: hsla(215,54%,33%,.2);
  color: hsl(215,54%,33%);
}

#identity-box.verifiedDomain:hover:active,
#identity-box.verifiedDomain[open="true"] {
  background-image: linear-gradient(hsl(215,80%,80%), hsl(215,67%,65%));
  box-shadow: 0 1px 1px hsla(215,54%,33%,.7) inset,
              0 1px 3px 1px hsla(215,54%,33%,.5) inset;
}

#identity-box.verifiedIdentity {
  background-image: linear-gradient(hsl(91,70%,90%), hsl(93,60%,81%)) !important;
  box-shadow: 0 1px 0 hsla(92,81%,16%,.05) inset !important;
  -moz-border-end-color: hsla(92,81%,16%,.2) !important;
  background-repeat: inherit !important;
  background-color: transparent !important;
}

#identity-box.verifiedIdentity:hover:active,
#identity-box.verifiedIdentity[open="true"] {
  background-image: linear-gradient(hsl(92,65%,70%), hsl(92,40%,48%)) !important;
  box-shadow: 0 1px 1px hsla(92,81%,16%,.6) inset,
              0 1px 3px 1px hsla(92,81%,16%,.5) inset !important;
}

#identity-box.chromeUI {
  background-image: linear-gradient(hsl(29,70%,95%), hsl(31,60%,90%)) !important;
  box-shadow: 0 1px 0 hsla(30,81%,25%,.05) inset !important;
  -moz-border-end-color: hsla(30,81%,25%,.2) !important;
  background-repeat: inherit !important;
  background-color: transparent !important;
}

#identity-box.chromeUI:hover:active,
#identity-box.chromeUI[open="true"] {
  background-image: linear-gradient(hsl(30,65%,85%), hsl(30,65%,70%)) !important;
  box-shadow: 0 1px 1px hsla(30,81%,25%,.6) inset,
              0 1px 3px 1px hsla(30,81%,25%,.5) inset !important;
}

另外,新版火狐又有一点令我不满了:滚动到页面底部和顶部也会使用平滑滚动,不喜欢。还是这个是可选的,设置 general.smoothScroll.otherfalse 就可以了。

2013年11月29日更新:自火狐 23 起,地址栏搜索会使用搜索栏的默认搜索引擎。对于我这种拿地址栏搜网站、搜索栏查字典的用户来说,这很难以忍受。于是找到 keyword.URL Hack! 这个扩展,新建字符串设置keyword.URL为 Google「手气不错」地址https://www.google.com/search?hl=zh-CN&btnI=1&q=,终于又回到从前二者兼俱的时候。

2014年3月25日更新:更新了脚本,在载入过程中不会显示错误的图标了。

Category: 火狐 | Tags: 火狐 userChrome
11
13
2013
2

GM 脚本:清除 Google Groups 中的翻译提示

终于忍受不了 Google Groups 网页里到处都是的「将本帖翻译成中文」提示了——

// ==UserScript==
// @name           Google Group 清理
// @namespace      http://lilydjwg.is-programmer.com/
// @description    不用将帖子翻译成中文……
// @include        https://groups.google.com/*
// @grant      none
// ==/UserScript==

function doit() {
  console.log('cleaning up...');
  var divs = document.evaluate('//div[@class="gux-confirm-panel-c"]/div/a[@class="GFLL15SM5B"]/parent::div/parent::div', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

  for(var i=0, len=divs.snapshotLength; i<len; i++){
    var div = divs.snapshotItem(i);
    div.parentNode.removeChild(div);
  }
}

var timer;

document.body.addEventListener('overflow', function(e){
  if(timer){
    clearTimeout(timer);
  }
  timer = setTimeout(doit, 500, false);
});

点击安装备用地址

Category: 火狐 | Tags: google 火狐 GreaseMonkey

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com