1430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Blockdescription("Test resolution of relative URLs."); 2430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block 3430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Blockcases = [ 4430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Format: [baseURL, relativeURL, expectedURL], 5430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Basic absolute input. 6430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "http://another/", "http://another/"], 7430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "http:////another/", "http://another/"], 8430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Empty relative URLs should only remove the ref part of the URL, 9430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // leaving the rest unchanged. 10430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar", "", "http://foo/bar"], 11430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar#ref", "", "http://foo/bar"], 12430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar#", "", "http://foo/bar"], 13430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Spaces at the ends of the relative path should be ignored. 14430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar", " another ", "http://foo/another"], 15430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar", " . ", "http://foo/"], 16430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar", " \t ", "http://foo/bar"], 17430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Matching schemes without two slashes are treated as relative. 18430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "http:path", "http://host/path"], 19430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a/", "http:path", "http://host/a/path"], 20430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "http:/path", "http://host/path"], 21430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "HTTP:/path", "http://host/path"], 22430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Nonmatching schemes are absolute. 23430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "https:host2", "https://host2/"], 24430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "htto:/host2", "htto:/host2"], 25430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Absolute path input 26430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "/b/c/d", "http://host/b/c/d"], 27430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "\\\\b\\\\c\\\\d", "http://host/b/c/d"], 28430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "/b/../c", "http://host/c"], 29430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a?b#c", "/b/../c", "http://host/c"], 30430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "\\\\b/../c?x#y", "http://host/c?x#y"], 31430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a?b#c", "/b/../c?x#y", "http://host/c?x#y"], 32430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Relative path input 33430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "b", "http://host/b"], 34430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "bc/de", "http://host/bc/de"], 35430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a/", "bc/de?query#ref", "http://host/a/bc/de?query#ref"], 36430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a/", ".", "http://host/a/"], 37430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a/", "..", "http://host/"], 38430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a/", "./..", "http://host/"], 39430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a/", "../.", "http://host/"], 40430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a/", "././.", "http://host/a/"], 41430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a?query#ref", "../../../foo", "http://host/foo"], 42430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Query input 43430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "?foo=bar", "http://host/a?foo=bar"], 44430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a?x=y#z", "?", "http://host/a?"], 45430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a?x=y#z", "?foo=bar#com", "http://host/a?foo=bar#com"], 46430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Ref input 47430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "#ref", "http://host/a#ref"], 48430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a#b", "#", "http://host/a#"], 49430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a?foo=bar#hello", "#bye", "http://host/a?foo=bar#bye"], 50430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Non-hierarchical base: no relative handling. Relative input should 51430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // error, and if a scheme is present, it should be treated as absolute. 52430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["data:foobar", "baz.html", ""], 53430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["data:foobar", "data:baz", "data:baz"], 54430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["data:foobar", "data:/base", "data:/base"], 55430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Non-hierarchical base: absolute input should succeed. 56430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["data:foobar", "http://host/", "http://host/"], 57430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["data:foobar", "http:host", "http://host/"], 58430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Invalid schemes should be treated as relative. 59430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar", "./asd:fgh", "http://foo/asd:fgh"], 60430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar", ":foo", "http://foo/:foo"], 61430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://foo/bar", " hello world", "http://foo/hello%20world"], 62430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["data:asdf", ":foo", ""], 63430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // We should treat semicolons like any other character in URL resolving 64430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", ";foo", "http://host/;foo"], 65430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a;", ";foo", "http://host/;foo"], 66430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", ";/../bar", "http://host/bar"], 67430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // Relative URLs can also be written as "//foo/bar" which is relative to 68430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // the scheme. In this case, it would take the old scheme, so for http 69430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // the example would resolve to "http://foo/bar". 70430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "//another", "http://another/"], 71430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "//another/path?query#ref", "http://another/path?query#ref"], 72430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "///another/path", "http://another/path"], 73430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "//Another\\\\path", "http://another/path"], 74430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "//", "http:"], 75430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // IE will also allow one or the other to be a backslash to get the same 76430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block // behavior. 77430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "\\\\/another/path", "http://another/path"], 78430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block ["http://host/a", "/\\\\Another\\\\path", "http://another/path"], 79430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block]; 80430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block 81430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Blockvar originalBaseURL = canonicalize("."); 82430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block 83430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Blockfor (var i = 0; i < cases.length; ++i) { 84430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block baseURL = cases[i][0]; 85430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block relativeURL = cases[i][1]; 86430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block expectedURL = cases[i][2]; 87430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block setBaseURL(baseURL); 88430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block shouldBe("canonicalize('" + relativeURL + "')", 89430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block "'" + expectedURL + "'"); 90430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block} 91430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block 92430b6b672341c7e8b5e4cfafaaae20315e68701bSteve BlocksetBaseURL(originalBaseURL); 93430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Block 94430b6b672341c7e8b5e4cfafaaae20315e68701bSteve Blockvar successfullyParsed = true; 95