最近遇到一个问题,手上有一个Chrome扩展,要移植到Firefox中。考察了一下发现Firefox新版本的扩展框架Jetpack跟Chrome扩展框架是比较相似的,于是着手移植。
但是Jetpack有一个非常怪异的现象。首先你的inject-script不光会在普通页面中执行,还会在iframe中执行,只要iframe的地址符合你之前设置的地址模式。而且,最怪异的是,用常规的判断是否iframe内部的方法,不管用,什么top===self,统统不管用。在网上查了半天,终于在StackOverflow中得到的答案,如下:
1 if (window.frames.length !== parent.frames.length) { 2 // 在iframe中 3 } else { 4 // 不在iframe中 5 }
我至今也没明白这里是一个Jetpack的bug,还是有什么特殊的原因,或者我对js理解有误。不过常规方法我都试过,确实无法分辨是否在iframe中。
PS:还是想吐槽一下Jetpack的易用性。简单看了帮助之后,我发现调试Jetpack扩展,唯一的办法似乎就是改代码->关掉firefox->运行“cfx run”->试用功能并查看output->改代码。。。这个过程极其考验人类的耐心和你发现问题的敏锐,我都快被折磨的不行了,注意,扩展的插入脚本,在firebugs里面是看不到的,没法调试。后来我尝试在firefox扩展的安装目录中找到我的脚本直接修改,发现firefox竟然把所有的Jetpack扩展都压缩到了一个xpi文件里,然后启动的时候,不知道释放到了什么地方。。。最后专门去StackOverflow问了一下,发现adblockplus的开发者为了解决这个问题,自己开发了一个扩展叫autoinstall。
这样的易用性,比起Chrome的开发环境,确实差太远了。直观地说就是,我用来移植的时间,比我从头开发这款扩展Chrome版的时间都长。