使用Firefox Jetpack SDK开发Firefox扩展时,判断脚本是否在iframe中的方法

最近遇到一个问题,手上有一个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版的时间都长。

原文地址:https://www.cnblogs.com/legendlee/p/2496653.html