description("Canonicalization of file URLs"); 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("file:///tmp/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;