4

我有一个 Firefox 扩展需要检查 onUnload 事件。基本上,当用户禁用扩展程序时,我想向我的服务器发送一条消息。

我尝试做的是向我的一个内容脚本发送一条消息,然后该脚本将调用 XMLHttpRequest。这对于扩展触发的任何其他事件都很好,但看起来内容脚本在消息甚至可以通过之前就被卸载了。

main.js

以下是 main.js 脚本中的代码:

exports.onUnload = function(reason) {
    //unloadWorker comes from a PageMod 'onAttach: function(worker){}'
    //That is called every time a page loads, so it will a recent worker.
    if(unloadWorker != null) { 
        unloadWorker.port.emit("sendOnUnloadEvent", settings, reason);
    }
};

内容脚本

这是我附加到每个加载的页面的内容脚本中的代码。

self.port.on("sendOnUnloadEvent", function(settings, reason) {
    console.log("sending on unload event to servers");
    settings.subid = reason;
    if(reason != "shutdown") {
        sendEvent(("on_unload"), settings);
    }
});

发送事件代码

最后,这里是发送事件代码,仅供参考我最初计划如何使用 XMLHttpRequest:

sendEvent = function(eventName, settings) {

    if (!eventName) {
        eventName = "ping"; 
    }
    //Not the actual URL, but you get the idea.
    var url = 'http://example.com/sendData/?variables=value&var2=value2'

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {

    }

    xhr.open("GET", url, true);
    xhr.send();
}

无论如何使用 main.js 中的 XMLHttpRequest 吗?

或者可能是一种触发 onUnload 事件的方法,但在扩展实际卸载之前触发它?(就像 beforeOnUnload 类型的事件)

4

3 回答 3

7

从 main.js 发出网络请求的首选方法是使用Requestmodule 中的对象sdk/request

但是,Request只能进行异步请求,这意味着函数结束时对象将超出范围,并且不会发生请求。

相反,您可以像这样在卸载sdk/net/xhr时使用XMLHttpRequest并发出同步 GET 请求:

const {XMLHttpRequest} = require("sdk/net/xhr");
exports.onUnload = function(reason) {
    var url = 'http://mysite.com/sendData/?variables=value&var2=value2'
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, false);
    xhr.send(null);
});

但请注意,sdk/net/xhr标记为不稳定且同步请求被阻塞且不受欢迎。

于 2013-11-06T18:16:04.057 回答
1
function reqListener () {
  console.log(this.responseText);
}

const {XMLHttpRequest} = require("sdk/net/xhr");
var url = "http://ya.ru";
var xhr = new XMLHttpRequest();
xhr.onload = reqListener;
xhr.open('GET', url, false);
xhr.send(null);
于 2014-02-17T22:13:22.157 回答
1

我的解决方案与 user2958125 的略有不同,所以我将在下面发布。

const {Cc, Ci} = require("chrome");
var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
//var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);

xhr.onreadystatechange = function() {

}

xhr.open("GET", url, true);
xhr.send();
于 2013-11-06T18:37:41.320 回答