|
1
|
1 var AmbNews = {
|
|
|
2 url: function url(spec) {
|
|
|
3 if (typeof(spec) != "string")
|
|
|
4 // Assume that a URI object was passed in, so just return it back.
|
|
|
5 return spec;
|
|
|
6 var classObj = Components.classes["@mozilla.org/network/io-service;1"];
|
|
|
7 var ios = classObj.getService(Components.interfaces.nsIIOService);
|
|
|
8 return ios.newURI(spec, null, null);
|
|
|
9 },
|
|
|
10 getFeed: function AmbNews_getFeed(url, callback) {
|
|
|
11 function onXml(text) {
|
|
|
12 var feed = null;
|
|
|
13 if (text) {
|
|
|
14 var resultListener = {
|
|
|
15 handleResult: function resultListener_handleResult(aResult) {
|
|
|
16 feed = {};
|
|
|
17 var nsIFeed = aResult.doc;
|
|
|
18 var Ci = Components.interfaces;
|
|
|
19 nsIFeed.QueryInterface(Ci.nsIFeed);
|
|
|
20 feed.link = nsIFeed.link;
|
|
|
21 feed.title = nsIFeed.title;
|
|
|
22 feed.entries = [];
|
|
|
23 for (var i = 0; i < nsIFeed.items.length; i++) {
|
|
|
24 var item = nsIFeed.items.queryElementAt(i, Ci.nsIFeedEntry);
|
|
|
25 feed.entries.push(item);
|
|
|
26 }
|
|
|
27 }
|
|
|
28 };
|
|
|
29 var fp = AmbNews.__getFeedProcessor();
|
|
|
30 fp.listener = resultListener;
|
|
|
31 fp.parseFromString(text, AmbNews.url(url));
|
|
|
32 }
|
|
|
33 callback(feed);
|
|
|
34 }
|
|
|
35 AmbNews.__getXml(url, onXml);
|
|
|
36 },
|
|
|
37 __getXml: function AmbNews_getXml(url, callback) {
|
|
|
38 var feedUrl = AmbNews.url(url);
|
|
|
39 var annSvc = AmbNews.__getAnnSvc();
|
|
|
40
|
|
|
41 if (annSvc.pageHasAnnotation(feedUrl, "AmbNews/feed-xml")) {
|
|
|
42 var xml = annSvc.getPageAnnotation(feedUrl, "AmbNews/feed-xml");
|
|
|
43 // TODO: Perhaps re-enable this, but only let it live for a
|
|
|
44 // few minutes?
|
|
|
45 //callback(xml);
|
|
|
46 //return;
|
|
|
47 }
|
|
|
48
|
|
|
49 var request = new XMLHttpRequest();
|
|
|
50 request.open("GET", url, true);
|
|
|
51
|
|
|
52 var onRscFunc = function getXml_onReadyStateChange() {
|
|
|
53 if (request.readyState == 4) {
|
|
|
54 if (request.status == 200) {
|
|
|
55 if (request.responseText) {
|
|
|
56 annSvc.setPageAnnotation(feedUrl,
|
|
|
57 "AmbNews/feed-xml",
|
|
|
58 request.responseText,
|
|
|
59 0,
|
|
|
60 annSvc.EXPIRE_DAYS);
|
|
|
61 callback(request.responseText);
|
|
|
62 } else
|
|
|
63 callback("");
|
|
|
64 } else
|
|
|
65 callback("");
|
|
|
66 }
|
|
|
67 };
|
|
|
68
|
|
|
69 request.onreadystatechange = onRscFunc;
|
|
|
70 request.send(null);
|
|
|
71 },
|
|
|
72 __getFeedProcessor: function AmbNews_getFeedProcessor() {
|
|
|
73 var Cc = Components.classes;
|
|
|
74 var Ci = Components.interfaces;
|
|
|
75 var fp = Cc["@mozilla.org/feed-processor;1"]
|
|
|
76 .createInstance(Ci.nsIFeedProcessor);
|
|
|
77 return fp;
|
|
|
78 },
|
|
|
79 __getAnnSvc: function AmbNews_getAnnSvc() {
|
|
|
80 var Cc = Components.classes;
|
|
|
81 var annSvc = Cc["@mozilla.org/browser/annotation-service;1"]
|
|
|
82 .getService(Components.interfaces.nsIAnnotationService);
|
|
|
83 return annSvc;
|
|
|
84 },
|
|
|
85 onLinkAdded: function AmbNews_onLinkAdded(aEvent) {
|
|
|
86 if (aEvent.target.rel == "alternate" &&
|
|
|
87 (aEvent.target.type == "application/rss+xml" ||
|
|
|
88 aEvent.target.type == "application/atom+xml")) {
|
|
|
89 var annSvc = AmbNews.__getAnnSvc();
|
|
|
90 var page = AmbNews.url(aEvent.target.baseURI);
|
|
|
91 var feed = AmbNews.url(aEvent.target.href);
|
|
|
92 annSvc.setPageAnnotation(page, "AmbNews/feed",
|
|
|
93 feed.spec, 0, annSvc.EXPIRE_WEEKS);
|
|
|
94 }
|
|
|
95 }
|
|
|
96 };
|