Monday, November 9, 2009

解决Jetpack 0.5以上版本在Shiretoko中出错的问题

2009.10.11, 22:56更新:
经过测试, 发现Shiretoko中Jetpack的某些错误也存在于Firefox 3.5中, 看来这回又是Jetpack的问题了.

2009.10.9, 22:00更新:
经过实际测试之后发现用下面的方法还是不能完全修正Jetpack的错误, 比如jQuery的部分API可能失效, 暂时不推荐在Shiretoko中使用Jetpack 0.5及以上版本.

恐怕很多人还没听过Shiretoko, 一般不用Linux的话是不会察觉到Firefox其实还有一个名字. Shiretoko是Firefox的开发代号, 除了logo少了那只趴在地球上的狐狸外, 其它和Firefox没有差别. 我第一次遇见是在使用Arch的时候, 当时使用源安装的Firefox, 结果打开却叫做Shiretoko, 还以为安错了. 然后我现在使用的Ubuntu 9.04源里的Firefox 3.5也是叫做Shiretoko, 这其实没什么, 只是名字不同而已, 本质都是一样的, 可没想到这会影响Jetpack的使用.

以前我写过一篇叫做[SNS All in One在Jetpack 0.5中失效]的文章, 原因是在Jetpack 0.5中侧边栏无缘无故地消失了, 并且"about:jetpack"页面也有显示错误和链接点击错误, 如下图:
Jetpack Error
开始还以为是Mozilla官方在更新的时候出错了, 因为Jetpack 0.4都是好的. 前天Jetpack 0.6出来了, 当我更新完毕后发现错误依旧, 就开始怀疑是否仅仅是我这里有问题. 打开"Error Console", 一一排查起来.

进入"about:jetpack"页面的第一个错误是"XULApp is not defined", 指向了"file:///home/xiaogaozi/.mozilla/firefox-3.5/cavgighj.dev/extensions/jetpack@labs.mozilla.com/modules/xulapp.js Line: 127", 打开"xulapp.js", 简单分析了下代码, 发现如下的条件语句:
if (Application.name == "Firefox")
{
    XULApp = { ... };
}
else if (Application.name == "Thunderbird")
{
    XULApp = { ... };
}
看来是先判断了程序的类型后再给"XULApp"赋的值, 怪不得在我这里会出错, 因为我的是Shiretoko, 囧. 模仿前面的代码, 再写一个"else"分支, 把在"Firefox"分支中的语句都放到里面:
if (Application.name == "Firefox")
{
    /*
     * Firefox分支
     */
    XULApp = { ... };
}
else if (Application.name == "Thunderbird")
{
    XULApp = { ... };
}
else
{
    /*
     * 这里的代码与'Firefox分支'相同.
     */
    XULApp = { ... };
}
重启浏览器就一切正常了, 也终于可以享受Jetpack 0.6带来的新功能了.

P.S. 前天在发布Jetpack 0.6的同时, Mozilla也正式公布了Jetpack扩展的官方网站: Jetpack Gallery, 终于有了归属地了, 过几天会发布新的SNS All in One, 到时候也会转过去.

No comments:

Post a Comment