2010-11-04 14 views
5

मैं फ़ायरफ़ॉक्स एक्सटेंशन पर काम कर रहा हूं और मैं जानना चाहता हूं कि कोई पृष्ठ xhr अनुरोध कब शुरू करता है, मैंने कुछ कोड देखे लेकिन वे बहुत बड़े थे, क्या यह हासिल करने के लिए कोई आसान नमूना है?जावास्क्रिप्ट के साथ xhr अनुरोधों को आसानी से कैसे सुनें?

मैं इस कोड का परीक्षण कर रहा हूँ:

function TracingListener() { 
    //this.receivedData = []; 
} 

TracingListener.prototype = 
{ 
    originalListener: null, 
    receivedData: null, // array for incoming data. 

    onDataAvailable: function(request, context, inputStream, offset, count) 
    { 
     var binaryInputStream = CCIN("@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream"); 
     var storageStream = CCIN("@mozilla.org/storagestream;1", "nsIStorageStream"); 
     binaryInputStream.setInputStream(inputStream); 
     storageStream.init(8192, count, null); 

     var binaryOutputStream = CCIN("@mozilla.org/binaryoutputstream;1", 
       "nsIBinaryOutputStream"); 

     binaryOutputStream.setOutputStream(storageStream.getOutputStream(0)); 

     // Copy received data as they come. 
     var data = binaryInputStream.readBytes(count); 
     //var data = inputStream.readBytes(count); 
     this.receivedData.push(data); 

     binaryOutputStream.writeBytes(data, count); 
     this.originalListener.onDataAvailable(request, context,storageStream.newInputStream(0), offset, count); 
    }, 

    onStartRequest: function(request, context) { 
     this.receivedData = []; 
     this.originalListener.onStartRequest(request, context); 
    }, 

    onStopRequest: function(request, context, statusCode) 
    { 
     try 
     { 
      request.QueryInterface(Ci.nsIHttpChannel); 

      if (request.originalURI && piratequesting.baseURL == request.originalURI.prePath && request.originalURI.path.indexOf("/index.php?ajax=") == 0) 
      { 

       var data = null; 
       if (request.requestMethod.toLowerCase() == "post") 
       { 
        var postText = this.readPostTextFromRequest(request, context); 
        if (postText) 
         data = ((String)(postText)).parseQuery(); 

       } 
       var date = Date.parse(request.getResponseHeader("Date")); 
       var responseSource = this.receivedData.join(''); 

       //fix leading spaces bug 
       responseSource = responseSource.replace(/^\s+(\S[\s\S]+)/, "$1"); 

       piratequesting.ProcessRawResponse(request.originalURI.spec, responseSource, date, data); 
      } 
     } 
     catch (e) 
     { 
      dumpError(e); 
     } 
     this.originalListener.onStopRequest(request, context, statusCode); 
    }, 

    QueryInterface: function (aIID) { 
     if (aIID.equals(Ci.nsIStreamListener) || 
      aIID.equals(Ci.nsISupports)) { 
      return this; 
     } 
     throw Components.results.NS_NOINTERFACE; 
    }, 
    readPostTextFromRequest : function(request, context) { 
     try 
     { 
      var is = request.QueryInterface(Ci.nsIUploadChannel).uploadStream; 
      if (is) 
      { 
       var ss = is.QueryInterface(Ci.nsISeekableStream); 
       var prevOffset; 
       if (ss) 
       { 
        prevOffset = ss.tell(); 
        ss.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); 
       } 

       // Read data from the stream.. 
       var charset = "UTF-8"; 
       var text = this.readFromStream(is, charset, true); 

       // Seek locks the file so, seek to the beginning only if necko hasn't read it yet, 
       // since necko doesn't seek to 0 before reading (at lest not till 459384 is fixed). 
       if (ss && prevOffset == 0) 
        ss.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); 

       return text; 
      } 
      else { 
       dump("Failed to Query Interface for upload stream.\n"); 
      } 
     } 
     catch(exc) 
     { 
      dumpError(exc); 
     } 

     return null; 
    }, 
    readFromStream : function(stream, charset, noClose) { 

     var sis = CCSV("@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream"); 
     sis.setInputStream(stream); 

     var segments = []; 
     for (var count = stream.available(); count; count = stream.available()) 
      segments.push(sis.readBytes(count)); 

     if (!noClose) 
      sis.close(); 

     var text = segments.join(""); 
     return text; 
    } 

} 


hRO = { 

    observe: function(request, aTopic, aData){ 
     try { 
      if (typeof Cc == "undefined") { 
       var Cc = Components.classes; 
      } 
      if (typeof Ci == "undefined") { 
       var Ci = Components.interfaces; 
      } 
      if (aTopic == "http-on-examine-response") { 
       request.QueryInterface(Ci.nsIHttpChannel); 

       //if (request.originalURI && piratequesting.baseURL == request.originalURI.prePath) { 
        // var newListener = new TracingListener(); 
        //request.QueryInterface(Ci.nsITraceableChannel); 
        //newListener.originalListener = request.setNewListener(newListener); 
       //} GOOGLE FAILS TO LOAD IF I UNCOMMENT THIS 
      } 
     } catch (e) { 
      dump("\nhRO error: \n\tMessage: " + e.message + "\n\tFile: " + e.fileName + " line: " + e.lineNumber + "\n"); 
     } 
    }, 

    QueryInterface: function(aIID){ 
     if (typeof Cc == "undefined") { 
      var Cc = Components.classes; 
     } 
     if (typeof Ci == "undefined") { 
      var Ci = Components.interfaces; 
     } 
     if (aIID.equals(Ci.nsIObserver) || 
     aIID.equals(Ci.nsISupports)) { 
      return this; 
     } 

     throw Components.results.NS_NOINTERFACE; 

    }, 
}; 


var observerService = Cc["@mozilla.org/observer-service;1"] 
    .getService(Ci.nsIObserverService); 

observerService.addObserver(hRO, 
    "http-on-examine-response", false); 

लेकिन में निरीक्षण जब newListener जोड़ने, अगर मैं गूगल की तरह वह हिस्सा साइटों uncomment (त्वरित खोज सुविधा के साथ) अभ्यस्त लोड बिल्कुल, मैं सक्षम होने के लिए चाहते हैं onStopRequest पर प्रतिक्रिया स्रोत पढ़ने के लिए, मैंने एक चेतावनी जोड़ने का प्रयास किया लेकिन यह कभी भी आग नहीं लगाता और यह गड़बड़ की तरह साइटें जैसे मैंने कहा कि यह Google तत्काल खोज के साथ होता है।

उत्तर

6

जावास्क्रिप्ट में, आप फ्लाई पर किसी भी फ़ंक्शन या ऑब्जेक्ट को फिर से परिभाषित कर सकते हैं। आपकी समस्या के लिए, आप इस तरह कुछ कोशिश कर सकते हैं:

var original_xhr = XMLHttpRequest; 
XMLHttpRequest = function() { 
    /* logic that notifies your plugin goes here */ 
    ... 
    original_xhr(); 
    alert ("I redefined this function"); 

आशा है कि मदद करता है।

-tjw

+0

यह Google लाइव खोज सुविधा के लिए अनुरोध नहीं पकड़ता है, क्या आप जानते हैं कि वे xhr से अलग कुछ उपयोग करते हैं? – gtilx

+2

हां, Google JSONP के समान कुछ उपयोग करता है, जो document.write() का उपयोग कर पृष्ठ में एक स्क्रिप्ट टैग एम्बेड करता है। तो Google के लिए, आप document.write() फ़ंक्शन को ओवरराइट कर देंगे। कुछ JSONP कार्यान्वयन दस्तावेज़.appendChild (script_tag) का उपयोग करते हैं। –

3

यहाँ ट्रैविस जम्मू वेब के समाधान की पूरी संस्करण है। बस इसे अपने जेएस या एचएमटीएल फ़ाइल के शीर्ष के पास रखें।

(function(){ 
    var original_xhr = XMLHttpRequest; 
    window.XMLHttpRequest = function() { 
     /* logic that notifies your plugin goes here */ 

     original_xhr.apply(this, Array.prototype.slice.call(arguments)); 
     alert ("I redefined this function"); 
    } 
}()); 
+0

यह Google लाइव खोज सुविधा के लिए अनुरोध नहीं पकड़ता है, क्या आप जानते हैं कि वे xhr से अलग कुछ उपयोग करते हैं? – gtilx

+0

मैंने फ़ायरफ़ॉक्स 3.6.3 और फ़ायरबग के साथ अद्यतन कोड चलाया और यह अनुरोध पकड़ा, लेकिन यह Google के कोड में जावास्क्रिप्ट त्रुटि भी प्रदर्शित करता है। यह सुस्त होना चाहिए कि सुधार के लिए कुछ जगह है। – Eric

संबंधित मुद्दे