firefox 自写扩展改版,总结

自己写的扩展,油猴功能,进一步改进,增加了许多操作。原来只是在13以下版本下面能用,主要是在13版本下面chrome代码和page下面代码能够直接互调,13版本以后就不可以了,最近考虑到新版Firefox的功能,进行了这次改进。

1.chrome代码和page代码互调

通过测试,发现function其实是可以调用的,只是chrome下生成的obj在window下面没办法引用其中的属性.

a.通过window postMessage的方式,基于消息的通信修改。初步功能实现,但是后来发现修改代码量太多,并且通信情况比较复杂,要处理相关回调,就想有没其他方法

b.在chrome中通过定义方法,一个代理方法,来提供page调用chrome代码。后来改进了几个版本,现在的样子就成了这样

var usejs = {
  require: function (str) {
    _action[str] = _action[str] || require(str);
    return _action[str];
  },
    get: function () {
        var obj = _shift(arguments);
        for (var i=0;i<arguments.length;i++) {
            obj = obj[arguments[i]];
        }
        return obj;
    },
    get2Str:  function () {
        return JSON.stringify(usejs.get.apply(usejs,arguments));
    },
    fnCall: function () {
        var obj = _shift(arguments);
        var atr = _shift(arguments);
        return obj[atr].apply(obj, arguments);
    }
}


var unsafeWindow = safeWindow.wrappedJSObject;
//注意new unsafeWindow.Object();,这样在page页面中就能遍历下个__usejs对象了
unsafeWindow.__usejs = new unsafeWindow.Object();
for (var key in usejs) {
    unsafeWindow.__usejs[key] = usejs[key];
}

2.问题2,调用的nsIXMLHttpRequest,对象进行的http请求在页面中,firebug没办法跟踪了,其实是很正常的现象,因为现在nsIXMLHttpRequest,是chrome级别调用的,的确是找不到了。

调试firebug代码,花费了不少的时间,并且也不能确定通过自己的修改,能不能实现跟踪功能。后来还是通过努力试下了。

实现方式是在发送nsIXMLHttpRequest的时候增加一个hear头,'wgu-outerWindowID':outerWindowID (火狐window唯一标识),

修改了 \content\firebug\lib\http.js,通过request查询win的时候加上了相关的分支

Http.getWindowForRequest = function(request)
{
    var loadContext = Http.getRequestLoadContext(request);
    try
    {
        if (loadContext) {
            return loadContext.associatedWindow;
        }
    }
    catch (ex)
    {
    }
    
   //下面是新增代码
    try {
        var outerWindowID = request.getRequestHeader('wgu-outerWindowID');
        if (!!outerWindowID) {
            var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
            var browserEnumerator = wm.getEnumerator("navigator:browser");
            while (browserEnumerator.hasMoreElements()) {
                var browserWin = browserEnumerator.getNext();
                var tabbrowser = browserWin.gBrowser;
                var numTabs = tabbrowser.browsers.length;
                for (var index = 0; index < numTabs; index++) {
                    var currentBrowser = tabbrowser.getBrowserAtIndex(index);
                    var windowUtils = currentBrowser.contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
                    if(windowUtils.outerWindowID==outerWindowID) {
                        return currentBrowser.contentWindow;
                    }
                }
            }
        }
    } catch (e) { }
    
    
    return null;
};

 

 

 

posted @ 2013-08-16 14:54  游云  阅读(505)  评论(0编辑  收藏  举报