rem: var erel = event.target.rel; var etype = event.target.type; var etitle = event.target.title; const rssTitleRegex = /(^|\s)rss($|\s)/i; var rels = {}; 
add: var feed = recognizeFeedFromLink(event.target, event.target.ownerDocument.contentPrincipal); 
context:   onLinkAdded: function(event) {    // XXX this event listener can/should probably be combined with the onLinkAdded    // listener in tabbrowser.xml, which only listens for favicons and then passes    // them to onLinkIconAvailable in the ProgressListener.  We could extend the    // progress listener to have a generic onLinkAvailable and have tabbrowser pass    // along all events.  It should give us the browser for the tab, as well as    // the actual event.    var erel = event.target.rel;    var etype = event.target.type;    var etitle = event.target.title;    const rssTitleRegex = /(^|\s)rss($|\s)/i;    var rels = {};    if (erel) {      for each (var relValue in erel.split(/\s+/))        rels[relValue] = true;    }    var isFeed = rels.feed;    if (!isFeed &&        (!rels.alternate || rels.stylesheet || !etype))      return;    if (!isFeed) {      // Use type value      etype = etype.replace(/^\s+/, "");      etype = etype.replace(/\s+$/, "");      etype = etype.replace(/\s*;.*/, "");      etype = etype.toLowerCase();      isFeed = (etype == "application/rss+xml" ||                etype == "application/atom+xml");      if (!isFeed) {        // really slimy: general XML types with magic letters in the title        isFeed = ((etype == "text/xml" || etype == "application/xml" ||                   etype == "application/rdf+xml") && rssTitleRegex.test(etitle));      }    }    if (isFeed) {      const targetDoc = event.target.ownerDocument;      // find which tab this is for, and set the attribute on the browser      var browserForLink = gBrowser.getBrowserForDocument(targetDoc);      if (!browserForLink) {        // ??? this really shouldn't happen..        return;      }      var feeds = [];      if (browserForLink.feeds != null)        feeds = browserForLink.feeds;      var wrapper = event.target;      try {         urlSecurityCheck(wrapper.href,                         gBrowser.contentPrincipal,                         Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);      }      catch (ex) {        dump(ex.message);        return; // doesn't pass security check      }      feeds.push({ href: wrapper.href,                   type: etype,                   title: wrapper.title});      browserForLink.feeds = feeds;      if (browserForLink == gBrowser || browserForLink == gBrowser.mCurrentBrowser) {        var feedButton = document.getElementById("feed-button");        if (feedButton) {          feedButton.setAttribute("feeds", "true");          feedButton.setAttribute("tooltiptext",                                   gNavigatorBundle.getString("feedHasFeedsNew"));        }      }    }  }
meta: 8395	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/8395/706c1bce1ae0d1c46cbd7201f055d2941a892352/browser.js/clean/browser/base/content/browser.js