6
27
2013
10

使用 SQLite3 的第三方扩展来修改火狐历史记录中的 URL

本文来自依云's Blog,转载请注明。

在火狐 17 以前,我可以这样子访问我本地的 Python 文档的:

jar:file:///home/lilydjwg/docs/Python/python.zip!/index.html

访问的实际上是一个 zip 文件中的内容。网页这种纯文本的东西压缩率高,35M 的 Python 3.3 文档,压缩后只有 7.1M。一来节省磁盘空间(我的 /home 分区己用 98% 了 TwT),二来读取快。

可是,自从火狐 17 开始,虽然 jar: 协议依旧支持,但是似乎其中的部分或者全部 JavaScript 脚本不会被执行。最明显的是,Python 这种用 Sphinx 制作的文档的搜索功能没了!

在拒绝升级火狐很长一段时间之后,Arch 把火狐 16 要用的库文件升级了……于是只好换回未压缩的一大堆文件。可问题是,我以前在火狐地址栏输入re就有 Python 正则表达式模块的文档的补全、输入py m就有 Python 标准库模块列表的补全,地址转换后,这些历史记录里的地址就全失效啦。

现在想想,其实我可以使用 Redirector 插件搞定的。但当时没想到,也是想更根本地解决问题,便直接修改火狐的地址记录数据库了。

此数据库是 SQLite3 数据库,位于火狐配置目录下的places.sqlite3文件中。moz_places表中记录了历史记录和书签中的项目的 URL 地址,只修改它就可以了。但问题是,这不像我当初 MediaWiki URL 路径中去掉index.php那样,用replace函数就可以搞定:

UPDATE OR REPLACE moz_places SET url = REPLACE(url, '/index.php', '') WHERE url LIKE 'http://localhost/wiki/index.php/%';

我需要正则表达式

于是找到了这个 glib_replace 模块,支持使用 glib 的正则表达式来进行替换。下回来编译成 .so 文件后这样子用:

SELECT load_extension('./glib_replace.so');
UPDATE OR REPLACE moz_places SET url = regex_replace('^jar:((?:.(?![^/]+\.zip!))+)(/[^/]+)\.zip!(.*)$', url, '\1\2\3') WHERE url LIKE 'jar:file:///home/lilydjwg/docs/Python/python%'; 

跑完就好啦!

PS: 如果你的 URL 中有 % 字符,记得在 like 操作符参数中转义成 %% 哦~

参考链接

Category: 火狐 | Tags: 正则表达式 火狐 sqlite3 | Read Count: 9175
muzuiget 说:
Jun 27, 2013 11:29:02 PM

如此冷门的功能……

不过我一直都直接看在线的,懒得折腾。

zbinlin 说:
Jun 29, 2013 03:17:47 PM

这应该是个 bug 来的(话说好像没人去报,到了 Firefox 25.0a1 还存在)。
在这个 resource://gre/modules/UserAgentOverrides.jsm 文件里的

let host = aURI.asciiHost;
由于本地资源没有 host,因此这里会报错。改成

let host;
try {
host = aURI.asciiHost;
} catch (ex) {}
应该就可以了。

Avatar_small
依云 说:
Jun 29, 2013 08:40:53 PM

竟然是个 bug 么……为什么我没有注意到有报错呢……

Avatar_small
依云 说:
Jun 29, 2013 09:00:30 PM

原来真是这样!看来我又要改回去了么……

Avatar_small
依云 说:
Jun 29, 2013 09:04:04 PM

在线的太慢了,得不断地等刷新……

zbinlin 说:
Jun 30, 2013 12:32:43 AM

在错误控制台报 aURI.asciiHost 返回值异常。
如果现在用得好好的,就不用改啦,毕竟修复这个 bug 要么修改原代码重新编译,要么修改 omni.ja 里的 UserAgentOverrides.jsm 文件(话说这里有个坑,在 omni.ja 里有两个 UserAgentOverrides.jsm 文件,其中一个 js 源代码的,一个是类似编译后的二进制文件。在测试时只修改了 js 源代码里的,导致修改无法生效,最后只得把那个二进制文件删掉才可以)

Avatar_small
依云 说:
Jun 30, 2013 12:55:43 AM

可能我当时没有注意到错误控制台吧。

omni.ja 已经修改了。可惜没找到生成 jsloader 下那个文件的方法,所以只好删除了。我拿 ag 搜索的,所以两个文件都看到了。

muzuiget 说:
Jun 30, 2013 03:12:16 AM

这明显是个 bug 了,这个文件是在 Firefox 17 里引入的,就是添加「根据不同域名使用不同 UserAgent」的功能。

我之前写 UA 修改扩展也是发现的一个 bug 也是由这部分代码引起的。

https://bugzilla.mozilla.org/show_bug.cgi?id=814379

去报个 bug 咯,既然原因都已经知道了。

upsuper 说:
Jun 30, 2013 08:38:34 PM

这个 bug 已经有报告了 https://bugzilla.mozilla.org/show_bug.cgi?id=888645

upsuper 说:
Jun 30, 2013 08:47:58 PM

原来就是 @zbinlin 报的啊,没看时间……
好吧我已经交补丁了


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com