Bug 1408347 - Add referrer policy test for link rel=preload draft
authorThomas Nguyen <tnguyen@mozilla.com>
Tue, 21 Nov 2017 14:57:24 +0800
changeset 701067 24d66fc003af8e83e7118334adaf3ccbbebfe790
parent 700338 dd08f8b19cc32da161811abb2f7093e0f5392e69
child 741081 9e7a666806b53ffa5ff327b99d201b1226eb4c3f
push id90060
push userbmo:tnguyen@mozilla.com
push dateTue, 21 Nov 2017 06:58:24 +0000
bugs1408347
milestone59.0a1
Bug 1408347 - Add referrer policy test for link rel=preload MozReview-Commit-ID: 5tLFUm3nUe5
dom/base/test/mochitest.ini
dom/base/test/referrer_helper.js
dom/base/test/referrer_testserver.sjs
dom/base/test/test_link_preload.html
--- a/dom/base/test/mochitest.ini
+++ b/dom/base/test/mochitest.ini
@@ -668,16 +668,17 @@ skip-if = (toolkit == 'android') # Andro
 [test_iframe_referrer_invalid.html]
 [test_Image_constructor.html]
 [test_img_referrer.html]
 [test_innersize_scrollport.html]
 [test_integer_attr_with_leading_zero.html]
 [test_intersectionobservers.html]
 [test_link_prefetch.html]
 skip-if = !e10s # Track Bug 1281415
+[test_link_preload.html]
 [test_link_stylesheet.html]
 [test_messagemanager_targetchain.html]
 [test_meta_viewport0.html]
 skip-if = (os != 'android')    # meta-viewport tag support is mobile-only
 [test_meta_viewport1.html]
 skip-if = (os != 'android')    # meta-viewport tag support is mobile-only
 [test_meta_viewport2.html]
 skip-if = (os != 'android')    # meta-viewport tag support is mobile-only
--- a/dom/base/test/referrer_helper.js
+++ b/dom/base/test/referrer_helper.js
@@ -59,20 +59,21 @@ function resetState() {
     advance,
     function(xhr) {
       ok(false, "error in reset state");
       SimpleTest.finish();
     });
 }
 
 /**
- * testing if anchor and area referrer attributes are honoured (1174913)
+ * testing if referrer header is sent correctly
  */
 var tests = (function*() {
 
+  yield SpecialPowers.pushPrefEnv({"set": [['network.preload', true]]}, advance);
   yield SpecialPowers.pushPrefEnv({"set": [['security.mixed_content.block_active_content', false]]}, advance);
   yield SpecialPowers.pushPermissions([{'type': 'systemXHR', 'allow': true, 'context': document}], advance);
 
   var iframe = document.getElementById("testframe");
 
   for (var j = 0; j < testCases.length; j++) {
     if (testCases[j].PREFS) {
       yield SpecialPowers.pushPrefEnv({"set": testCases[j].PREFS}, advance);
--- a/dom/base/test/referrer_testserver.sjs
+++ b/dom/base/test/referrer_testserver.sjs
@@ -153,42 +153,38 @@ function createRedirectImgTestCase(aPara
 }
 
 // test page using link referrer attribute
 function createLinkPageUsingRefferer(aMetaPolicy, aAttributePolicy, aNewAttributePolicy, aName, aRel, aStringBuilder, aSchemeFrom, aSchemeTo, aTestType) {
   var metaString = "";
   if (aMetaPolicy) {
     metaString = `<meta name="referrer" content="${aMetaPolicy}">`;
   }
-  var relString = "";
-  if (aRel) {
-    relString = `rel=${aRel}`;
-  }
 
   var changeString = "";
   var policy = aAttributePolicy ? aAttributePolicy : aMetaPolicy;
-  var elementString = aStringBuilder(policy, aName, relString, aSchemeFrom, aSchemeTo, aTestType);
+  var elementString = aStringBuilder(policy, aName, aRel, aSchemeFrom, aSchemeTo, aTestType);
 
   if (aTestType === "setAttribute") {
     changeString = `var link = document.getElementById("test_link");
                     link.setAttribute("referrerpolicy", "${aNewAttributePolicy}");
-                    link.href = "${createTestUrl(policy, "test", aName, "link_element", aSchemeFrom, aSchemeTo)}";`;
+                    link.href = "${createTestUrl(policy, "test", aName, "link_element_" + aRel, aSchemeFrom, aSchemeTo)}";`;
   } else if (aTestType === "property") {
     changeString = `var link = document.getElementById("test_link");
                     link.referrerPolicy = "${aNewAttributePolicy}";
-                    link.href = "${createTestUrl(policy, "test", aName, "link_element", aSchemeFrom, aSchemeTo)}";`;
+                    link.href = "${createTestUrl(policy, "test", aName, "link_element_" + aRel, aSchemeFrom, aSchemeTo)}";`;
   }
 
   return `<!DOCTYPE HTML>
            <html>
              <head>
                ${metaString}
-               ${elementString}
              </head>
              <body>
+                ${elementString}
                 <script>
                   ${changeString}
                 </script>
              </body>
            </html>`;
 }
 
 function createFetchUserControlRPTestCase(aName, aSchemeFrom, aSchemeTo) {
@@ -205,30 +201,40 @@ function createFetchUserControlRPTestCas
             fetch("${srcUrl}", {referrerPolicy: ""}).then(function (response) {
               window.parent.postMessage("childLoadComplete", "http://mochi.test:8888");
             });
           </script>
           </body>
           </html>`;
 }
 
-function buildLinkString(aPolicy, aName, aRelString, aSchemeFrom, aSchemeTo, aTestType) {
-  var result;
+function buildLinkString(aPolicy, aName, aRel, aSchemeFrom, aSchemeTo, aTestType) {
   var href = '';
   var onChildComplete = `window.parent.postMessage("childLoadComplete", "http://mochi.test:8888");`
-  if (!aTestType) {
-    href = `href=${createTestUrl(aPolicy, "test", aName, "link_element", aSchemeFrom, aSchemeTo)}`;
-  }
-  if (!aPolicy) {
-    result = `<link ${aRelString} ${href} id="test_link" onload='${onChildComplete}' onerror='${onChildComplete}'>`;
-  } else {
-    result = `<link ${aRelString} ${href} referrerpolicy=${aPolicy} id="test_link" onload='${onChildComplete}' onerror='${onChildComplete}'>`;
+  var policy = '';
+  var asString = '';
+  var relString = '';
+
+  if (aRel) {
+    relString = `rel="${aRel}"`;
   }
 
-  return result;
+  if (aPolicy) {
+    policy = `referrerpolicy=${aPolicy}`;
+  }
+
+  if (aRel == "preload") {
+    asString = 'as="image"';
+  }
+
+  if (!aTestType) {
+    href = `href=${createTestUrl(aPolicy, "test", aName, "link_element_" + aRel, aSchemeFrom, aSchemeTo)}`;
+  }
+
+  return `<link ${relString} ${href} ${policy} ${asString} id="test_link" onload='${onChildComplete}' onerror='${onChildComplete}'>`;
 }
 
 function handleRequest(request, response) {
   var params = new URLSearchParams(request.queryString);
   var action = params.get("ACTION");
   var schemeFrom = params.get("SCHEME_FROM") || "http";
   var schemeTo = params.get("SCHEME_TO") || "http";
 
@@ -295,17 +301,17 @@ function handleRequest(request, response
     }
     test.policy = referrerLevel;
     test.expected = policy;
 
     result[name] = test;
 
     setSharedState(SHARED_KEY, JSON.stringify(result));
 
-    if (type === "img") {
+    if (type === "img" || type == "link_element_preload") {
       // return image
       response.setHeader("Content-Type", "image/png");
       response.write(IMG_BYTES);
       return;
     }
     if (type === "iframe") {
       // return iframe page
       response.write("<html><body>I am the iframe</body></html>");
new file mode 100644
--- /dev/null
+++ b/dom/base/test/test_link_preload.html
@@ -0,0 +1,220 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Test preload referrer policy for Bug 1399780</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+
+  <!--
+  Testing that link referrer attributes are honoured correctly for rel=preload
+  https://bugzilla.mozilla.org/show_bug.cgi?id=1399780
+  -->
+
+  <script type="application/javascript">
+
+  const SJS = "://example.com/tests/dom/base/test/referrer_testserver.sjs?";
+  const PARAMS = ["ATTRIBUTE_POLICY", "NEW_ATTRIBUTE_POLICY", "META_POLICY", "REL", "SCHEME_FROM", "SCHEME_TO"];
+
+  const testCases = [
+    {ACTION: ["generate-link-policy-test"],
+      TESTS: [
+        {ATTRIBUTE_POLICY: 'unsafe-url',
+         NAME: 'preload-unsafe-url-with-origin-in-meta',
+         META_POLICY: 'origin',
+         REL: 'preload',
+         DESC: "preload-unsafe-url with origin in meta",
+         RESULT: 'full'},
+        {ATTRIBUTE_POLICY: 'origin',
+         NAME: 'preload-origin-with-unsafe-url-in-meta',
+         META_POLICY: 'unsafe-url',
+         REL: 'preload',
+         DESC: "preload-origin with unsafe-url in meta",
+         RESULT: 'origin'},
+        {ATTRIBUTE_POLICY: 'no-referrer',
+         NAME: 'preload-no-referrer-with-origin-in-meta',
+         META_POLICY: 'origin',
+         REL: 'preload',
+         DESC: "preload-no-referrer with origin in meta",
+         RESULT: 'none'},
+        {ATTRIBUTE_POLICY: 'same-origin',
+         NAME: 'preload-same-origin-with-origin-in-meta',
+         META_POLICY: 'origin',
+         REL: 'preload',
+         DESC: "preload-same-origin with origin in meta",
+         RESULT: 'full'},
+        {NAME: 'preload-no-referrer-in-meta',
+         META_POLICY: 'no-referrer',
+         REL: 'preload',
+         DESC: "preload-no-referrer in meta",
+         RESULT: 'none'},
+
+         // Downgrade.
+        {ATTRIBUTE_POLICY: 'no-referrer-when-downgrade',
+         NAME: 'preload-origin-in-meta-downgrade-in-attr',
+         META_POLICY: 'origin',
+         DESC: 'preload-origin in meta downgrade in attr',
+         REL: 'preload',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         RESULT: 'none'},
+        {ATTRIBUTE_POLICY: 'strict-origin',
+         NAME: 'preload-origin-in-meta-strict-origin-in-attr',
+         META_POLICY: 'origin',
+         DESC: 'preload-origin in meta strict-origin in attr',
+         REL: 'preload',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         RESULT: 'none'},
+        {ATTRIBUTE_POLICY: 'strict-origin-when-cross-origin',
+         NAME: 'preload-origin-in-meta-strict-origin-when-cross-origin-in-attr',
+         META_POLICY: 'origin',
+         DESC: 'preload-origin in meta strict-origin-when-cross-origin in attr',
+         REL: 'preload',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         RESULT: 'none'},
+
+         // No downgrade.
+        {ATTRIBUTE_POLICY: 'no-referrer-when-downgrade',
+         NAME: 'preload-origin-in-meta-downgrade-in-attr',
+         META_POLICY: 'origin',
+         DESC: 'preload-origin in meta downgrade in attr',
+         REL: 'preload',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'https',
+         RESULT: 'full'},
+
+        {ATTRIBUTE_POLICY: 'origin',
+         NAME: 'preload-origin-with-no-meta',
+         META_POLICY: '',
+         REL: 'preload',
+         DESC: "preload-origin with no meta",
+         RESULT: 'origin'},
+
+        {ATTRIBUTE_POLICY: 'strict-origin',
+         NAME: 'preload-origin-in-meta-strict-origin-in-attr',
+         META_POLICY: 'origin',
+         DESC: 'preload-origin in meta strict-origin in attr',
+         REL: 'preload',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'https',
+         RESULT: 'origin'},
+        {ATTRIBUTE_POLICY: 'strict-origin-when-cross-origin',
+         NAME: 'preload-origin-in-meta-strict-origin-when-cross-origin-in-attr',
+         META_POLICY: 'origin',
+         DESC: 'preload-origin in meta strict-origin-when-cross-origin in attr',
+         REL: 'preload',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'https',
+         RESULT: 'full'},
+
+        // Cross origin
+        {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
+         NAME: 'preload-origin-when-cross-origin-with-no-meta',
+         META_POLICY: '',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         REL: 'preload',
+         DESC: "preload-origin-when-cross-origin with no meta",
+         RESULT: 'origin'},
+        {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
+         NAME: 'preload-origin-when-cross-origin-with-no-referrer-in-meta',
+         META_POLICY: 'no-referrer',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         REL: 'preload',
+         DESC: "preload-origin-when-cross-origin with no-referrer in meta",
+         RESULT: 'origin'},
+        {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
+         NAME: 'preload-origin-when-cross-origin-with-unsafe-url-in-meta',
+         META_POLICY: 'unsafe-url',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         REL: 'preload',
+         DESC: "preload-origin-when-cross-origin with unsafe-url in meta",
+         RESULT: 'origin'},
+        {ATTRIBUTE_POLICY: 'origin-when-cross-origin',
+         NAME: 'preload-origin-when-cross-origin-with-origin-in-meta',
+         META_POLICY: 'origin',
+         SCHEME_FROM: 'https',
+         SCHEME_TO: 'http',
+         REL: 'preload',
+         DESC: "preload-origin-when-cross-origin with origin in meta",
+         RESULT: 'origin'},
+        {ATTRIBUTE_POLICY: 'strict-origin-when-cross-origin',
+         NAME: 'preload-strict-origin-when-cross-origin-with-origin-in-meta',
+         META_POLICY: 'origin',
+         SCHEME_FROM: 'http',
+         SCHEME_TO: 'https',
+         REL: 'preload',
+         DESC: "preload-strict-origin-when-cross-origin with origin in meta",
+         RESULT: 'origin'},
+        {ATTRIBUTE_POLICY: 'same-origin',
+         NAME: 'preload-same-origin-with-origin-in-meta',
+         META_POLICY: 'origin',
+         SCHEME_FROM: 'http',
+         SCHEME_TO: 'https',
+         REL: 'preload',
+         DESC: "preload-same-origin with origin in meta",
+         RESULT: 'none'},
+
+        // Invalid
+        {ATTRIBUTE_POLICY: 'default',
+         NAME: 'preload-default-with-no-meta',
+         META_POLICY: '',
+         REL: 'preload',
+         DESC: "preload-default with no meta",
+         RESULT: 'full'},
+        {ATTRIBUTE_POLICY: 'something',
+         NAME: 'preload-something-with-no-meta',
+         META_POLICY: '',
+         REL: 'preload',
+         DESC: "preload-something with no meta",
+         RESULT: 'full'},
+      ]},
+
+    {ACTION: ["generate-link-policy-test-set-attribute"],
+      TESTS: [
+        {ATTRIBUTE_POLICY: 'unsafe-url',
+         NEW_ATTRIBUTE_POLICY: 'no-referrer',
+         NAME: 'preload-no-referrer-unsafe-url-set-attribute-with-origin-in-meta',
+         META_POLICY: 'origin',
+         REL: 'preload',
+         DESC: "preload-no-referrer-set-attribute (orginally unsafe-url) with origin in meta",
+         RESULT: 'none'},
+        {ATTRIBUTE_POLICY: 'origin',
+         NEW_ATTRIBUTE_POLICY: 'unsafe-url',
+         NAME: 'preload-unsafe-url-origin-set-attribute-with-no-referrer-in-meta',
+         META_POLICY: 'no-referrer',
+         REL: 'preload',
+         DESC: "preload-unsafe-url-set-attribute(orginally origin) with no-referrer in meta",
+         RESULT: 'full'},
+      ]},
+
+    {ACTION: ["generate-link-policy-test-property"],
+      TESTS: [
+        {ATTRIBUTE_POLICY: 'no-referrer',
+         NEW_ATTRIBUTE_POLICY: 'unsafe-url',
+         NAME: 'preload-unsafe-url-no-referrer-property-with-origin-in-meta',
+         META_POLICY: 'origin',
+         REL: 'preload',
+         DESC: "preload-unsafe-url-property (orginally no-referrer) with origin in meta",
+         RESULT: 'full'},
+        {ATTRIBUTE_POLICY: 'origin',
+         NEW_ATTRIBUTE_POLICY: 'unsafe-url',
+         NAME: 'preload-unsafe-url-origin-property-with-no-referrer-in-meta',
+         META_POLICY: 'no-referrer',
+         REL: 'preload',
+         DESC: "preload-unsafe-url-property (orginally origin) with no-referrer in meta",
+         RESULT: 'full'},
+      ]},
+  ];
+
+  </script>
+  <script type="application/javascript" src="/tests/dom/base/test/referrer_helper.js"></script>
+</head>
+<body onload="tests.next();">
+  <iframe id="testframe"></iframe>
+</body>
+</html>