<!doctype html>
<meta charset={{GET[encoding]}}> <!-- ends up as <meta charset> by default which is windows-1252 -->
<meta name=variant content="?encoding=windows-1252">
<meta name=variant content="?encoding=x-cp1251">
<meta name=variant content="?encoding=utf8">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/utils.js"></script>
<link rel=help href=https://html.spec.whatwg.org/multipage/#following-hyperlinks>
<link rel=help href=https://html.spec.whatwg.org/multipage/#hyperlink-auditing>
<link rel=help href=https://html.spec.whatwg.org/multipage/#attr-meta-http-equiv-refresh>
<div id=log></div>
<script>
function expected(encoding) {
  return {
    "UTF-8": "%C3%BF",
    "windows-1251": "%26%23255%3B",
    "windows-1252": "%FF"
  }[encoding];
}
var encoding = document.characterSet;
var blank = 'resources/blank.py?encoding=' + encoding;
var stash_put = 'resources/stash.py?q=\u00FF&action=put&id=';
var stash_take = 'resources/stash.py?action=take&id=';
var input_url_html = 'resources/resource.py?q=\u00FF&encoding=' + encoding + '&type=html';
var expected_current = expected(encoding);
var expected_utf8 = expected('UTF-8');

function assert_ends_with(input, endsWith) {
  assert_true(input.endsWith(endsWith), input + " did not end with " + endsWith);
}


function poll_for_stash(test_obj, uuid, expected) {
  var start = new Date();
  var poll = test_obj.step_func(function () {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', stash_take + uuid);
    xhr.onload = test_obj.step_func(function(e) {
      if (xhr.response == "") {
        if (new Date() - start > 10000) {
          // If we set the status to TIMEOUT here we avoid a race between the
          // page and the test timing out
          test_obj.force_timeout();
        }
        test_obj.step_timeout(poll, 200);
      } else {
        assert_equals(xhr.response, expected);
        test_obj.done();
      }
    });
    xhr.send();
  })
  test_obj.step_timeout(poll, 200);
}

function setup_navigation(elm, iframe, id, test_obj) {
  iframe.name = id;
  elm.target = id;
  elm.setAttribute('href', input_url_html);
  document.body.appendChild(iframe);
  document.body.appendChild(elm);
  test_obj.add_cleanup(function() {
    document.body.removeChild(iframe);
    document.body.removeChild(elm);
  });
}

// follow hyperlink
function test_follow_link(tag) {
  async_test(function() {
    var elm = document.createElement(tag);
    var iframe = document.createElement('iframe');
    setup_navigation(elm, iframe, 'test_follow_link_'+tag, this);
    iframe.onload = this.step_func_done(function() { // when the page navigated to has loaded
      assert_equals(iframe.contentDocument.body.textContent, expected_current);
    });
    // follow the hyperlink
    elm.click();
    // check that navigation succeeded by ...??? XXX
  }, 'follow hyperlink <'+tag+' href>');
}

'a, area, link'.split(', ').forEach(function(str) {
  test_follow_link(str);
});

// follow hyperlink with ping attribute
function test_follow_link_ping(tag) {
  async_test(function() {
    var uuid = token();
    var elm = document.createElement(tag);
    // check if ping is supported
    assert_true('ping' in elm, 'ping not supported');
    elm.setAttribute('ping', stash_put + uuid);
    var iframe = document.createElement('iframe');
    setup_navigation(elm, iframe, 'test_follow_link_ping_'+tag, this);
    // follow the hyperlink
    elm.click();
    // check that navigation succeeded by ...??? XXX
    // check that the right URL was requested for the ping
    poll_for_stash(this, uuid, expected_current);
  }, 'hyperlink auditing <'+tag+' ping>');
}

'a, area'.split(', ').forEach(function(str) {
  test_follow_link_ping(str);
});

// navigating with meta refresh
async_test(function() {
  var iframe = document.createElement('iframe');
  iframe.src = blank;
  document.body.appendChild(iframe);
  this.add_cleanup(function() {
    document.body.removeChild(iframe);
  });
  iframe.onload = this.step_func_done(function() {
    var doc = iframe.contentDocument;
    var got = doc.body.textContent;
    if (got == '') {
      doc.write('<meta http-equiv=refresh content="0; URL='+input_url_html+'">REFRESH');
      doc.close();
      return;
    }
    assert_equals(got, expected_current);
  });
}, 'meta refresh');

</script>
