Как отфильтровать асинхронные запросы в ProgressListener? - PullRequest
2 голосов
/ 02 октября 2009

Я использую progresslistener для мониторинга действий пользователя на веб-страницах, когда пользователь нажимает на ссылку, я пытаюсь проверить, перенаправит ли этот запрос пользователя на новое место или это только Ajax WebHttpRequest (он не будет перезагружен перенаправить страницу). вот код, который я использую:

ProgressListener.prototype = {
    QueryInterface: function(aIID)
    {
        if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
            aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
            aIID.equals(Components.interfaces.nsISupports)  ) {
            return this;
        }
        throw Components.results.NS_NOINTERFACE;
    },

    onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) {
        if (!aRequest) return 0;
        if (aFlag & STATE_IS_NETWORK) {
            if (aFlag & STATE_START &&
                aFlag & STATE_IS_REQUEST &&
                aFlag & STATE_IS_DOCUMENT) {

                OnLoadInitiated(aWebProgress, aRequest, this.mBrowser);

            } else if (aFlag & STATE_STOP &&
                       aFlag & STATE_IS_WINDOW &&
                       aStatus == 0) {
                OnLoadComplete(aWebProgress, aRequest, this.mBrowser);
            }
        }
        return 0;
    },

    onLocationChange: function(aProgress, aRequest, aURI)
    {
        OnLocationChange(aProgress, aRequest, aURI, this.mBrowser);
        return 0;
    },

    onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) { return 0;},
    onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { return 0;},
    onSecurityChange: function(aWebProgress, aRequest, aState) { return 0;}
}

function ProgressListener(aBrowser) {
    this.mBrowser = aBrowser;
}

function OnTabOpen(event) {
    var doc = event.target.linkedBrowser.contentDocument;
    var win = doc.defaultView;

    var gsToolbar = new GSToolbar();
    gsToolbar.LoadCount = 0;
    gsToolbar.JustOpenedTab = true;

    var browser = event.target.linkedBrowser;
    browser.GSToolbar = gsToolbar;

    var pListener = new ProgressListener(browser);
    browser.ProgressListener = pListener;

    browser.addProgressListener(pListener, NOTIFY_STATE_DOCUMENT);
}

function OnTabMove(event) {
    var browser = event.target.linkedBrowser;
}

function OnTabClose(event) {
    var browser = event.target.linkedBrowser;

    browser.removeProgressListener(browser.ProgressListener);
}

function OnTabSelect(event) {
    var browser = event.target.linkedBrowser;

    var gsToolbar = gBrowser.getBrowserForDocument(gBrowser.selectedBrowser.contentDocument).GSToolbar;

}

function InitialWindow() {
    var num = gBrowser.browsers.length;

    if (num == 1) {
        var gsToolbar = new GSToolbar();
        gsToolbar.LoadCount = 0;
        gsToolbar.JustOpenedTab = true;

        var browser = gBrowser.getBrowserAtIndex(0);
        browser.GSToolbar = gsToolbar;

        var pListener = new ProgressListener(browser);
        browser.ProgressListener = pListener;

        browser.addProgressListener(pListener, NOTIFY_STATE_DOCUMENT);
    }

    var container = gBrowser.tabContainer;
    container.addEventListener("TabOpen", OnTabOpen, false);
    container.addEventListener("TabMove", OnTabMove, false);
    container.addEventListener("TabClose", OnTabClose, false);
    container.addEventListener("TabSelect", OnTabSelect, true);
}

function UnloadWindow() {

    var num = gBrowser.browsers.length;

    if (num == 1) {
        var browser = gBrowser.getBrowserAtIndex(0);
        browser.removeProgressListener(browser.GSProgressListener);
    }

    var container = gBrowser.tabContainer;
    container.removeEventListener("TabOpen", OnTabOpen, false);
    container.removeEventListener("TabMove", OnTabMove, false);
    container.removeEventListener("TabClose", OnTabClose, false);
    container.removeEventListener("TabSelect", OnTabSelect, false);

}

window.addEventListener("load", function(e){ InitialWindow();}, false);
window.addEventListener("unload", function(e){ UnloadWindow();}, false);

Есть ли какой-либо флаг, который я должен проверить для onStateChange и onLocationChange? Спасибо.

Я прочитал документ, но попытался сузить условие до aFlag & STATE_START && aFlag & STATE_IS_REQUEST && aFlag & STATE_IS_DOCUMENT && aFlag & STATE_IS_WINDOW

но все равно не удалось отфильтровать асинхронные запросы. Моя цель - убедиться, что моя панель инструментов работает только с синхронным запросом (который приводит к перезагрузке или перенаправлению всей страницы) и пропустить любые асинхронные вызовы, такие как запросы Ajax.

Кажется, мне нужно добавить какое-то условие к событиям onStateChange и onLocationChange, но я пробовал сочетания этих флагов, но пока ни один из них не достиг цели.

Какой лучший способ справиться с этим?

Большое спасибо за помощь.

1 Ответ

3 голосов
/ 03 октября 2009

ОК, я получил ответ из другого места.

Сравните DOMwindow.top.location.href и aURI.spec в onLocationChange, если они совпадают, это синхронный вызов, в противном случае асинхронный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...