zoukankan      html  css  js  c++  java
  • 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唯一标识),

    修改了 contentfirebuglibhttp.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;
    };
  • 相关阅读:
    使用Go语言两三事
    Ubuntu安装和配置redis
    samba 问题Windows能看到文件夹但是不能打开
    centos---无线上网的电脑所安装的虚拟机网络设置
    centos克隆,网卡启动失败
    redis安装及基础操作(1)
    hadoop2.6---windows下开发环境搭建
    hadoop2.6---常用命令
    虚拟机centos6.5 --hadoop2.6集群环境搭建
    虚拟机centos6.5 --开放端口
  • 原文地址:https://www.cnblogs.com/legu/p/3262135.html
Copyright © 2011-2022 走看看