不要将其放在内容脚本中:我不确定如何识别脚本的内容窗口。我不太了解SDK。但是看面积
CONTENT_WINDOW_OF_CONTENT_script
const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components;Cu.import('resource://gre/modules/Services.jsm');Cu.import('resource://gre/modules/devtools/Console.jsm');var observers = { 'http-on-modify-request': { observe: function (aSubject, aTopic, aData) { console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData); var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel); var requestUrl = httpChannel.URI.spec var goodies = loadContextAndGoodies(aSubject, true); if (goodies.contentWindow) { if (goodies.contentWindow == CONTENT_WINDOW_OF_CONTENT_script) { //do something here } } }, reg: function () { Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false); }, unreg: function () { Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request'); } }};然后在相同的范围内添加此辅助函数:
function loadContextAndGoodies(request, return_goodies) { var loadContext = null; if (request instanceof Ci.nsIRequest) { try { if (request.loadGroup && request.loadGroup.notificationCallbacks) { loadContext = request.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext); } } catch (ex) { console.exception('request loadGroup with notificationCallbacks but oculd not get nsIloadContext', ex); } if (!loadContext) { try { if (request.notificationCallbacks) { loadContext = request.notificationCallbacks.getInterface(Ci.nsILoadContext); } } catch (ex) { console.exception('request has notificationCallbacks but could not get nsILoadContext', ex); try { var interfaceRequestor = httpChannel.notificationCallbacks.QueryInterface(Ci.nsIInterfaceRequestor); loadContext = interfaceRequestor.getInterface(Ci.nsILoadContext); } catch (ex) { console.exception('backup method failed:' ex); } } } } else { console.warn('request argument is not instance of nsIRequest') } if (return_goodies) { if (!loadContext) { return null; } var contentWindow = loadContext.associatedWindow; var DOMWindow = contentWindow.top.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIWebNavigation) .QueryInterface(Ci.nsIDocShellTreeItem) .rootTreeItem .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindow); var gBrowser = DOMWindow.gBrowser; if (gBrowser) { var tab = gBrowser._getTabForContentWindow(contentWindow.top); var browser = tab.linkedBrowser; } else { var tab, browser = null; } var goodies = { loadContext: loadContext, DOMWindow: DOMWindow, gBrowser: gBrowser, contentWindow: contentWindow, browser: browser, tab: tab }; return goodies; } else { return loadContext; }}开始观察
要开始观察所有请求,请执行此操作(例如,在启动插件时)
for (var o in observers) { observers[o].reg();}停止观察
停止观察很重要(确保至少在插件关闭时运行此命令,由于内存原因,您不想让观察者注册)
for (var o in observers) { observers[o].unreg();}


