Firefox中的窗口观察者
Window Observer in Firefox
我正在构建一个扩展,我想捕获窗口事件。我有这个代码:…………..
function MyWindowObserver() {
this.observe=function(aSubject, aTopic, aData) {
if(aSubject.innerWidth!=1536)
aSubject.close();
}
}
function myObserver(){}
myObserver.prototype = {
observe: function(subject, topic, data) {
},
register: function() {
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
observerService.addObserver(this, "http-on-modify-request", false);
},
unregister: function() {
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
observerService.removeObserver(this, "http-on-modify-request");
}
}
function installButton()
{
var id = "button_cs";
var toolbarId = "nav-bar";
var toolbar = document.getElementById(toolbarId);
//add the button at the end of the navigation toolbar
toolbar.insertItem(id, toolbar.lastChild);
toolbar.setAttribute("currentset", toolbar.currentSet);
document.persist(toolbar.id, "currentset");
//if the navigation toolbar is hidden,
//show it, so the user can see your button
toolbar.collapsed = false;
}
function firstRun(extensions) {
var extension = extensions.get("bak@asda.com");
if (extension.firstRun) {
installButton();
}
}
var myExtension={
Observers:null,
prefs:null,
clock:null,
prevwidth:null,
prevon:null,
BrosNumber:null,
init:function(){
if (Application.extensions)
firstRun(Application.extensions);
else
Application.getExtensions(firstRun);
this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService).getBranch("accessibility.");
this.Observers = new myObserver();
this.Observers.register();
}
};
myExtension.init();
window.addEventListener('load', function(win) {
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
observerService.addObserver(new MyWindowObserver(), "toplevel-window-ready", false);
},false);
我做错了什么?aSubject不是最后一个打开的窗口吗?
有什么想法吗?
这会监视http-on-modify-request
和toplevel-window-ready
。
观察者不是基于每个窗口的。您只需在全球范围内注册即可。
var{interfaces: Ci, utils: Cu} = Components;
Cu.import('resource://gre/modules/Services.jsm');
var observers = {
httpModReq: {
observe: function (aSubject, aTopic, aData) {
console.log('incoming observe httpModReq - aSubject: "' + aSubject + '" | aTopic: "' + aTopic + '" | aData: "' + aData + '"');
var httpChannel, requestURL;
httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
requestURL = httpChannel.URI.spec;
if (requestURL.indexOf('google.com') > -1) {
//they are loading google
//httpChannel.setRequestHeader('MyCustomRequestHeader', 'hiiii', false);
/*
try {
var Host = httpChannel.getRequestHeader('Host');
} catch (ex) {
//if doesnt have Host header it throws exception "NS_ERROR_NOT_AVAILABLE"
var Host = 'NULL';
}
console.log('REQUEST Header "Host" = ' + Host);
*/
}
},
register: function () {
Services.obs.addObserver(observer.httpModReq, 'http-on-modify-request', false);
},
unregister: function () {
Services.obs.removeObserver(observer.httpModReq, 'http-on-modify-request');
}
},
topWinRdy: {
observe: function (aSubject, aTopic, aData) {
console.log('incoming observe topWinRdy - aSubject: "' + aSubject + '" | aTopic: "' + aTopic + '" | aData: "' + aData + '"');
},
register: function () {
Services.obs.addObserver(observer.topWinRdy, 'toplevel-window-ready', false);
},
unregister: function () {
Services.obs.removeObserver(observer.topWinRdy, 'toplevel-window-ready');
}
}
};
//run this block to start observing
for (var o in observers) {
observers[o].register();
}
/*//run this block when you want to remove the observers
for (var o in observers) {
observers[o].unregister();
}
*/
您可以将其复制粘贴到草稿行中,并在环境设置为浏览器的情况下运行它。它会很好用的。
只是修复@Notidart代码
const { interfaces: Ci, utils: Cu } = Components;
Cu.import('resource://gre/modules/Services.jsm');
var observers = {
httpModReq: {
observe: function (aSubject, aTopic, aData) {
console.log('incoming observe httpModReq - aSubject: "' + aSubject + '" | aTopic: "' + aTopic + '" | aData: "' + aData + '"');
var httpChannel, requestURL;
httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
requestURL = httpChannel.URI.spec;
console.log('requestURL', requestURL)
},
register: function () {
Services.obs.addObserver(this, 'http-on-modify-request', false);
},
unregister: function () {
Services.obs.removeObserver(this, 'http-on-modify-request');
}
},
topWinRdy: {
observe: function (aSubject, aTopic, aData) {
console.log('incoming observe topWinRdy - aSubject: "' + aSubject + '" | aTopic: "' + aTopic + '" | aData: "' + aData + '"');
},
register: function () {
Services.obs.addObserver(this, 'toplevel-window-ready', false);
},
unregister: function () {
Services.obs.removeObserver(this, 'toplevel-window-ready');
}
}
};
//run this block to start observing
for (var o in observers) {
observers[o].register();
}
示例输出
incoming observe httpModReq - aSubject: "[xpconnect wrapped nsIRequest]" | aTopic: "http-on-modify-request" | aData: "null" userChrome.js:14:21
requestURL https://www.youtube.com/ userChrome.js:19:21
incoming observe httpModReq - aSubject: "[xpconnect wrapped (nsIRequest, nsIHttpChannel)]" | aTopic: "http-on-modify-request" | aData: "null" userChrome.js:14:21
requestURL https://www.youtube.com/ userChrome.js:19:21
incoming observe httpModReq - aSubject: "[xpconnect wrapped nsISupports]" | aTopic: "http-on-modify-request" | aData: "null" userChrome.js:14:21
requestURL http://ocsp.pki.goog/gts1c3 userChrome.js:19:21
incoming observe httpModReq - aSubject: "[xpconnect wrapped nsIHttpChannel]" | aTopic: "http-on-modify-request" | aData: "null" userChrome.js:14:21
requestURL http://ocsp.pki.goog/gts1c3 userChrome.js:19:21
incoming observe httpModReq - aSubject: "[xpconnect wrapped nsISupports]" | aTopic: "http-on-modify-request" | aData: "null" userChrome.js:14:21
requestURL http://ocsp.pki.goog/gts1c3 userChrome.js:19:21
incoming observe httpModReq - aSubject: "[xpconnect wrapped nsIHttpChannel]" | aTopic: "http-on-modify-request" | aData: "null" userChrome.js:14:21
requestURL http://ocsp.pki.goog/gts1c3 userChrome.js:19:21
incoming observe httpModReq - aSubject: "[xpconnect wrapped nsIRequest]" | aTopic: "http-on-modify-request" | aData: "null"
相关文章:
- 未激发路由的控制器属性上的观察者
- 将属性设置为未定义时未通知观察者
- 检测 DIV 的高度何时变化,而无需轮询或突变观察者
- JavaScript:为什么Addy's观察者模式
- 设置多个观察程序以触发动态事件的角度替代解决方案 - 优化的观察者模式
- 被动.js模式间接观察者报告相同的值
- 将$scope对象作为参数提供给$digest中的观察者背后的逻辑
- 取代了棱角分明的深度观察者
- 突变观察者尚未定义
- 突变观察者未能检测到元素's删除dom
- 手动调整元素大小;不要在Chrome中激发突变观察者
- 共同描述编译器和观察者
- 如何确保对观察者的订阅调用最初接收到最新的值
- 未捕获的类型错误:无法执行'观察'在'突变观察者':参数1不是'节点'
- 在jQuery数据表中使用AngularJS观察者的方法是什么
- nodejs:原子文件替换操作,只触发一次一些观察者
- 阵列突变而不触发特定的观察者
- 如何将位置从窗口手机7的观察者转换为谷歌地图的位置
- Firefox中的窗口观察者
- 如何触发观察者通知,并将侦听器放在另一个XUL窗口上