临时解决Firefox扩展autoproxy的“可代理资源列表”不能用的问题

在天朝,用Firefox又翻墙的基本上都知道autoproxy(“福”)这么一个神器,用它配合各种翻墙软件(比如说GoAgent),可以做到对于国内的网站直连,对于需翻墙的网页用代理,效率很高。

更方便的是它是根据URL的规则来代理,所以一个网页里的其它资源(比如JPG,js,css等)都可以通过这个规则来决定是否被代理,效率更高。

不过这也带来一个问题,如果把一个被墙的网站加入代理列表,然后打开这个网站,这个时候往往出现这种情况:浏览器能打开一部分网页(比如header)但是接下来就不停地loading中,打不开完整的网页,比如stackoverflow,在load的过程中会调用 https://cdn.sstatic.net/Js/full-anon.en.js,这个被墙了,于是整个stackoverflow还是几乎打不开。
autoproxy issue on 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;
}

再测试,居然就好了!
autoproxy issue fixed on stackoverflow

为了能用这个功能,临时就改成这样吧,可能会有crash或者memory leak,但是至少目前work正常,呵呵。有空的时候再研究到底怎么回事。

p.s. 如果有懂FF的extension的童鞋,请告知原因或者直接fix~
p.p.s. 在github上Fork了一份,建了个branch issue_proxyableitems在上面改了。生成的xpi放在了这儿,对此功能有无比需求的童鞋可以直接下载了用 🙂

Share
  • guest

    autoproxy似乎确实有不少小bug了,长久不更新就这样了,不知是否有空闲点的大大能够fork一份,发布到firefox市场就最好了。

  • 十万嬉皮

    博主好,我用了你的修改版,可代理资源列表可以正常列出web内的所有元素的,但是在任意元素上点击右键的菜单里面并没有可以快速添加规则的功能。我记得以前的autoproxy是有这个功能的,请问博主这个是我的个例么?