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