Mercurial > ambnews-firefox
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); + } + } +};
