SDK do add-on do Firefox obtendo o ID da guia

Estou tentando criar um complemento do Firefox usando o SDK (versão 1.6), mas estou enfrentando um problema com as guias que a extensão está abrindo.

Eu gostaria de obter a guia que oaContext (nó) está ativado. Para fazer isso, eu 'obtive' a janela do nó e depois usava os Tab Utils no SDK, especificamentegetTabForContentWindow(). Às vezes isso não funciona, a guia retornou degetTabForContentWindow() é nulo. Existe um método melhor e mais robusto para obter a guia de um nó?

Além disso, notei ema página Tab Utils, que afirma que é 'instável'. Devo evitar o uso do Tab Utils SDK?

Abaixo está o código do main.js:

const {Cc, Ci, Cr, Cu, Cm, components} = require("chrome");
const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm");
var winUtils = require('sdk/window/utils');
var tabUtils = require('sdk/tabs/utils');

let policy =
{
    classDescription: "my content policy",
    classID: components.ID("{2DA54ECA-FBDD-11E3-B3B1-695C1D5D46B0}"),
    contractID: "@www.com/policy;1",
    xpcom_categories: ["content-policy"],

    init: function()
    {
        let registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
        registrar.registerFactory(this.classID, this.classDescription, this.contractID, this);

        let catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
        for each (let category in this.xpcom_categories)
            catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true);
    },

    // nsIContentPolicy interface implementation
    shouldLoad: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra, aRequestPrincipal) {

        console.log("*****");
        console.log("aContentLocation.spec [" + aContentLocation.spec + "] ");
        console.log("aContentType [" + aContentType + "] ");
        if (aContext instanceof components.interfaces.nsIDOMNode) {            
            var node = aContext.QueryInterface(components.interfaces.nsIDOMNode);
            var win = getWindow(node);
            if (win) {
                console.log("window found" );
                var selectedTab = tabUtils.getTabForContentWindow(win);                
                if (selectedTab) {
                    console.log("tab found" );
                    var tabId = tabUtils.getTabId(selectedTab);
                    console.log("Node's tabId:" + tabId);
                } else {
                    console.log("tab undefined" );
                }
            } else {
                console.log("win undefined" );
            } 
        }
        return Ci.nsIContentPolicy.ACCEPT;

    },

    shouldProcess: function(contentType, contentLocation, requestOrigin, node, mimeTypeGuess, extra) {
        return Ci.nsIContentPolicy.ACCEPT;
    },

    // nsIFactory interface implementation
    createInstance: function(outer, iid) {
        if (outer)
            throw Cr.NS_ERROR_NO_AGGREGATION;
        return this.QueryInterface(iid);
    },

    // nsISupports interface implementation
    QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy, Ci.nsIFactory])
};

policy.init();

var scheduleCheckFilterUpdates = function() {
    var tabs = require("sdk/tabs");
    tabs.open("http://wikipedia.org");
}
require('sdk/timers').setTimeout(scheduleCheckFilterUpdates, 1000);

function getWindow(node) {
    if ("ownerDocument" in node && node.ownerDocument)
        node = node.ownerDocument;

    if ("defaultView" in node)
        return node.defaultView;

    return null;
}

questionAnswers(2)

yourAnswerToTheQuestion