| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script> |
| function test() |
| { |
| let suite = InspectorTest.createSyncSuite("URLUtilities"); |
| |
| suite.addTestCase({ |
| name: "parseURL", |
| test() { |
| function testInvalid(url) { |
| InspectorTest.log(""); |
| InspectorTest.log("Test Invalid: " + url); |
| InspectorTest.expectThat(parseURL(url).scheme === null, "Should not be a complete URL"); |
| |
| try { |
| new URL(url); |
| InspectorTest.fail("URL constructor thinks this is valid"); |
| } catch (e) { |
| InspectorTest.pass("URL constructor thinks this is invalid"); |
| } |
| } |
| |
| function testValid(url, expected) { |
| InspectorTest.log(""); |
| InspectorTest.log("Test Valid: " + url); |
| |
| let {scheme: expectedScheme, userinfo: expectedUserInfo, host: expectedHost, port: expectedPort, path: expectedPath, queryString: expectedQueryString, fragment: expectedFragment, lastPathComponent: expectedLastPathComponent} = expected; |
| let {scheme: actualScheme, userinfo: actualUserInfo, host: actualHost, port: actualPort, path: actualPath, queryString: actualQueryString, fragment: actualFragment, lastPathComponent: actualLastPathComponent} = parseURL(url); |
| |
| InspectorTest.expectEqual(actualScheme, expectedScheme, `scheme should be: '${expectedScheme}'`); |
| InspectorTest.expectEqual(actualUserInfo, expectedUserInfo, `userinfo should be: '${expectedUserInfo}'`); |
| InspectorTest.expectEqual(actualHost, expectedHost, `host should be: '${expectedHost}'`); |
| InspectorTest.expectEqual(actualPort, expectedPort, `port should be: '${expectedPort}'`); |
| InspectorTest.expectEqual(actualPath, expectedPath, `path should be: '${expectedPath}'`); |
| InspectorTest.expectEqual(actualQueryString, expectedQueryString, `queryString should be: '${expectedQueryString}'`); |
| InspectorTest.expectEqual(actualFragment, expectedFragment, `fragment should be: '${expectedFragment}'`); |
| InspectorTest.expectEqual(actualLastPathComponent, expectedLastPathComponent, `lastPathComponent should be: '${expectedLastPathComponent}'`); |
| } |
| |
| testInvalid("a"); |
| testInvalid("/http://example.com"); |
| |
| testValid("http://example.com", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: null, |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http://example.com/", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/", |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http://example.com:80/", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: 80, |
| path: "/", |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http://example.com/path/to/page.html", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/path/to/page.html", |
| queryString: null, |
| fragment: null, |
| lastPathComponent: "page.html", |
| }); |
| |
| testValid("http://example.com/path/to/page.html?", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/path/to/page.html", |
| queryString: "", |
| fragment: null, |
| lastPathComponent: "page.html", |
| }); |
| |
| testValid("http://example.com/path/to/page.html?a=1", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/path/to/page.html", |
| queryString: "a=1", |
| fragment: null, |
| lastPathComponent: "page.html", |
| }); |
| |
| testValid("http://example.com/path/to/page.html?a=1&b=2", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/path/to/page.html", |
| queryString: "a=1&b=2", |
| fragment: null, |
| lastPathComponent: "page.html", |
| }); |
| |
| testValid("http://example.com/path/to/page.html?a=1&b=2#test", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/path/to/page.html", |
| queryString: "a=1&b=2", |
| fragment: "test", |
| lastPathComponent: "page.html", |
| }); |
| |
| testValid("http://example.com:123/path/to/page.html?a=1&b=2#test", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: 123, |
| path: "/path/to/page.html", |
| queryString: "a=1&b=2", |
| fragment: "test", |
| lastPathComponent: "page.html", |
| }); |
| |
| testValid("http://example.com/path/to/page.html#test", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/path/to/page.html", |
| queryString: null, |
| fragment: "test", |
| lastPathComponent: "page.html", |
| }); |
| |
| testValid("http://example.com#alpha/beta", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: null, |
| queryString: null, |
| fragment: "alpha/beta", |
| lastPathComponent: null, |
| }); |
| |
| testValid("app-specific://example.com", { |
| scheme: "app-specific", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: null, |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http://example", { |
| scheme: "http", |
| userinfo: null, |
| host: "example", |
| port: null, |
| path: null, |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http://my.example.com", { |
| scheme: "http", |
| userinfo: null, |
| host: "my.example.com", |
| port: null, |
| path: null, |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| // Data URLs just spit back the scheme. |
| testValid("data:text/plain,test", { |
| scheme: "data", |
| userinfo: null, |
| host: null, |
| port: null, |
| path: null, |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| // FIXME: <https://webkit.org/b/165155> Web Inspector: Use URL constructor to better handle all kinds of URLs |
| InspectorTest.log(""); |
| InspectorTest.log("-- Known issues <https://webkit.org/b/165155>"); |
| |
| testInvalid("http://"); |
| testInvalid("http://example.com:999999999"); |
| |
| testValid("http:example.com/", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/", |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http:/example.com/", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/", |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http://user:pass@example.com/", { |
| scheme: "http", |
| userinfo: "user:pass", |
| host: "example.com", |
| port: null, |
| path: "/", |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http://user@pass:example.com/", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: "/", |
| queryString: null, |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| testValid("http://example.com?key=alpha/beta", { |
| scheme: "http", |
| userinfo: null, |
| host: "example.com", |
| port: null, |
| path: null, |
| queryString: "key=alpha/beta", |
| fragment: null, |
| lastPathComponent: null, |
| }); |
| |
| return true; |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "parseDataURL", |
| test() { |
| function testInvalid(url) { |
| InspectorTest.log(""); |
| InspectorTest.log("Test Invalid: " + url); |
| InspectorTest.expectThat(parseDataURL(url) === null, "Should not be a data URL"); |
| } |
| |
| function testValid(url, expected) { |
| InspectorTest.log(""); |
| InspectorTest.log("Test Valid: " + url); |
| |
| let {mimeType: expectedMimeType, charset: expectedCharset, base64: expectedBase64, data: expectedData, content: expectedContent} = expected; |
| let {mimeType: actualMimeType, charset: actualCharset, base64: actualBase64, data: actualData, scheme: actualScheme} = parseDataURL(url); |
| let actualContent = actualData; |
| if (actualBase64) |
| actualContent = atob(actualContent); |
| |
| InspectorTest.expectEqual(actualScheme, "data", "scheme should always be 'data'"); |
| InspectorTest.expectEqual(actualMimeType, expectedMimeType, `mimeType should be: '${expectedMimeType}'`); |
| InspectorTest.expectEqual(actualCharset, expectedCharset, `charset should be: '${expectedCharset}'`); |
| InspectorTest.expectEqual(actualBase64, expectedBase64, `base64 should be: '${expectedBase64}'`); |
| InspectorTest.expectEqual(actualData, expectedData, `data should be: '${expectedData}'`); |
| if (expectedContent !== null) |
| InspectorTest.expectThat(actualContent === expectedContent, `Resolved content should be: '${expectedContent}'`); |
| } |
| |
| testInvalid("https://webkit.org"); |
| testInvalid("data:"); |
| testInvalid("data:text/plain;test"); |
| testInvalid("data:text/plain;base64;test"); |
| |
| testValid("data:,", { |
| mimeType: "text/plain", |
| charset: "US-ASCII", |
| base64: false, |
| data: "", |
| content: "", |
| }); |
| |
| testValid("data:,test", { |
| mimeType: "text/plain", |
| charset: "US-ASCII", |
| base64: false, |
| data: "test", |
| content: "test", |
| }); |
| |
| testValid("data:text/plain,test", { |
| mimeType: "text/plain", |
| charset: "US-ASCII", |
| base64: false, |
| data: "test", |
| content: "test", |
| }); |
| |
| testValid("data:text/plain;charset=TEST,test", { |
| mimeType: "text/plain", |
| charset: "TEST", |
| base64: false, |
| data: "test", |
| content: "test", |
| }); |
| |
| testValid("data:application/json,{\"name\":\"test\",\"list\":[1,2,3]}", { |
| mimeType: "application/json", |
| charset: "US-ASCII", |
| base64: false, |
| data: '{"name":"test","list":[1,2,3]}', |
| content: '{"name":"test","list":[1,2,3]}', |
| }); |
| |
| InspectorTest.assert(encodeURIComponent('{"name":"test","list":[1,2,3]}') === "%7B%22name%22%3A%22test%22%2C%22list%22%3A%5B1%2C2%2C3%5D%7D"); |
| testValid("data:application/json,%7B%22name%22%3A%22test%22%2C%22list%22%3A%5B1%2C2%2C3%5D%7D", { |
| mimeType: "application/json", |
| charset: "US-ASCII", |
| base64: false, |
| data: '{"name":"test","list":[1,2,3]}', |
| content: '{"name":"test","list":[1,2,3]}', |
| }); |
| |
| testValid("data:application/json;base64,eyJuYW1lIjoidGVzdCIsImxpc3QiOlsxLDIsM119", { |
| mimeType: "application/json", |
| charset: "US-ASCII", |
| base64: true, |
| data: "eyJuYW1lIjoidGVzdCIsImxpc3QiOlsxLDIsM119", |
| content: '{"name":"test","list":[1,2,3]}', |
| }); |
| |
| testValid("data:application/json;charset=utf-8;base64,eyJuYW1lIjoidGVzdCIsImxpc3QiOlsxLDIsM119", { |
| mimeType: "application/json", |
| charset: "utf-8", |
| base64: true, |
| data: "eyJuYW1lIjoidGVzdCIsImxpc3QiOlsxLDIsM119", |
| content: '{"name":"test","list":[1,2,3]}', |
| }); |
| |
| testValid("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", { |
| mimeType: "image/png", |
| charset: "US-ASCII", |
| base64: true, |
| data: "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", |
| content: null, // Skip content check. |
| }); |
| |
| return true; |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "WI.h2Authority", |
| test() { |
| function test(url, expected) { |
| let components = parseURL(url); |
| InspectorTest.expectEqual(WI.h2Authority(components), expected, `HTTP/2 :authority of '${url}' should be '${expected}'.`); |
| } |
| |
| test("http://example.com", "example.com"); |
| test("https://example.com", "example.com"); |
| test("ftp://example.com", "example.com"); |
| |
| test("http://example.com/foo", "example.com"); |
| test("https://example.com/foo", "example.com"); |
| test("ftp://example.com/foo", "example.com"); |
| |
| test("http://example.com:123", "example.com:123"); |
| test("https://example.com:123", "example.com:123"); |
| test("ftp://example.com:123", "example.com:123"); |
| |
| test("ftp://user:pass@example.com/foo", "user:pass@example.com"); |
| test("http://user:pass@example.com/foo", "example.com"); |
| test("https://user:pass@example.com/foo", "example.com"); |
| |
| test("ftp://user:pass@example.com:123/foo", "user:pass@example.com:123"); |
| test("http://user:pass@example.com:123/foo", "example.com:123"); |
| test("https://user:pass@example.com:123/foo", "example.com:123"); |
| |
| return true; |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "WI.h2Path", |
| test() { |
| function test(url, expected) { |
| let components = parseURL(url); |
| InspectorTest.expectEqual(WI.h2Path(components), expected, `HTTP/2 :path of '${url}' should be '${expected}'.`); |
| } |
| |
| test("http://example.com", "/"); |
| test("https://example.com", "/"); |
| test("ftp://example.com", ""); |
| |
| test("http://example.com/foo", "/foo"); |
| test("https://example.com/foo", "/foo"); |
| test("ftp://example.com/foo", "/foo"); |
| test("http://example.com/foo#hash", "/foo"); |
| test("https://example.com/foo#hash", "/foo"); |
| test("ftp://example.com/foo#hash", "/foo"); |
| |
| test("http://example.com/foo/bar.js", "/foo/bar.js"); |
| test("https://example.com/foo/bar.js", "/foo/bar.js"); |
| test("ftp://example.com/foo/bar.js", "/foo/bar.js"); |
| test("http://example.com/foo/bar.js#hash", "/foo/bar.js"); |
| test("https://example.com/foo/bar.js#hash", "/foo/bar.js"); |
| test("ftp://example.com/foo/bar.js#hash", "/foo/bar.js"); |
| |
| test("http://example.com/?t=1", "/?t=1"); |
| test("https://example.com/?t=1", "/?t=1"); |
| test("ftp://example.com/?t=1", "/?t=1"); |
| |
| test("http://example.com/foo/bar.js?t=1", "/foo/bar.js?t=1"); |
| test("https://example.com/foo/bar.js?t=1", "/foo/bar.js?t=1"); |
| test("ftp://example.com/foo/bar.js?t=1", "/foo/bar.js?t=1"); |
| test("http://example.com/foo/bar.js?t=1#hash", "/foo/bar.js?t=1"); |
| test("https://example.com/foo/bar.js?t=1#hash", "/foo/bar.js?t=1"); |
| test("ftp://example.com/foo/bar.js?t=1#hash", "/foo/bar.js?t=1"); |
| |
| return true; |
| } |
| }); |
| |
| suite.runTestCasesAndFinish(); |
| } |
| </script> |
| </head> |
| <body onLoad="runTest()"> |
| </body> |
| </html> |