<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="resources/utilities.js"></script>
</head>
<body>
<script>
description("Strip tabs and newlines according to URL spec: https://url.spec.whatwg.org/#concept-basic-url-parser");

var expectedGeneralizedResult = "scheme://username:password@host.name:5000/path?query#fragment";
generalizedCases = [
    //normal case
    ["scheme://username:password@host.name:5000/path?query#fragment"],
    //add tabs and newlines at scheme
    ["\\tsch\\neme\\r://username:password@host.name:5000/path?query#fragment"],
    //add tabs and newlines after scheme
    ["scheme:\\t/\\n/username:password@host.name:5000/path?query#fragment"],
    //add tabs and newlines at credential
    ["scheme://\\tuser\\rname\\n:\\rpassw\\nord\\t@host.name:5000/path?query#fragment"],
    //add tabs and newlines at host
    ["scheme://username:password@\\tho\\nst\\r.\\tna\\nme\\r:5000/path?query#fragment"],
    //add tabs and newlines at port
    ["scheme://username:password@host.name:\\t5\\n000\\r/path?query#fragment"],
    //add tabs and newlines at path
    ["scheme://username:password@host.name:5000/\\tpa\\nth\\r?query#fragment"],
    //add tabs and newlines at query
    ["scheme://username:password@host.name:5000/path?\\tqu\\nery\\r#fragment"],
    //add tabs and newlines at fragment
    ["scheme://username:password@host.name:5000/path?query#\\tfr\\nagment\\r"],
];

for (var i = 0; i < generalizedCases.length; ++i)
    shouldBe("canonicalize('" + generalizedCases[i] + "')",
             "'" + expectedGeneralizedResult + "'");

specialCases = [
    //http & https
    ["\\tht\\ntp\\r://www.example.com/", "http://www.example.com/"],
    ["\\tht\\ntps\\r://www.example.com/", "https://www.example.com/"],
    //file URL
    ["\\tfi\\nle\\r:///var/tmp", "file:///var/tmp"],
    ["file://\\n/v\\tar\\r/\\ttm\\np\\r", "file:///var/tmp"],
    //ipv4, ipv6
    ["http://\\n12\\r7\\t.0.0.1\\t/", "http://127.0.0.1/"],
    ["http://\\n[\\r200\\t1\\r:\\t5:\\n:042:44::0370:7334\\r]\\t/", "http://[2001:5::042:44::0370:7334]/"],
    //localhost
    ["http://\\tlo\\ncalhost\\r", "http://localhost/"],
    //relative path
    ["\\t/\\n/\\rsch\\teme\\n/relative\\r", "file://scheme/relative"],
    ["\\t/\\npa\\rth\\t/\\nabsolute\\r", "file:///path/absolute"],
    //data URL
    ["\\td\\nata\\r:image/png;base64,invalidData", "data:image/png;base64,invalidData"],
    ["data:\\tim\\rage/png\\n;\\tbas\\ne64\\r,\\tinv\\nalidData\\r", "data:image/png;base64,invalidData"],
    //javascript URL
    ["\\tjav\\nascript\\r:alert(1);", "javascript:alert(1);"],
    ["javascript:\\tal\\rert\\n(\\n1)\\t;\\r", "javascript:alert(1);"],
];

for (var i = 0; i < specialCases.length; ++i)
    shouldBe("canonicalize('" + specialCases[i][0] + "')",
             "'" + specialCases[i][1] + "'");

// relative path scheme less URL
var URLParts = window.location.href.split( '/' );
var path = URLParts[0];
var len = URLParts.length - 1;
for (i = 1; i < len; i++)
    path += "/" + URLParts[i];

var relativePathSchemeLessURL = "\tpa\nth\r/\trelative/\nscheme/less\r";
var expectedRelativePathSchemeLessURL = path + "/path/relative/scheme/less";
shouldBe("canonicalize(relativePathSchemeLessURL)", "expectedRelativePathSchemeLessURL");
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
