forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			127 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
# This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
# License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
						|
 | 
						|
// A simple class that encapsulates a request. You'll notice the
 | 
						|
// style here is different from the rest of the extension; that's
 | 
						|
// because this was re-used from really old code we had. At some
 | 
						|
// point it might be nice to replace this with something better
 | 
						|
// (e.g., something that has explicit onerror handler, ability
 | 
						|
// to set headers, and so on).
 | 
						|
 | 
						|
/**
 | 
						|
 * Because we might be in a component, we can't just assume that
 | 
						|
 * XMLHttpRequest exists. So we use this tiny factory function to wrap the
 | 
						|
 * XPCOM version.
 | 
						|
 *
 | 
						|
 * @return XMLHttpRequest object
 | 
						|
 */
 | 
						|
this.PROT_NewXMLHttpRequest = function PROT_NewXMLHttpRequest() {
 | 
						|
  var Cc = Components.classes;
 | 
						|
  var Ci = Components.interfaces;
 | 
						|
  var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
 | 
						|
                .createInstance(Ci.nsIXMLHttpRequest);
 | 
						|
  // Need the following so we get onerror/load/progresschange
 | 
						|
  request.QueryInterface(Ci.nsIJSXMLHttpRequest);
 | 
						|
  return request;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * A helper class that does HTTP GETs and calls back a function with
 | 
						|
 * the content it receives. Asynchronous, so uses a closure for the
 | 
						|
 * callback.
 | 
						|
 *
 | 
						|
 * Note, that XMLFetcher is only used for SafeBrowsing, therefore
 | 
						|
 * we inherit from nsILoadContext, so we can use the callbacks on the
 | 
						|
 * channel to separate the safebrowsing cookie based on a reserved
 | 
						|
 * first-party domain.
 | 
						|
 * @constructor
 | 
						|
 */
 | 
						|
this.PROT_XMLFetcher = function PROT_XMLFetcher() {
 | 
						|
  this.debugZone = "xmlfetcher";
 | 
						|
  this._request = PROT_NewXMLHttpRequest();
 | 
						|
  // implements nsILoadContext
 | 
						|
  this.firstPartyDomain =
 | 
						|
    "safebrowsing.86868755-6b82-4842-b301-72671a0db32e.mozilla";
 | 
						|
  this.isInIsolatedMozBrowserElement = false;
 | 
						|
  this.usePrivateBrowsing = false;
 | 
						|
  this.isContent = false;
 | 
						|
}
 | 
						|
 | 
						|
PROT_XMLFetcher.prototype = {
 | 
						|
  /**
 | 
						|
   * Function that will be called back upon fetch completion.
 | 
						|
   */
 | 
						|
  _callback: null,
 | 
						|
 | 
						|
 | 
						|
  /**
 | 
						|
   * Fetches some content.
 | 
						|
   *
 | 
						|
   * @param page URL to fetch
 | 
						|
   * @param callback Function to call back when complete.
 | 
						|
   */
 | 
						|
  get: function(page, callback) {
 | 
						|
    this._request.abort();                // abort() is asynchronous, so
 | 
						|
    this._request = PROT_NewXMLHttpRequest();
 | 
						|
    this._callback = callback;
 | 
						|
    var asynchronous = true;
 | 
						|
    this._request.loadInfo.originAttributes = {
 | 
						|
      firstPartyDomain: this.firstPartyDomain,
 | 
						|
      inIsolatedMozBrowser: this.isInIsolatedMozBrowserElement
 | 
						|
    };
 | 
						|
    this._request.open("GET", page, asynchronous);
 | 
						|
    this._request.channel.notificationCallbacks = this;
 | 
						|
 | 
						|
    // Create a closure
 | 
						|
    var self = this;
 | 
						|
    this._request.addEventListener("readystatechange", function() {
 | 
						|
      self.readyStateChange(self);
 | 
						|
    });
 | 
						|
 | 
						|
    this._request.send(null);
 | 
						|
  },
 | 
						|
 | 
						|
  cancel: function() {
 | 
						|
    this._request.abort();
 | 
						|
    this._request = null;
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * Called periodically by the request to indicate some state change. 4
 | 
						|
   * means content has been received.
 | 
						|
   */
 | 
						|
  readyStateChange: function(fetcher) {
 | 
						|
    if (fetcher._request.readyState != 4)
 | 
						|
      return;
 | 
						|
 | 
						|
    // If the request fails, on trunk we get status set to
 | 
						|
    // NS_ERROR_NOT_AVAILABLE.  On 1.8.1 branch we get an exception
 | 
						|
    // forwarded from nsIHttpChannel::GetResponseStatus.  To be consistent
 | 
						|
    // between branch and trunk, we send back NS_ERROR_NOT_AVAILABLE for
 | 
						|
    // http failures.
 | 
						|
    var responseText = null;
 | 
						|
    var status = Components.results.NS_ERROR_NOT_AVAILABLE;
 | 
						|
    try {
 | 
						|
      G_Debug(this, "xml fetch status code: \"" +
 | 
						|
              fetcher._request.status + "\"");
 | 
						|
      status = fetcher._request.status;
 | 
						|
      responseText = fetcher._request.responseText;
 | 
						|
    } catch(e) {
 | 
						|
      G_Debug(this, "Caught exception trying to read xmlhttprequest " +
 | 
						|
              "status/response.");
 | 
						|
      G_Debug(this, e);
 | 
						|
    }
 | 
						|
    if (fetcher._callback)
 | 
						|
      fetcher._callback(responseText, status);
 | 
						|
  },
 | 
						|
 | 
						|
  // nsIInterfaceRequestor
 | 
						|
  getInterface: function(iid) {
 | 
						|
    return this.QueryInterface(iid);
 | 
						|
  },
 | 
						|
 | 
						|
  QueryInterface: XPCOMUtils.generateQI([Ci.nsIInterfaceRequestor,
 | 
						|
                                         Ci.nsISupports,
 | 
						|
                                         Ci.nsILoadContext])
 | 
						|
};
 |