diff --git a/mozilla/mail/extensions/newsblog/content/Feed.js b/mozilla/mail/extensions/newsblog/content/Feed.js index c57859b97e3..7b1fbdbdc06 100755 --- a/mozilla/mail/extensions/newsblog/content/Feed.js +++ b/mozilla/mail/extensions/newsblog/content/Feed.js @@ -244,6 +244,26 @@ Feed.prototype = ds.Assert(this.resource, FZ_QUICKMODE, aNewQuickMode, true); }, + get link () + { + var ds = getSubscriptionsDS(this.server); + var link = ds.GetTarget(this.resource, RSS_LINK, true); + if(link) + link = link.QueryInterface(Components.interfaces.nsIRDFLiteral).Value; + return link; + }, + + set link (aNewLink) + { + var ds = getSubscriptionsDS(this.server); + aNewLink = rdf.GetLiteral(aNewLink); + var old_link = ds.GetTarget(this.resource, RSS_LINK, true); + if (old_link) + ds.Change(this.resource, RSS_LINK, old_link, aNewLink); + else + ds.Assert(this.resource, RSS_LINK, aNewLink, true); + }, + parse: function() { // Figures out what description language (RSS, Atom) and version this feed diff --git a/mozilla/mail/extensions/newsblog/content/feed-parser.js b/mozilla/mail/extensions/newsblog/content/feed-parser.js index b7159e87423..8eb03de800a 100644 --- a/mozilla/mail/extensions/newsblog/content/feed-parser.js +++ b/mozilla/mail/extensions/newsblog/content/feed-parser.js @@ -62,7 +62,7 @@ FeedParser.prototype = debug(aFeed.url + " is an RSS 1.x (RDF-based) feed"); return this.parseAsRSS1(aFeed, aSource, aBaseURI); } - else if (aDOM.documentElement.namespaceURI == "http://purl.org/atom/ns#") + else if (aDOM.documentElement.namespaceURI == ATOM_03_NS) { debug(aFeed.url + " is an Atom feed"); return this.parseAsAtom(aFeed, aDOM); @@ -96,6 +96,7 @@ FeedParser.prototype = aFeed.title = aFeed.title || getNodeValue(channel.getElementsByTagName("title")[0]); aFeed.description = getNodeValue(channel.getElementsByTagName("description")[0]); + aFeed.link = getNodeValue(channel.getElementsByTagName("link")[0]); if (!aFeed.parseItems) return parsedItems; @@ -184,6 +185,7 @@ FeedParser.prototype = aFeed.title = aFeed.title || getRDFTargetValue(ds, channel, RSS_TITLE); aFeed.description = getRDFTargetValue(ds, channel, RSS_DESCRIPTION); + aFeed.link = getRDFTargetValue(ds, channel, RSS_LINK); if (!aFeed.parseItems) return parsedItems; @@ -252,6 +254,7 @@ FeedParser.prototype = aFeed.title = aFeed.title || getNodeValue(channel.getElementsByTagName("title")[0]); aFeed.description = getNodeValue(channel.getElementsByTagName("tagline")[0]); + aFeed.link = this.findAtomLink("alternate",channel.getElementsByTagNameNS(ATOM_03_NS,"link")); if (!aFeed.parseItems) return parsedItems; @@ -268,16 +271,7 @@ FeedParser.prototype = item.characterSet = "UTF-8"; var url; - var links = itemNode.getElementsByTagName("link"); - for (var j=0; j < links.length; j++) - { - var alink = links[j]; - if (alink && alink.getAttribute('rel') && alink.getAttribute('rel') == 'alternate' && alink.getAttribute('href')) - { - url = alink.getAttribute('href'); - break; - } - } + url = this.findAtomLink("alternate",itemNode.getElementsByTagNameNS(ATOM_03_NS,"link")); item.url = url; item.id = getNodeValue(itemNode.getElementsByTagName("id")[0]); @@ -346,5 +340,18 @@ FeedParser.prototype = parsedItems[i] = item; } return parsedItems; + }, + + findAtomLink: function(linkRel, linkElements) + { + // XXX Need to check for MIME type and hreflang + for ( var j=0 ; j