view ambnews/content/ambnews.js @ 10:f07bf657f483

Display of Vanilla forum threads is better now; fixed some display bugs; updated TODOs; documented more code.
author Atul Varma <varmaa@toolness.com>
date Fri, 22 Aug 2008 10:02:50 -0700
parents 8cafc4c42c29
children f259d52d361e
line wrap: on
line source

var AmbNews = {
  url: function url(spec) {
    if (typeof(spec) != "string")
      // Assume that a URI object was passed in, so just return it back.
      return spec;
    var classObj = Components.classes["@mozilla.org/network/io-service;1"];
    var ios = classObj.getService(Components.interfaces.nsIIOService);
    return ios.newURI(spec, null, null);
  },
  getFeed: function AmbNews_getFeed(url, callback) {
    function onXml(text) {
      var feed = null;
      if (text) {
        var resultListener = {
          handleResult: function resultListener_handleResult(aResult) {
            var nsIFeed = aResult.doc;
            if (!nsIFeed)
              return;
            feed = {};
            var Ci = Components.interfaces;
            nsIFeed.QueryInterface(Ci.nsIFeed);
            feed.link = nsIFeed.link;
            feed.title = nsIFeed.title;
            feed.entries = [];
            for (var i = 0; i < nsIFeed.items.length; i++) {
              var item = nsIFeed.items.queryElementAt(i, Ci.nsIFeedEntry);
              feed.entries.push(item);
            }
          }
        };
        var fp = AmbNews.__getFeedProcessor();
        fp.listener = resultListener;
        fp.parseFromString(text, AmbNews.url(url));
      }
      callback(feed);
    }
    AmbNews.__getXml(url, onXml);
  },
  __getXml: function AmbNews_getXml(url, callback) {
    var feedUrl = AmbNews.url(url);
    var annSvc = AmbNews.__getAnnSvc();

    if (annSvc.pageHasAnnotation(feedUrl, "ambnews/feed-xml")) {
      var xml = annSvc.getPageAnnotation(feedUrl, "ambnews/feed-xml");
      // TODO: Perhaps re-enable this, but only let it live for a
      // few minutes?
      //callback(xml);
      //return;
    }

    var request = new XMLHttpRequest();
    request.open("GET", url, true);

    var onRscFunc = function getXml_onReadyStateChange() {
      if (request.readyState == 4) {
        if (request.status == 200) {
          if (request.responseText) {
            annSvc.setPageAnnotation(feedUrl,
                                     "ambnews/feed-xml",
                                     request.responseText,
                                     0,
                                     annSvc.EXPIRE_DAYS);
            callback(request.responseText);
          } else
            callback("");
        } else
          callback("");
      }
    };

    request.onreadystatechange = onRscFunc;
    request.send(null);
  },
  __getFeedProcessor: function AmbNews_getFeedProcessor() {
    var Cc = Components.classes;
    var Ci = Components.interfaces;
    var fp = Cc["@mozilla.org/feed-processor;1"]
             .createInstance(Ci.nsIFeedProcessor);
    return fp;
  },
  __getAnnSvc: function AmbNews_getAnnSvc() {
    var Cc = Components.classes;
    var annSvc = Cc["@mozilla.org/browser/annotation-service;1"]
                 .getService(Components.interfaces.nsIAnnotationService);
    return annSvc;
  },
  onLinkAdded: function AmbNews_onLinkAdded(aEvent) {
    if (aEvent.target.rel == "alternate" &&
        (aEvent.target.type == "application/rss+xml" ||
         aEvent.target.type == "application/atom+xml")) {
      var annSvc = AmbNews.__getAnnSvc();
      var page = AmbNews.url(aEvent.target.baseURI);
      var feed = AmbNews.url(aEvent.target.href);
      annSvc.setPageAnnotation(page, "ambnews/feed",
                               feed.spec, 0, annSvc.EXPIRE_WEEKS);
    }
  },
  onLoad: function AmbNews_onLoad(aEvent) {
    if (aEvent.target.baseURI == "about:blank") {
      var doc = aEvent.target;
      doc.defaultView.location = "about:news";
      // TODO: The delay here only works most of the time;
      // its effectiveness is a race condition and we should
      // figure out what even to listen for to actually select
      // the URL bar text consistently
      window.setTimeout(function() { gURLBar.select(); }, 50);
    }
  }
};