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