0

序章

特定の HTTP リクエストを傍受し、ユーザーに通知してこれらのリクエストをキャンセルしようとしています。

更新: 再現可能なコード

const {Cc, Ci, Cr} = require("chrome");
const self = require("sdk/self");
const data = self.data;
const notif = require("notifications");

const REGEX = {
    'lookup.bluecava.com': "1",
    'ds.bluecava.com/v50/AC/BCAC': "2"
};
// ------------------------------------------------------------------

// Initialize observer service
var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);

function TracingListener() {
    this.originalListener = null;
}


// Request observer
var httpRequestObserver = {
    observe: function (aSubject, aTopic, aData) {
        var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
        if ("http-on-modify-request" == aTopic) {
            var url = httpChannel.originalURI.spec;            
            for (var str_re in REGEX) {
                var re = new RegExp(str_re, "g");
                if (url.match(re)) {
                    console.log("Requested URL: " + url.match(re));            
                    notif.notify({
                        title: "foo",
                        text: "foo"
                    });
                    aSubject.cancel(Cr.NS_BINDING_ABORTED); // Cancel request TODO: fix if uncommented notification won't pop up!
                }
            }            
        }
    },
    QueryInterface: function (aIID) {
        if (aIID.equals(Ci.nsIObserver) || aIID.equals(Ci.nsISupports)) {
            return this;
        }

        throw Cr.NS_NOINTERFACE;
    }
};

// Register service
observerService.addObserver(httpRequestObserver,
    "http-on-modify-request", false);

exports.main = function () {
    console.log("Addon is running...");
};

// Unload addon event
exports.onUnload = function (reason) {
    // Unregister service
    observerService.removeObserver(httpRequestObserver,
        "http-on-modify-request");
};

問題

問題は、cancelメソッドとメソッドの呼び出しの順序に関係なくnotify、通知がポップアップしないことです。

考えられる原因

javascript の非同期性と関係があり、メソッド cancel が通知呼び出しを何らかの形でブロックしていると思います。ただし、呼び出しをチェーンするために使用できる通知にもキャンセル メソッドにもコールバックが見つかりません。何か案が?

4

0 に答える 0