自己写的扩展,油猴功能,进一步改进,增加了许多操作。原来只是在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; };