I am trying to monitor AJAX requests (requests send using XMLHttpRequest 
object). I am trying to use observer service 
(Components.interfaces.nsIObserverService) for the same and observing events 
"http-on-examine-response" and "http-on-modify-request". I get hold of 
nsIChannel (actually nsIHttpChannel) on which the requests are being sent. 
>From the channel I am trying to get hold of XMLHttpRequest object which sent 
the request. Code in nsXMLHttpRequest.cpp 
(http://lxr.mozilla.org/mozilla/source/extensions/xmlextras/base/src/nsXMLHttpRequest.cpp)
 
suggests that XMLHttpRequest object itself is set as 'notificationCallbacks' 
property for the channel. I am getting the following exception when I try to 
access 'notificationCallbacks' property of the channel (I have given code 
snippet at the end).

[Exception... "Component does not have requested interface arg 0 
[nsIHttpChannel.notificationCallbacks]"  nsresult: "0x80004002 
(NS_NOINTERFACE)"  location: "JS frame :: 
file:///C:/rnd/mozilla/observertest.js :: handler_observe :: line 137" 
data: no]



I tried printing the list of properties of 'channel' and it does list 
'notificationCallbacks', also 
channel.hasOwnProperty("notificationCallbacks") returns true. I am wondering 
why mozilla throws the exception on accessing the property. Also is there 
any other alternative to get hold of XMLHttpRequest from with in 
"http-on-modify-request" callback? I would like to get hold of the 
XMLHttpRequest object (which implements nsIDOMEventTarget) and use 
addEventListener to add listeners to monitor activities on the request.





Code snippet:



handler.prototype.observe =

  function handler_observe (channel, topic, data)

{

  switch (topic)

  {

    case "http-on-examine-response":

      if (channel instanceof Components.interfaces.nsIHttpChannel)

      {

        try

        {

           var ir = channel.notificationCallbacks;

        }

        catch (ex)

        {

          log(ex);

        }

      }

      else

      {

         log("Subject is not instance of nsIHttpChannel");

      }

      break;



    case "http-on-modify-request":

      if (channel instanceof Components.interfaces.nsIHttpChannel)

      {

        try

        {

           var ir = channel.notificationCallbacks;

        }

        catch (ex)

        {

          log(ex);

       }

      }

      else

      {

        log("Subject is not instance of nsIHttpChannel");

      }

      break;

  }

}



-- Ajit Dhumale


_______________________________________________
Mozilla-netlib mailing list
Mozilla-netlib@mozilla.org
http://mail.mozilla.org/listinfo/mozilla-netlib

Reply via email to