diff ambnews/content/ambnews.js @ 1:44bcb4975ead

Added more files.
author Atul Varma <varmaa@toolness.com>
date Thu, 21 Aug 2008 15:39:57 -0700
parents
children 88b12596346d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ambnews/content/ambnews.js	Thu Aug 21 15:39:57 2008 -0700
@@ -0,0 +1,96 @@
+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) {
+            feed = {};
+            var nsIFeed = aResult.doc;
+            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);
+    }
+  }
+};