Bug 377611 - Feed autodiscovery shouldn't treat rel as case-sensitive, patch by Ehsan Akhgari <ehsan.akhgari@gmail.com> because I was too slow, r=mano+sayrer
authorphilringnalda@gmail.com
Fri, 29 Jun 2007 18:47:53 -0700
changeset 2949 60e2d833ba32e68a6f9d198a9f4fa1c167fd7366
parent 2948 bd6d109cb8578c9a954be222a8ceeef0b15c188c
child 2950 7898510fae66f3759153cd85b73fcd892e128668
push idunknown
push userunknown
push dateunknown
reviewersmano
bugs377611
milestone1.9a6pre
Bug 377611 - Feed autodiscovery shouldn't treat rel as case-sensitive, patch by Ehsan Akhgari <ehsan.akhgari@gmail.com> because I was too slow, r=mano+sayrer
browser/base/Makefile.in
browser/base/content/test/Makefile.in
browser/base/content/test/feed_discovery.html
browser/base/content/test/test_feed_discovery.html
browser/base/content/utilityOverlay.js
--- a/browser/base/Makefile.in
+++ b/browser/base/Makefile.in
@@ -39,16 +39,20 @@ DEPTH   = ../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH   = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 include $(topsrcdir)/config/config.mk
 
+ifdef MOZ_MOCHITEST
+DIRS += content/test
+endif
+
 include $(topsrcdir)/config/rules.mk
 
 DEFINES += -DMOZ_APP_VERSION=$(MOZ_APP_VERSION)
 
 ifndef MOZ_BRANDING_DIRECTORY
 DEFINES += -DMOZ_USE_GENERIC_BRANDING
 endif
 
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/Makefile.in
@@ -0,0 +1,51 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Foundation.
+# Portions created by the Initial Developer are Copyright (C) 2007
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH		= ../../../..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+relativesrcdir  = browser/base/content/test
+
+include $(DEPTH)/config/autoconf.mk
+include $(topsrcdir)/config/rules.mk
+
+_TEST_FILES = 	test_feed_discovery.html \
+	   feed_discovery.html \
+    $(NULL)
+
+libs:: $(_TEST_FILES)
+	$(INSTALL) $^ $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/feed_discovery.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=377611
+-->
+  <head>
+    <title>Test for feed discovery</title>
+
+    <!-- Straight up standard -->
+    <link rel="alternate" type="application/atom+xml" title="1" href="/1.atom" />
+    <link rel="alternate" type="application/rss+xml" title="2" href="/2.rss" />
+    <link rel="feed" title="3" href="/3.xml" />
+
+    <!-- rel is a space-separated list -->
+    <link rel=" alternate " type="application/atom+xml" title="4" href="/4.atom" />
+    <link rel="foo alternate" type="application/atom+xml" title="5" href="/5.atom" />
+    <link rel="alternate foo" type="application/atom+xml" title="6" href="/6.atom" />
+    <link rel="foo alternate foo" type="application/atom+xml" title="7" href="/7.atom" />
+    <link rel="meat feed cake" title="8" href="/8.atom" />
+
+    <!-- rel is case-insensitive -->
+    <link rel="ALTERNate" type="application/atom+xml" title="9" href="/9.atom" />
+    <link rel="fEEd" title="10" href="/10.atom" />
+
+    <!-- type can have leading and trailing whitespace -->
+    <link rel="alternate" type="  application/atom+xml  " title="11" href="/11.atom" />
+
+    <!-- type is case-insensitive -->
+    <link rel="alternate" type="aPPliCAtion/ATom+xML" title="12" href="/12.atom" />
+
+    <!-- tolerate application/rdf+xml if the title includes 'rss' -->
+    <link rel="alternate" type="application/rdf+xml" title="13 rss" href="/13.rdf" />
+
+    <!-- tolerate application/xml if the title includes 'rss' -->
+    <link rel="alternate" type="application/xml" title="14 rss" href="/14.xml" />
+
+    <!-- tolerate text/xml if the title includes 'rss' -->
+    <link rel="alternate" type="text/xml" title="15 rss" href="/15.xml" />
+
+    <!-- "feed stylesheet" is a feed, though "alternate stylesheet" isn't -->
+    <link rel="feed stylesheet" title="16" href="/16.atom" />
+
+    <!-- hyphens or letters around rel not allowed -->
+    <link rel="disabled-alternate" type="application/atom+xml" title="Bogus1" href="/Bogus1" />
+    <link rel="alternates" type="application/atom+xml" title="Bogus2" href="/Bogus2" />
+    <link rel=" alternate-like" type="application/atom+xml" title="Bogus3" href="/Bogus3" />
+
+    <!-- don't tolerate text/xml if title includes 'rss' not as a word -->
+    <link rel="alternate" type="text/xml" title="Bogus4 scissorsshaped" href="/Bogus4" />
+
+    <!-- don't tolerate application/xml if title includes 'rss' not as a word -->
+    <link rel="alternate" type="application/xml" title="Bogus5 scissorsshaped" href="/Bogus5" />
+
+    <!-- don't tolerate application/rdf+xml if title includes 'rss' not as a word -->
+    <link rel="alternate" type="application/rdf+xml" title="Bogus6 scissorsshaped" href="/Bogus6" />
+
+    <!-- don't tolerate random types -->
+    <link rel="alternate" type="text/plain" title="Bogus7 rss" href="/Bogus7" />
+
+    <!-- don't find Atom by title -->
+    <link rel="foopy" type="application/atom+xml" title="Bogus8 Atom and RSS" href="/Bogus8" />
+
+    <!-- don't find application/rss+xml by title -->
+    <link rel="goats" type="application/rss+xml" title="Bogus9 RSS and Atom" href="/Bogus9" />
+
+    <!-- alternate and stylesheet isn't a feed -->
+    <link rel="alternate stylesheet" type="application/rss+xml" title="Bogus10 RSS" href="/Bogus10" />
+  </head>
+  <body>
+    <script type="text/javascript">
+      window.onload = function() {
+        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+        var tests = new Array();
+
+        var currentWindow =
+        window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+                              .getInterface(Components.interfaces.nsIWebNavigation)
+                              .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
+                              .rootTreeItem
+                              .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+                              .getInterface(Components.interfaces.nsIDOMWindow);
+        var browser = currentWindow.gBrowser.selectedBrowser;
+
+        var discovered = browser.feeds;
+        tests.push({ check: discovered.length > 0,
+                     message: "some feeds should be discovered" });
+
+        var feeds = [];
+
+        for each (var aFeed in discovered) {
+          feeds[aFeed.href] = true;
+        }
+
+        for each (var aLink in document.getElementsByTagName("link")) {
+          // ignore real stylesheets, and anything without an href property
+          if (aLink.type != "text/css" && aLink.href) {
+            if (/bogus/i.test(aLink.title)) {
+              tests.push({ check: !feeds[aLink.href],
+                           message: "don't discover " + aLink.href });
+            } else {
+              tests.push({ check: feeds[aLink.href],
+                           message: "should discover " + aLink.href });
+            }
+          }
+        }
+        window.arguments[0].tests = tests;
+        window.close();
+      }
+    </script>
+  </body>
+</html>
+
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/test_feed_discovery.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=377611
+-->
+<head>
+  <title>Test for feed discovery</title>
+  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=377611">Mozilla Bug 377611</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Test for Bug 377611 **/
+
+var rv = { tests: null };
+var testCheckInterval = null;
+
+function startTest() {
+  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+  var url = window.location.href.replace(/test_feed_discovery\.html/,
+                                         'feed_discovery.html');
+  window.openDialog(url, '', 'dialog=no,width=10,height=10', rv);
+  testCheckInterval = window.setInterval(tryIfTestIsFinished, 500);
+}
+
+function tryIfTestIsFinished() {
+  if (rv.tests) {
+    window.clearInterval(testCheckInterval);
+    checkTest();
+  }
+}
+
+function checkTest() {
+  for (var i = 0; i < rv.tests.length; ++ i) {
+    var test = rv.tests[i];
+    ok(test.check, test.message);
+  }
+  SimpleTest.finish();
+}
+
+window.onload = startTest;
+
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+</body>
+</html>
+
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -592,18 +592,18 @@ function openNewWindowWith(aURL, aDocume
  *         The feed object containing href, type, and title properties,
  *          if successful, otherwise null.
  */ 
 function recognizeFeedFromLink(aLink, aPrincipal)
 {
   if (!aLink || !aPrincipal)
     return null;
 
-  var erel = aLink.rel;
-  var etype = aLink.type;
+  var erel = aLink.rel && aLink.rel.toLowerCase();
+  var etype = aLink.type && aLink.type.toLowerCase();
   var etitle = aLink.title;
   const rssTitleRegex = /(^|\s)rss($|\s)/i;
   var rels = {};
 
   if (erel) {
     for each (var relValue in erel.split(/\s+/))
       rels[relValue] = true;
   }
@@ -612,17 +612,16 @@ function recognizeFeedFromLink(aLink, aP
   if (!isFeed && (!rels.alternate || rels.stylesheet || !etype))
     return null;
 
   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));
     }
   }