views:

341

answers:

1

I am using progresslistener to monitor user actions on web pages, when user click a link, I am trying to check if this request will redirect user to the new location or it is an Ajax WebHttpRequest only (It won't reload or redirect the 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? Thanks.

I did read the document, but I tried to narrow down the condition to aFlag & STATE_START && aFlag & STATE_IS_REQUEST && aFlag & STATE_IS_DOCUMENT && aFlag & STATE_IS_WINDOW

but still could not filter out the asynchronous requests. my goal is to make sure my toolbar only deal with the synchronous request (which cause the whole page reloaded or redirected) and by pass any asynchronous calls like Ajax requests.

It seems like I have to add some condition to onStateChange and onLocationChange event, but I tried may combinations of those flags, so far none of them achieve the goal.

What is the best way to handle that?

Thanks a lot for the help.

+2  A: 

OK, I got answer from other place.

Compare DOMwindow.top.location.href and aURI.spec in onLocationChange, if those are same, it is synchronous call, otherwise asynchronous.