标签 Mozilla 下的文章

[最近更新]

修正初次化后的首次点击无法正常启动 Fiddler 的缺陷,
并针对 Firefox 3.5 后一些组件的改动进行更新,
可支持目前最新的  Firefox 3.6a1pre 。

Fiddler Switch Context Menu

最近接连发了很多 Mozilla 向的东西,
不知有没有吓到大家。
打铁要趁热,
今天我又带来一款 Firefox 扩展,
名曰“Fiddler Switch”。

做前端开发的朋友应该对 Fiddler 不陌生,
而不做前端的似乎又很少能够用到它,
所以对于 Fiddler 我这里就不多做介绍了,
实在不了解的可以稍微 Google 一下

那么该扩展的功用就是在 Firefox 状态栏添加一个开关,
点击它便可以自动启动或关闭 Fiddler 。

你可能觉得这是一个相当简单的过程。
诚然!
有很多方法能让你一键启动程序,
但由于 Fiddler 对 HTTP 的监控是以 Proxy 的方式,
而 Fiddler 仅能为 IE 自动切换代理,
所以对于使用 Firefox 的朋友,
频繁地去更改代理设置,
不要太麻烦哟~
(当然你可以将 fiddler 端口写进 pac )

本扩展的出现将解决前端开发者的这一烦恼(-__-),
前端工程师们:
如果你想在 6:00 PM 整点下班,
请义无反顾的安装吧!

介绍完毕,
提供下载:

- 阅读剩余部分 -

大概从 Thunderbird 3 的某个 beta 版本开始,
“附件提醒 (Attachment Reminder)” 就成为其内置的一项功能了。
而在此之前,
是需要安装一些扩展才能获得相应功能的。

然而这个新功能并不尽如人意,
首先它不对标题栏进行检查;
其次其检查关键字的效率并不令人满意;
当然最严重的是:
它并不支持中文。
(应该说是非 ANSI 字符)
这种 bug 这应该算 Mozilla 系列的诟病了。
可能由于 Thunderbird 3 的装机量着实不高,
我在 Bugzilla 中没有搜寻到相关的缺陷报告。

既然没有,
咱们就自己动手修。
“说时迟,那时快”,
当你们看到本文的时候,
其实我已经完成 bugfix 了。
在此特别感谢 SpriteVan  君充当了小白鼠。

可能有的观众才刚刚打开电梯,
还不知道 Thunderbird 3 内置的附件提醒功能究竟如何使用,
下面就请容我置喙一下,
向大家介绍该功能的使用方法:

- 阅读剩余部分 -

不多介绍,
明白人儿都知道我的意思。
其实也可以说是动态插入样式单的标签。

首先,
对于 Content 级的脚本,
我们可以这么写:

(document.getElementsByTagName('head')[0] || document.documentElement)     .appendChild(document.createElement('style'))     .appendChild(document.createTextNode(().toString()));

值得注意的是 Firefox 虽然支持 CDATA 文本,
但在使用时要小 hack 一下。
该方法可以用于 GreaseMoneky 等执行于 Content 级别的脚本里,
当然 Web 里也没有问题啦。

其次,
对于 Chrome 级别的脚本,
我建议这么写:

- 阅读剩余部分 -

Set ThunderBird as Default RSS Reader in Firefox

之前主要用 Google Reader ……
但在线工具毕竟是在线工具……
没有手感 -__- ……
在我还没下定决心用 Google Gear 之前……
我想到了用 ThunderBird ……

好歹自己也算是个 ThunderBird 的拥趸了……
不仅仅只是把它作为一个邮件终端……
还利用其强悍的 Filter 和 Tag 功能管理邮件列表、订阅新闻组……
然后配合 LightningGoogle Calendar 和 Treo 来实现 GTD ……
这次将其提拔为 RSS 阅读器实在是最近有点儿心痒……
想折腾折腾工作环境……

好吧……
入正题……
有人可能会问……
Firefox 不是允许选择线下 RSS 阅读软件么?」
是的……
的确可以……
但是你可以指定 ThunderBird 作为阅读器试试看……
点击 "Subscribe Now" 后除了呼出 ThunderBird 外并没有执行订阅操作……
自家人都不认自家人了……
像个什么话!

屡试屡爽之后……
我意识到这可能是个 Bug ……
二话不说上 Bugzilla 一搜……
果然就就是 Bug 350735 ……
不过前年的 Bug 至今还没解决还真是有点儿那啥……

继续搜索……
找到几种解决临时方案……
其中在 MozillaZine 论坛找到的方案应该是最通用的一种了……
作者 alta88 说是由于 Thunderbird 接受 Feed 的参数与 Firefox 发送的不符而造成的……
知道原因就好办了……
马上搜索 ThunderBird 源码……
在 components\newsblog.js 中找到了如下代码:
(Portable ThunderBird 位于 App\thunderbird\components\newsblog.js)

/* nsICommandLineHandler */ handle : function(cmdLine) { // we only care about "-mail someurl" where someurl is a feed: url // we also don't want to remove the parameter in case we don't end up handling it... var mailPos = cmdLine.findFlag("mail", false); if (mailPos != -1 && cmdLine.length >= mailPos ) { var uriStr = cmdLine.getArgument(mailPos + 1); if (/^feed:/i.test(uriStr)) { var mailWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService() .QueryInterface(Components.interfaces.nsIWindowMediator).getMostRecentWindow("mail:3pane"); // if we don't have a 3 pane window visible already, then we can optimize and do nothing here, // that will let the default command line handler create a 3pane window for us using the feed // URL as an argument to that window when it gets constructed...so we only care about the // case where we want to re-use an existing 3 pane to subscribe to the feed url if (mailWindow) { cmdLine.handleFlagWithParam("mail", false); // eat up the arguments we are now handling cmdLine.preventDefault = true; // prevent the default cmd line handler from doing anything var feedHandler = Components.classes["@mozilla.org/newsblog-feed-downloader;1"].getService(Components.interfaces.nsINewsBlogFeedDownloader); if (feedHandler) feedHandler.subscribeToFeed(uriStr, null, mailWindow.msgWindow); } } } },

显然可以看出……
ThunderBird 要求 Feed 作为 Mail 参数来传递……
具体格式为:

thunderbird.exe -mail feed:URL

我在命令行下测试如下命令……

thunderbird.exe -mail feed:http://www.quchao.com/feed/

果然成功地订阅成功……

问题找出来就好解决了……
两种方案……
让 Firefox 附上参数……
或让 ThunderBird 忽略参数……
显然添加参数比忽略参数要安全……
毕竟 ThunderBird 不只是 RSS 阅读器而已……
忽略掉参数怕会影响其它的服务哟……

那么就拿 Firefox 开刀吧……
看了 alta88 的解决方案……
他增加了两个 pref 变量用来保存参数和 Feed 协议……
很通用的方法……
但我个人觉得没有必要……
不如直接判断阅读器的文件名……
包含 Thunderbird 变添加参数后发送……
一来不必往 Pref 里添加并不常用的变量……(洁癖作祟?)
二来其它 RSS 阅读器没准就直接支持 Firefox 的方式……

我的修改方法如下:
找到 Firefox 的 components\FeedConverter.js 文件……
(Portable 版本位于 App\firefox\components\FeedConverter.js)
搜索:

var ios = Cc["@mozilla.org/network/io-service;1"]. getService(Ci.nsIIOService); var feedURI = ios.newURI(spec, null, null); if (feedURI.schemeIs("http")) { feedURI.scheme = "feed"; spec = feedURI.spec; } else spec = "feed:" + spec; var ss = Cc["@mozilla.org/browser/shell-service;1"]. getService(Ci.nsIShellService); ss.openApplicationWithURI(clientApp, spec);

替换为:

// Hacked by Chappell.Wat from http://QuChao.com @ 2008-6-3 if (clientApp.persistentDescriptor.toLowerCase().indexOf('thunderbird') != -1) { var targetFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); try { targetFile.initWithPath(clientApp.persistentDescriptor); } catch(e) { alert(e); return(false); } if (!targetFile.exists()) { alert('Client Does Not Exists.'); return(false); } spec = 'feed:' + spec; var process = Cc['@mozilla.org/process/util;1'].getService(Ci.nsIProcess); process.init(targetFile); var arguments = ['-mail', spec]; process.run(false, arguments, arguments.length,{}); } else { var ios = Cc["@mozilla.org/network/io-service;1"]. getService(Ci.nsIIOService); var feedURI = ios.newURI(spec, null, null); if (feedURI.schemeIs("http")) { feedURI.scheme = "feed"; spec = feedURI.spec; } else spec = "feed:" + spec; var ss = Cc["@mozilla.org/browser/shell-service;1"]. getService(Ci.nsIShellService); ss.openApplicationWithURI(clientApp, spec); }

原理是判断阅读器文件名……
包含 "thunderbird" 便发送 -mail 参数……
至于为何要换 openApplicationWithURI 函数为 run ……
事出无奈……
openApplicationWithURI 似乎无法发送形如 -mail feed:URL 的参数……
且源码应该是被封在 browser.xpt 里……
不过使用效果一样就行了……

最后……
轮到测试时间了……
测试之前我建议还没有在 ThunderBird 里建立 RSS 账户的朋友去新建一个……
(File -> New -> Account... -> RSS News & Blogs)
我当初修改了好久均无法调用订阅动作……
看了代码才知道是没有 RSS 账户提供绑定……
(详见 components\newsblog.js 文件的 120-132 行 )

下面跟着我一起访问 feed:http//www.quchao.com/feed/
(要是觉得慢也可以自己随便找个源喔……)
浏览器会把你带到订阅界面……
在下拉菜单中选择 "Choose Application" 并定位于你的 ThunderBird ……
(如顶图)
接下来猛击 "Subscribe Now"……
不出意外 ThunderBird 应该被激活(或启动)来验证 Feed 地址……
如果验证无误……
这个 Feed 应该就乖乖躺在你的 RSS 账户里了……
如果没有它躺下……
您可以在本文后留下您遇到的问题……
我会尽力解答……

Use FolderPane Tools to change the order

题外话一:
如果你和我一样由于邮箱太多……
新建的 RSS 账户位于底部看不见的话……
我建议使用 FolderPane Tools 来调整账户的顺序……
(如上图)

题外话二:
如果你和我一样不习惯将 RSS 和 Mail 数据放在一起的话……
你可以看看这篇文章……
顺便说一下我的 RSS 账户 ID 是 11……
(现在你知道我到底在 ThunderBird 里放了多少东西了吧)
修改完后……
RSS、邮件和新闻组的数据放在不同的文件夹……
看着舒心……
用着也放心……

题外话三:
很早之前用过一个名为 RSS News Ticker 的软件……
相当好用……
但是该软件的更新是全局式的……
比如你设置 10 分钟更新一次……
那么不管 RSS 有没有显示完它都会“敬业”地进行更新……
我的想法是仅仅订阅一个源……
这个源包含所有我未读 RSS ……
是否能通过编写 Thunderbird 扩展来完成呢……
考虑ing……