--- /dev/null
+Canonicalization of file URLs when the base URL is an http URL
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+FAIL canonicalize('file:c:\\foo\\bar.html') should be file:///C:/foo/bar.html. Was file://c:/foo/bar.html.
+FAIL canonicalize(' File:c|////foo\\bar.html') should be file:///C:////foo/bar.html. Was File://c|////foo/bar.html.
+FAIL canonicalize('file:') should be file:///. Was file:.
+FAIL canonicalize('file:UNChost/path') should be file://unchost/path. Was file://UNChost/path.
+FAIL canonicalize('c:\\foo\\bar') should be file:///C:/foo/bar. Was c:/foo/bar.
+FAIL canonicalize('C|/foo/bar') should be file:///C:/foo/bar. Was http://example.com/mock/C|/foo/bar.
+FAIL canonicalize('/C|\\foo\\bar') should be file:///C:/foo/bar. Was http://example.com/C|/foo/bar.
+FAIL canonicalize('//C|/foo/bar') should be file:///C:/foo/bar. Was http://C|/foo/bar.
+FAIL canonicalize('//server/file') should be file://server/file. Was http://server/file.
+FAIL canonicalize('\\\\server\\file') should be file://server/file. Was http://server/file.
+FAIL canonicalize('/\\server/file') should be file://server/file. Was http://server/file.
+FAIL canonicalize('file:c:foo/bar.html') should be file:///C:/foo/bar.html. Was file://c:foo/bar.html.
+FAIL canonicalize('file:/\\/\\C:\\\\//foo\\bar.html') should be file:///C:////foo/bar.html. Was file:////C:////foo/bar.html.
+PASS canonicalize('file:///foo/bar.txt') is 'file:///foo/bar.txt'
+FAIL canonicalize('FILE:/\\/\\7:\\\\//foo\\bar.html') should be file://7:////foo/bar.html. Was FILE:////7:////foo/bar.html.
+PASS canonicalize('file:filer/home\\me') is 'file://filer/home/me'
+FAIL canonicalize('file:///C:/foo/../../../bar.html') should be file:///C:/bar.html. Was file:///bar.html.
+FAIL canonicalize('file:///C:/asdf#\xc2') should be file:///C:/asdf#�. Was file:///C:/asdf#%C2.
+PASS canonicalize('file:///home/me') is 'file:///home/me'
+FAIL canonicalize('file:c:\\foo\\bar.html') should be file:///c:/foo/bar.html. Was file://c:/foo/bar.html.
+FAIL canonicalize('file:c|//foo\\bar.html') should be file:///c%7C//foo/bar.html. Was file://c|//foo/bar.html.
+FAIL canonicalize('//') should be file:///. Was http:/.
+FAIL canonicalize('///') should be file:///. Was http:/.
+FAIL canonicalize('///test') should be file:///test. Was http:/test.
+FAIL canonicalize('file://test') should be file://test/. Was file://test.
+FAIL canonicalize('file://localhost') should be file://localhost/. Was file:.
+FAIL canonicalize('file://localhost/') should be file://localhost/. Was file:///.
+FAIL canonicalize('file://localhost/test') should be file://localhost/test. Was file:///test.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
--- /dev/null
+description("Canonicalization of file URLs when the base URL is an http URL");
+
+cases = [
+ // Windows-style paths
+ ["file:c:\\\\foo\\\\bar.html", "file:///C:/foo/bar.html"],
+ [" File:c|////foo\\\\bar.html", "file:///C:////foo/bar.html"],
+ ["file:", "file:///"],
+ ["file:UNChost/path", "file://unchost/path"],
+ // CanonicalizeFileURL supports absolute Windows style paths for IE
+ // compatability. Note that the caller must decide that this is a file
+ // URL itself so it can call the file canonicalizer. This is usually
+ // done automatically as part of relative URL resolving.
+ ["c:\\\\foo\\\\bar", "file:///C:/foo/bar"],
+ ["C|/foo/bar", "file:///C:/foo/bar"],
+ ["/C|\\\\foo\\\\bar", "file:///C:/foo/bar"],
+ ["//C|/foo/bar", "file:///C:/foo/bar"],
+ ["//server/file", "file://server/file"],
+ ["\\\\\\\\server\\\\file", "file://server/file"],
+ ["/\\\\server/file", "file://server/file"],
+ // We should preserve the number of slashes after the colon for IE
+ // compatability, except when there is none, in which case we should
+ // add one.
+ ["file:c:foo/bar.html", "file:///C:/foo/bar.html"],
+ ["file:/\\\\/\\\\C:\\\\\\\\//foo\\\\bar.html", "file:///C:////foo/bar.html"],
+ // Three slashes should be non-UNC, even if there is no drive spec (IE
+ // does this, which makes the resulting request invalid).
+ ["file:///foo/bar.txt", "file:///foo/bar.txt"],
+ // TODO(brettw) we should probably fail for invalid host names, which
+ // would change the expected result on this test. We also currently allow
+ // colon even though it's probably invalid, because its currently the
+ // "natural" result of the way the canonicalizer is written. There doesn't
+ // seem to be a strong argument for why allowing it here would be bad, so
+ // we just tolerate it and the load will fail later.
+ ["FILE:/\\\\/\\\\7:\\\\\\\\//foo\\\\bar.html", "file://7:////foo/bar.html"],
+ ["file:filer/home\\\\me", "file://filer/home/me"],
+ // Make sure relative paths can't go above the "C:"
+ ["file:///C:/foo/../../../bar.html", "file:///C:/bar.html"],
+ // Busted refs shouldn't make the whole thing fail.
+ ["file:///C:/asdf#\\xc2", "file:///C:/asdf#\\xef\\xbf\\xbd"],
+
+ // Unix-style paths
+ ["file:///home/me", "file:///home/me"],
+ // Windowsy ones should get still treated as Unix-style.
+ ["file:c:\\\\foo\\\\bar.html", "file:///c:/foo/bar.html"],
+ ["file:c|//foo\\\\bar.html", "file:///c%7C//foo/bar.html"],
+ // file: tests from WebKit (LayoutTests/fast/loader/url-parse-1.html)
+ ["//", "file:///"],
+ ["///", "file:///"],
+ ["///test", "file:///test"],
+ ["file://test", "file://test/"],
+ ["file://localhost", "file://localhost/"],
+ ["file://localhost/", "file://localhost/"],
+ ["file://localhost/test", "file://localhost/test"],
+];
+
+var originalBaseURL = canonicalize(".");
+setBaseURL("http://example.com/mock/path");
+
+for (var i = 0; i < cases.length; ++i) {
+ test_vector = cases[i][0];
+ expected_result = cases[i][1];
+ shouldBe("canonicalize('" + test_vector + "')",
+ "'" + expected_result + "'");
+}
+
+setBaseURL(originalBaseURL);
+
+var successfullyParsed = true;