在天朝,用Firefox又翻墙的基本上都知道autoproxy(“福”)这么一个神器,用它配合各种翻墙软件(比如说GoAgent),可以做到对于国内的网站直连,对于需翻墙的网页用代理,效率很高。
更方便的是它是根据URL的规则来代理,所以一个网页里的其它资源(比如JPG,js,css等)都可以通过这个规则来决定是否被代理,效率更高。
不过这也带来一个问题,如果把一个被墙的网站加入代理列表,然后打开这个网站,这个时候往往出现这种情况:浏览器能打开一部分网页(比如header)但是接下来就不停地loading中,打不开完整的网页,比如stackoverflow,在load的过程中会调用 https://cdn.sstatic.net/Js/full-anon.en.js,这个被墙了,于是整个stackoverflow还是几乎打不开。
于是autoproxy提供了一个“可代理资源列表” (Proxyable items),网页里的所有元素都可以设置是否使用代理(当然也是根据URL)。很实用的功能。
然而不知道从哪个版本的Firefox开始这个功能就坏了,打开来永远显示”No proxyable items”。如上图。
在忍了一段时间之后,决定自己看一下。
以前从来没搞过FF的扩展,只能试着看看了。
1) 从github上clone了一份源码,“编译”(其实是打包),生成了xpi;
2) 用 `firefox -ProfileManager` 启动FF,新建一个debug的profile(以防影响平时的使用),添加扩展,然后打开console log;
3) 发现在request.js的184行出了null exception:
getAllLocations: function(results, hadOutdated) { let now = Date.now(); // Accessing wnd.frames will flush outstanding content policy requests in Gecko 1.9.0/1.9.1. // Access it now to make sure we return the correct result even if more nodes are added here. let wnd = getReferencee(this.window); let frames = wnd.frames; ... }
很明显是getReferencee()返回了null导致的。再看这个函数
function getReferencee(/**nsIWeakReference*/ weakRef) /**nsISupports*/ { try { return weakRef.QueryReferent(Ci.nsISupports); } catch (e) { return null; } }
没太看明白,但估计是FF升级到某个版本之后就不能用这样的函数了。
尝试野蛮一点,让它直接return 原来的object:
function getReferencee(/**nsIWeakReference*/ weakRef) /**nsISupports*/ { return weakRef; }
为了能用这个功能,临时就改成这样吧,可能会有crash或者memory leak,但是至少目前work正常,呵呵。有空的时候再研究到底怎么回事。
p.s. 如果有懂FF的extension的童鞋,请告知原因或者直接fix~
p.p.s. 在github上Fork了一份,建了个branch issue_proxyableitems在上面改了。生成的xpi放在了这儿,对此功能有无比需求的童鞋可以直接下载了用 🙂