<!DOCTYPE HTML>
<html>
<!--
This checks if the right policies are applied from a given string (including whitespace, invalid policy strings, etc).  It doesn't do a complete check for all load types; that's done in another test.
https://bugzilla.mozilla.org/show_bug.cgi?id=704320
-->

<head>
  <meta charset="utf-8">
  <title>Test policies for Bug 704320</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript" src="referrerHelper.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>

<script type="application/javascript">

SimpleTest.waitForExplicitFinish();
var advance = function() { tests.next(); };

/**
 * This is the main test routine -- serialized by use of a generator.
 * It resets the counter, then performs two tests in sequence using
 * the same iframe.
 */
var tests = (function*() {
  var iframe = document.getElementById("testframe");
  const sjs = "/tests/dom/base/test/bug704320.sjs?action=generate-policy-test";


  // basic calibration check
  // reset the counter
  yield resetCounter();

  // load the first test frame
  // it will call back into this function via postMessage when it finishes loading.
  // and continue beyond the yield.
  yield iframe.src = sjs + "&policy=" + escape('default');

  // check the first test (two images, no referrers)
  yield checkIndividualResults("default", ["full"]);

  // check invalid policy
  // According to the spec section Determine token's Policy,if there is a policy
  // token and it is not one of the expected tokens, Empty string should be the
  // policy used.
  yield resetCounter();
  yield iframe.src = sjs + "&policy=" + escape('invalid-policy');
  yield checkIndividualResults("invalid", ["full"]);

  // whitespace checks.
  // according to the spec section 4.1, the content attribute's value
  // is fed to the token policy algorithm after stripping leading and
  // trailing whitespace.
  yield resetCounter();
  yield iframe.src = sjs + "&policy=" + escape('default   ');
  yield checkIndividualResults("trailing whitespace", ["full"]);

  yield resetCounter();
  yield iframe.src = sjs + "&policy=" + escape(' origin\f');
  yield checkIndividualResults("trailing form feed", ["origin"]);

  yield resetCounter();
  yield iframe.src = sjs + "&policy=" + escape('\f origin');
  yield checkIndividualResults("leading form feed", ["origin"]);

  // origin when cross-origin (trimming whitespace)
  yield resetCounter();
  yield iframe.src = sjs + "&policy=" + escape(' origin-when-cross-origin');
  yield checkIndividualResults("origin-when-cross-origin", ["origin", "full"]);

  // according to the spec section 4.1:
  // "If the meta element lacks a content attribute, or if that attribute’s
  //  value is the empty string, then abort these steps."
  // This means empty or missing content attribute means to ignore the meta
  // tag and use default policy.
  // Whitespace here is space, tab, LF, FF and CR.
  // http://www.w3.org/html/wg/drafts/html/CR/infrastructure.html#space-character
  yield resetCounter();
  yield iframe.src = sjs + "&policy=" + escape(' \t  ');
  yield checkIndividualResults("basic whitespace only policy", ["full"]);

  // and double-check that no-referrer works.
  yield resetCounter();
  yield iframe.src = sjs + "&policy=" + escape('no-referrer');
  yield checkIndividualResults("no-referrer", ["none"]);

  // Case insensitive
  yield resetCounter();
  yield iframe.src = sjs + "&policy=" + escape('\f OrigIn');
  yield checkIndividualResults("origin case insensitive", ["origin"]);

  // complete.
  SimpleTest.finish();
})();

</script>
</head>

<body onload="tests.next();">
  <iframe id="testframe"></iframe>

</body>
</html>

