How do I filter asynchronous requests in a ProgressListener?
I am using a progresslistener to track user actions on web pages, when the user clicks a link, I am trying to check if this request will redirect the user to a new location or is it just an Ajax WebHttpRequest (it does not reload or reload the redirect page). here is the code i am using:
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);
Is there any flag I should check for onStateChange and onLocationChange? Thank.
I read the doc but I tried to narrow down the condition to aFlag and STATE_START && aFlag and STATE_IS_REQUEST && aFlag and STATE_IS_DOCUMENT && aFlag and STATE_IS_WINDOW
but still failed to filter asynchronous requests. my goal is to make sure my dashboard only works with a synchronous request (which triggers an overload or redirect of the entire page) and by passing any asynchronous calls like Ajax requests.
It looks like I need to add some kind of condition to the onStateChange and onLocationChange event, but I tried using combinations of these flags until none of them hit the target.
What's the best way to handle this?
Many thanks for the help.
source to share