| Index: test/url.js |
| =================================================================== |
| --- a/test/url.js |
| +++ b/test/url.js |
| @@ -12,512 +12,473 @@ |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| "use strict"; |
| +const assert = require("assert"); |
| // Only starting NodeJS 10 that URL is in the global space. |
| const {URL} = require("url"); |
| const {createSandbox} = require("./_common"); |
| - |
| const publicSuffixes = require("../data/publicSuffixList.json"); |
| let parseURL = null; |
| let normalizeHostname = null; |
| let domainSuffixes = null; |
| let isThirdParty = null; |
| let getBaseDomain = null; |
| -exports.setUp = function(callback) |
| -{ |
| - let sandboxedRequire = createSandbox({ |
| - extraExports: { |
| - domain: ["getBaseDomain"] |
| - } |
| - }); |
| - ( |
| - {parseURL, normalizeHostname, domainSuffixes, isThirdParty, |
| - getBaseDomain} = sandboxedRequire("../lib/url") |
| - ); |
| - |
| - callback(); |
| -}; |
| - |
| -function hostnameToURL(hostname) |
| -{ |
| - return new URL("http://" + hostname); |
| -} |
| - |
| -function testURLParsing(test, url) |
| -{ |
| - // Note: The function expects a normalized URL. |
| - // e.g. "http:example.com:80?foo" should already be normalized to |
| - // "http://example.com/?foo". If not, the tests will fail. |
| - let urlInfo = parseURL(url); |
| - |
| - // We need to ensure only that our implementation matches that of the URL |
| - // object. |
| - let urlObject = new URL(url); |
| - |
| - test.equal(urlInfo.href, urlObject.href); |
| - test.equal(urlInfo.protocol, urlObject.protocol); |
| - test.equal(urlInfo.hostname, urlObject.hostname); |
| - |
| - test.equal(urlInfo.toString(), urlObject.toString()); |
| - test.equal(String(urlInfo), String(urlObject)); |
| - test.equal(urlInfo + "", urlObject + ""); |
| -} |
| - |
| -function testThirdParty(test, requestHostname, documentHostname, expected, |
| - message) |
| -{ |
| - test.equal( |
| - isThirdParty( |
| - hostnameToURL(requestHostname), |
| - |
| - // Chrome's URL object normalizes IP addresses. So some test |
| - // will fail if we don't normalize the document host as well. |
| - hostnameToURL(documentHostname).hostname |
| - ), |
| - expected, |
| - message |
| - ); |
| -} |
| - |
| -exports.testParseURL = function(test) |
| +describe("URL", () => |
| { |
| - testURLParsing(test, "https://example.com/"); |
| - testURLParsing(test, "https://example.com/foo"); |
| - testURLParsing(test, "https://example.com/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "https://example.com/foo/bar?https://random/foo/bar" |
| - ); |
| + beforeEach(() => |
| + { |
| + let sandboxedRequire = createSandbox({ |
| + extraExports: { |
| + domain: ["getBaseDomain"] |
| + } |
| + }); |
| + ( |
| + {parseURL, normalizeHostname, domainSuffixes, isThirdParty, |
| + getBaseDomain} = sandboxedRequire("../lib/url") |
| + ); |
| + }); |
| - testURLParsing(test, "https://example.com:8080/"); |
| - testURLParsing(test, "https://example.com:8080/foo"); |
| - testURLParsing(test, "https://example.com:8080/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "https://example.com:8080/foo/bar?https://random/foo/bar" |
| - ); |
| + it("Normalize Hostname", () => |
| + { |
| + assert.equal(normalizeHostname("example.com"), "example.com"); |
| + assert.equal(normalizeHostname("example.com."), "example.com"); |
| + assert.equal(normalizeHostname("example.com.."), "example.com"); |
| + assert.equal(normalizeHostname("example.com..."), "example.com"); |
| + |
| + assert.equal(normalizeHostname("Example.com"), "example.com"); |
| + assert.equal(normalizeHostname("ExaMple.Com"), "example.com"); |
| + assert.equal(normalizeHostname("ExaMple.Com.."), "example.com"); |
| - testURLParsing(test, "http://localhost/"); |
| - testURLParsing(test, "http://localhost/foo"); |
| - testURLParsing(test, "http://localhost/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "http://localhost/foo/bar?https://random/foo/bar" |
| - ); |
| + assert.equal(normalizeHostname("192.168.1.1"), "192.168.1.1"); |
| + assert.equal(normalizeHostname("192.168.1.1."), "192.168.1.1"); |
| + |
| + assert.equal(normalizeHostname("2001:0db8:85a3:0000:0000:8a2e:0370:7334"), |
| + "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); |
| + assert.equal(normalizeHostname("2001:0db8:85a3:0000:0000:8a2e:0370:7334."), |
| + "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); |
| + assert.equal(normalizeHostname("2001:0DB8:85A3:0000:0000:8A2E:0370:7334"), |
| + "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); |
| + }); |
| - testURLParsing(test, "https://user@example.com/"); |
| - testURLParsing(test, "https://user@example.com/foo"); |
| - testURLParsing(test, "https://user@example.com/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "https://user@example.com/foo/bar?https://random/foo/bar" |
| - ); |
| + it("Domain Suffixes", () => |
| + { |
| + assert.deepEqual([...domainSuffixes("localhost")], ["localhost"]); |
| + assert.deepEqual([...domainSuffixes("example.com")], ["example.com", "com"]); |
| + assert.deepEqual([...domainSuffixes("www.example.com")], |
| + ["www.example.com", "example.com", "com"]); |
| + assert.deepEqual([...domainSuffixes("www.example.co.in")], |
| + ["www.example.co.in", "example.co.in", "co.in", "in"]); |
| + |
| + // With blank. |
| + assert.deepEqual([...domainSuffixes("localhost", true)], ["localhost", ""]); |
| + assert.deepEqual([...domainSuffixes("example.com", true)], |
| + ["example.com", "com", ""]); |
| + assert.deepEqual([...domainSuffixes("www.example.com", true)], |
| + ["www.example.com", "example.com", "com", ""]); |
| + assert.deepEqual([...domainSuffixes("www.example.co.in", true)], |
| + ["www.example.co.in", "example.co.in", "co.in", "in", ""]); |
| - testURLParsing(test, "https://user@example.com:8080/"); |
| - testURLParsing(test, "https://user@example.com:8080/foo"); |
| - testURLParsing(test, "https://user@example.com:8080/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "https://user@example.com:8080/foo/bar?https://random/foo/bar" |
| - ); |
| - |
| - testURLParsing(test, "https://user:pass@example.com/"); |
| - testURLParsing(test, "https://user:pass@example.com/foo"); |
| - testURLParsing(test, "https://user:pass@example.com/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "https://user:pass@example.com/foo/bar?https://random/foo/bar" |
| - ); |
| + // Quirks and edge cases. |
| + assert.deepEqual([...domainSuffixes("")], []); |
| + assert.deepEqual([...domainSuffixes(".")], ["."]); |
| + assert.deepEqual([...domainSuffixes(".localhost")], |
| + [".localhost", "localhost"]); |
| + assert.deepEqual([...domainSuffixes(".example.com")], |
| + [".example.com", "example.com", "com"]); |
| + assert.deepEqual([...domainSuffixes("localhost.")], |
| + ["localhost."]); |
| + assert.deepEqual([...domainSuffixes("example.com.")], |
| + ["example.com.", "com."]); |
| + assert.deepEqual([...domainSuffixes("..localhost")], |
| + ["..localhost", ".localhost", "localhost"]); |
| + assert.deepEqual( |
| + [...domainSuffixes("..example..com")], |
| + ["..example..com", ".example..com", "example..com", ".com", "com"] |
| + ); |
| + assert.deepEqual([...domainSuffixes("localhost..")], ["localhost..", "."]); |
| + assert.deepEqual([...domainSuffixes("example..com..")], |
| + ["example..com..", ".com..", "com..", "."]); |
| + }); |
| - testURLParsing(test, "https://user:pass@example.com:8080/"); |
| - testURLParsing(test, "https://user:pass@example.com:8080/foo"); |
| - testURLParsing(test, "https://user:pass@example.com:8080/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "https://user:pass@example.com:8080/foo/bar?https://random/foo/bar" |
| - ); |
| + it("URL parsing", () => |
| + { |
| + function testURLParsing(url) |
| + { |
| + // Note: The function expects a normalized URL. |
| + // e.g. "http:example.com:80?foo" should already be normalized to |
| + // "http://example.com/?foo". If not, the tests will fail. |
| + let urlInfo = parseURL(url); |
| + |
| + // We need to ensure only that our implementation matches that of the URL |
| + // object. |
| + let urlObject = new URL(url); |
| + |
| + assert.equal(urlInfo.href, urlObject.href); |
| + assert.equal(urlInfo.protocol, urlObject.protocol); |
| + assert.equal(urlInfo.hostname, urlObject.hostname); |
| - testURLParsing(test, "https://us%40er:pa%40ss@example.com/"); |
| - testURLParsing(test, "https://us%40er:pa%40ss@example.com/foo"); |
| - testURLParsing(test, "https://us%40er:pa%40ss@example.com/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "https://us%40er:pa%40ss@example.com/foo/bar?https://random/foo/bar" |
| - ); |
| + assert.equal(urlInfo.toString(), urlObject.toString()); |
| + assert.equal(String(urlInfo), String(urlObject)); |
| + assert.equal(urlInfo + "", urlObject + ""); |
| + } |
| + |
| + testURLParsing("https://example.com/"); |
| + testURLParsing("https://example.com/foo"); |
| + testURLParsing("https://example.com/foo/bar"); |
| + testURLParsing( |
| + "https://example.com/foo/bar?https://random/foo/bar" |
| + ); |
| + |
| + testURLParsing("https://example.com:8080/"); |
| + testURLParsing("https://example.com:8080/foo"); |
| + testURLParsing("https://example.com:8080/foo/bar"); |
| + testURLParsing( |
| + "https://example.com:8080/foo/bar?https://random/foo/bar" |
| + ); |
| - testURLParsing(test, "https://us%40er:pa%40ss@example.com:8080/"); |
| - testURLParsing(test, "https://us%40er:pa%40ss@example.com:8080/foo"); |
| - testURLParsing(test, "https://us%40er:pa%40ss@example.com:8080/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "https://us%40er:pa%40ss@example.com:8080/foo/bar?https://random/foo/bar" |
| - ); |
| + testURLParsing("http://localhost/"); |
| + testURLParsing("http://localhost/foo"); |
| + testURLParsing("http://localhost/foo/bar"); |
| + testURLParsing( |
| + "http://localhost/foo/bar?https://random/foo/bar" |
| + ); |
| + |
| + testURLParsing("https://user@example.com/"); |
| + testURLParsing("https://user@example.com/foo"); |
| + testURLParsing("https://user@example.com/foo/bar"); |
| + testURLParsing( |
| + "https://user@example.com/foo/bar?https://random/foo/bar" |
| + ); |
| + |
| + testURLParsing("https://user@example.com:8080/"); |
| + testURLParsing("https://user@example.com:8080/foo"); |
| + testURLParsing("https://user@example.com:8080/foo/bar"); |
| + testURLParsing( |
| + "https://user@example.com:8080/foo/bar?https://random/foo/bar" |
| + ); |
| - testURLParsing(test, "http://192.168.1.1/"); |
| - testURLParsing(test, "http://192.168.1.1/foo"); |
| - testURLParsing(test, "http://192.168.1.1/foo/bar"); |
| - testURLParsing( |
| - test, |
| - "http://192.168.1.1/foo/bar?https://random/foo/bar" |
| - ); |
| - testURLParsing( |
| - test, |
| - "http://192.168.1.1:8080/foo/bar?https://random/foo/bar" |
| - ); |
| - testURLParsing( |
| - test, |
| - "http://user@192.168.1.1:8080/foo/bar?https://random/foo/bar" |
| - ); |
| - testURLParsing( |
| - test, |
| - "http://user:pass@192.168.1.1:8080/foo/bar?https://random/foo/bar" |
| - ); |
| + testURLParsing("https://user:pass@example.com/"); |
| + testURLParsing("https://user:pass@example.com/foo"); |
| + testURLParsing("https://user:pass@example.com/foo/bar"); |
| + testURLParsing( |
| + "https://user:pass@example.com/foo/bar?https://random/foo/bar" |
| + ); |
| + |
| + testURLParsing("https://user:pass@example.com:8080/"); |
| + testURLParsing("https://user:pass@example.com:8080/foo"); |
| + testURLParsing("https://user:pass@example.com:8080/foo/bar"); |
| + testURLParsing( |
| + "https://user:pass@example.com:8080/foo/bar?https://random/foo/bar" |
| + ); |
| - testURLParsing(test, "http://[2001:db8:0:42:0:8a2e:370:7334]/"); |
| - testURLParsing(test, "http://[2001:db8:0:42:0:8a2e:370:7334]/foo"); |
| - testURLParsing( |
| - test, |
| - "http://[2001:db8:0:42:0:8a2e:370:7334]/foo/bar" |
| - ); |
| - testURLParsing( |
| - test, |
| - "http://[2001:db8:0:42:0:8a2e:370:7334]/foo/bar?https://random/foo/bar" |
| - ); |
| - testURLParsing( |
| - test, |
| - "http://[2001:db8:0:42:0:8a2e:370:7334]:8080/foo/bar?https://random/foo/bar" |
| - ); |
| - testURLParsing( |
| - test, |
| - "http://user@[2001:db8:0:42:0:8a2e:370:7334]:8080/foo/bar?https://random/foo/bar" |
| - ); |
| - testURLParsing( |
| - test, |
| - "http://user:pass@[2001:db8:0:42:0:8a2e:370:7334]:8080/foo/bar?https://random/foo/bar" |
| - ); |
| + testURLParsing("https://us%40er:pa%40ss@example.com/"); |
| + testURLParsing("https://us%40er:pa%40ss@example.com/foo"); |
| + testURLParsing("https://us%40er:pa%40ss@example.com/foo/bar"); |
| + testURLParsing( |
| + "https://us%40er:pa%40ss@example.com/foo/bar?https://random/foo/bar" |
| + ); |
| - testURLParsing(test, "ftp://user:pass@example.com:8021/"); |
| - testURLParsing(test, "ftp://user:pass@example.com:8021/foo"); |
| - testURLParsing(test, "ftp://user:pass@example.com:8021/foo/bar"); |
| + testURLParsing("https://us%40er:pa%40ss@example.com:8080/"); |
| + testURLParsing("https://us%40er:pa%40ss@example.com:8080/foo"); |
| + testURLParsing("https://us%40er:pa%40ss@example.com:8080/foo/bar"); |
| + testURLParsing( |
| + "https://us%40er:pa%40ss@example.com:8080/foo/bar?https://random/foo/bar" |
| + ); |
| - testURLParsing(test, "about:blank"); |
| - testURLParsing(test, "chrome://extensions"); |
| - testURLParsing( |
| - test, |
| - "chrome-extension://bhignfpcigccnlfapldlodmhlidjaion/options.html" |
| - ); |
| - testURLParsing(test, "mailto:john.doe@mail.example.com"); |
| - |
| - testURLParsing(test, "news:newsgroup"); |
| - testURLParsing(test, "news:message-id"); |
| - testURLParsing(test, "nntp://example.com:8119/newsgroup"); |
| - testURLParsing(test, "nntp://example.com:8119/message-id"); |
| - |
| - testURLParsing(test, "data:,"); |
| - testURLParsing( |
| - test, |
| - "data:text/vnd-example+xyz;foo=bar;base64,R0lGODdh" |
| - ); |
| - testURLParsing( |
| - test, |
| - "data:text/plain;charset=UTF-8;page=21,the%20data:1234,5678" |
| - ); |
| - |
| - testURLParsing(test, "javascript:"); |
| - testURLParsing(test, "javascript:alert();"); |
| - testURLParsing(test, "javascript:foo/bar/"); |
| - testURLParsing(test, "javascript://foo/bar/"); |
| - |
| - testURLParsing(test, "file:///dev/random"); |
| + testURLParsing("http://192.168.1.1/"); |
| + testURLParsing("http://192.168.1.1/foo"); |
| + testURLParsing("http://192.168.1.1/foo/bar"); |
| + testURLParsing( |
| + "http://192.168.1.1/foo/bar?https://random/foo/bar" |
| + ); |
| + testURLParsing( |
| + "http://192.168.1.1:8080/foo/bar?https://random/foo/bar" |
| + ); |
| + testURLParsing( |
| + "http://user@192.168.1.1:8080/foo/bar?https://random/foo/bar" |
| + ); |
| + testURLParsing( |
| + "http://user:pass@192.168.1.1:8080/foo/bar?https://random/foo/bar" |
| + ); |
| - testURLParsing(test, "wss://example.com/"); |
| - testURLParsing(test, "wss://example.com:8080/"); |
| - testURLParsing(test, "wss://user@example.com:8080/"); |
| - testURLParsing(test, "wss://user:pass@example.com:8080/"); |
| + testURLParsing("http://[2001:db8:0:42:0:8a2e:370:7334]/"); |
| + testURLParsing("http://[2001:db8:0:42:0:8a2e:370:7334]/foo"); |
| + testURLParsing( |
| + "http://[2001:db8:0:42:0:8a2e:370:7334]/foo/bar" |
| + ); |
| + testURLParsing( |
| + "http://[2001:db8:0:42:0:8a2e:370:7334]/foo/bar?https://random/foo/bar" |
| + ); |
| + testURLParsing( |
| + "http://[2001:db8:0:42:0:8a2e:370:7334]:8080/foo/bar?https://random/foo/bar" |
| + ); |
| + testURLParsing( |
| + "http://user@[2001:db8:0:42:0:8a2e:370:7334]:8080/foo/bar?https://random/foo/bar" |
| + ); |
| + testURLParsing( |
| + "http://user:pass@[2001:db8:0:42:0:8a2e:370:7334]:8080/foo/bar?https://random/foo/bar" |
| + ); |
| - testURLParsing(test, "stuns:stuns.example.com/"); |
| - testURLParsing(test, "stuns:stuns.example.com:8080/"); |
| - testURLParsing(test, "stuns:user@stuns.example.com:8080/"); |
| - testURLParsing(test, "stuns:user:pass@stuns.example.com:8080/"); |
| - |
| - // The following tests are based on |
| - // https://cs.chromium.org/chromium/src/url/gurl_unittest.cc?rcl=9ec7bc85e0f6a0bf28eff6b2eca678067da547e9 |
| - // Note: We do not check for "canonicalization" (normalization). parseURL() |
| - // should be used with normalized URLs only. |
| - |
| - testURLParsing(test, "something:///example.com/"); |
| - testURLParsing(test, "something://example.com/"); |
| + testURLParsing("ftp://user:pass@example.com:8021/"); |
| + testURLParsing("ftp://user:pass@example.com:8021/foo"); |
| + testURLParsing("ftp://user:pass@example.com:8021/foo/bar"); |
| - testURLParsing(test, "file:///C:/foo.txt"); |
| - testURLParsing(test, "file://server/foo.txt"); |
| + testURLParsing("about:blank"); |
| + testURLParsing("chrome://extensions"); |
| + testURLParsing( |
| + "chrome-extension://bhignfpcigccnlfapldlodmhlidjaion/options.html" |
| + ); |
| + testURLParsing("mailto:john.doe@mail.example.com"); |
| - testURLParsing(test, "http://user:pass@example.com:99/foo;bar?q=a#ref"); |
| - |
| - testURLParsing(test, "http://user:%40!$&'()*+,%3B%3D%3A@example.com:12345/"); |
| + testURLParsing("news:newsgroup"); |
| + testURLParsing("news:message-id"); |
| + testURLParsing("nntp://example.com:8119/newsgroup"); |
| + testURLParsing("nntp://example.com:8119/message-id"); |
| - testURLParsing(test, "filesystem:http://example.com/temporary/"); |
| - testURLParsing( |
| - test, |
| - "filesystem:http://user:%40!$&'()*+,%3B%3D%3A@example.com:12345/" |
| - ); |
| + testURLParsing("data:,"); |
| + testURLParsing( |
| + "data:text/vnd-example+xyz;foo=bar;base64,R0lGODdh" |
| + ); |
| + testURLParsing( |
| + "data:text/plain;charset=UTF-8;page=21,the%20data:1234,5678" |
| + ); |
| - testURLParsing(test, "javascript:window.alert('hello, world');"); |
| - testURLParsing(test, "javascript:#"); |
| + testURLParsing("javascript:"); |
| + testURLParsing("javascript:alert();"); |
| + testURLParsing("javascript:foo/bar/"); |
| + testURLParsing("javascript://foo/bar/"); |
| - testURLParsing( |
| - test, |
| - "blob:https://example.com/7ce70a1e-9681-4148-87a8-43cb9171b994" |
| - ); |
| + testURLParsing("file:///dev/random"); |
| - testURLParsing(test, "http://[2001:db8::1]/"); |
| - testURLParsing(test, "http://[2001:db8::1]:8080/"); |
| - testURLParsing(test, "http://[::]:8080/"); |
| - |
| - testURLParsing(test, "not-a-standard-scheme:this is arbitrary content"); |
| - testURLParsing(test, "view-source:http://example.com/path"); |
| + testURLParsing("wss://example.com/"); |
| + testURLParsing("wss://example.com:8080/"); |
| + testURLParsing("wss://user@example.com:8080/"); |
| + testURLParsing("wss://user:pass@example.com:8080/"); |
| - testURLParsing( |
| - test, |
| - "data:text/html,Question?%3Cdiv%20style=%22color:%20#bad%22%3Eidea%3C/div%3E" |
| - ); |
| + testURLParsing("stuns:stuns.example.com/"); |
| + testURLParsing("stuns:stuns.example.com:8080/"); |
| + testURLParsing("stuns:user@stuns.example.com:8080/"); |
| + testURLParsing("stuns:user:pass@stuns.example.com:8080/"); |
| - test.done(); |
| -}; |
| + // The following tests are based on |
| + // https://cs.chromium.org/chromium/src/url/gurl_unittest.cc?rcl=9ec7bc85e0f6a0bf28eff6b2eca678067da547e9 |
| + // Note: We do not check for "canonicalization" (normalization). parseURL() |
| + // should be used with normalized URLs only. |
| -exports.testNormalizeHostname = function(test) |
| -{ |
| - test.equal(normalizeHostname("example.com"), "example.com"); |
| - test.equal(normalizeHostname("example.com."), "example.com"); |
| - test.equal(normalizeHostname("example.com.."), "example.com"); |
| - test.equal(normalizeHostname("example.com..."), "example.com"); |
| + testURLParsing("something:///example.com/"); |
| + testURLParsing("something://example.com/"); |
| - test.equal(normalizeHostname("Example.com"), "example.com"); |
| - test.equal(normalizeHostname("ExaMple.Com"), "example.com"); |
| - test.equal(normalizeHostname("ExaMple.Com.."), "example.com"); |
| + testURLParsing("file:///C:/foo.txt"); |
| + testURLParsing("file://server/foo.txt"); |
| + |
| + testURLParsing("http://user:pass@example.com:99/foo;bar?q=a#ref"); |
| - test.equal(normalizeHostname("192.168.1.1"), "192.168.1.1"); |
| - test.equal(normalizeHostname("192.168.1.1."), "192.168.1.1"); |
| + testURLParsing("http://user:%40!$&'()*+,%3B%3D%3A@example.com:12345/"); |
| - test.equal(normalizeHostname("2001:0db8:85a3:0000:0000:8a2e:0370:7334"), |
| - "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); |
| - test.equal(normalizeHostname("2001:0db8:85a3:0000:0000:8a2e:0370:7334."), |
| - "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); |
| - test.equal(normalizeHostname("2001:0DB8:85A3:0000:0000:8A2E:0370:7334"), |
| - "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); |
| + testURLParsing("filesystem:http://example.com/temporary/"); |
| + testURLParsing( |
| + "filesystem:http://user:%40!$&'()*+,%3B%3D%3A@example.com:12345/" |
| + ); |
| - test.done(); |
| -}; |
| + testURLParsing("javascript:window.alert('hello, world');"); |
| + testURLParsing("javascript:#"); |
| -exports.testDomainSuffixes = function(test) |
| -{ |
| - test.deepEqual([...domainSuffixes("localhost")], ["localhost"]); |
| - test.deepEqual([...domainSuffixes("example.com")], ["example.com", "com"]); |
| - test.deepEqual([...domainSuffixes("www.example.com")], |
| - ["www.example.com", "example.com", "com"]); |
| - test.deepEqual([...domainSuffixes("www.example.co.in")], |
| - ["www.example.co.in", "example.co.in", "co.in", "in"]); |
| + testURLParsing( |
| + "blob:https://example.com/7ce70a1e-9681-4148-87a8-43cb9171b994" |
| + ); |
| + |
| + testURLParsing("http://[2001:db8::1]/"); |
| + testURLParsing("http://[2001:db8::1]:8080/"); |
| + testURLParsing("http://[::]:8080/"); |
| - // With blank. |
| - test.deepEqual([...domainSuffixes("localhost", true)], ["localhost", ""]); |
| - test.deepEqual([...domainSuffixes("example.com", true)], |
| - ["example.com", "com", ""]); |
| - test.deepEqual([...domainSuffixes("www.example.com", true)], |
| - ["www.example.com", "example.com", "com", ""]); |
| - test.deepEqual([...domainSuffixes("www.example.co.in", true)], |
| - ["www.example.co.in", "example.co.in", "co.in", "in", ""]); |
| + testURLParsing("not-a-standard-scheme:this is arbitrary content"); |
| + testURLParsing("view-source:http://example.com/path"); |
| + |
| + testURLParsing( |
| + "data:text/html,Question?%3Cdiv%20style=%22color:%20#bad%22%3Eidea%3C/div%3E" |
| + ); |
| + }); |
| - // Quirks and edge cases. |
| - test.deepEqual([...domainSuffixes("")], []); |
| - test.deepEqual([...domainSuffixes(".")], ["."]); |
| - test.deepEqual([...domainSuffixes(".localhost")], |
| - [".localhost", "localhost"]); |
| - test.deepEqual([...domainSuffixes(".example.com")], |
| - [".example.com", "example.com", "com"]); |
| - test.deepEqual([...domainSuffixes("localhost.")], |
| - ["localhost."]); |
| - test.deepEqual([...domainSuffixes("example.com.")], |
| - ["example.com.", "com."]); |
| - test.deepEqual([...domainSuffixes("..localhost")], |
| - ["..localhost", ".localhost", "localhost"]); |
| - test.deepEqual( |
| - [...domainSuffixes("..example..com")], |
| - ["..example..com", ".example..com", "example..com", ".com", "com"] |
| - ); |
| - test.deepEqual([...domainSuffixes("localhost..")], ["localhost..", "."]); |
| - test.deepEqual([...domainSuffixes("example..com..")], |
| - ["example..com..", ".com..", "com..", "."]); |
| + it("Is Third Party", () => |
| + { |
| + function hostnameToURL(hostname) |
| + { |
| + return new URL("http://" + hostname); |
| + } |
| - test.done(); |
| -}; |
| + function testThirdParty(requestHostname, documentHostname, expected, |
| + message) |
| + { |
| + assert.equal( |
| + isThirdParty( |
| + hostnameToURL(requestHostname), |
| + |
| + // Chrome's URL object normalizes IP addresses. So some test |
| + // will fail if we don't normalize the document host as well. |
| + hostnameToURL(documentHostname).hostname |
| + ), |
| + expected, |
| + message |
| + ); |
| + } |
| -exports.testIsThirdParty = function(test) |
| -{ |
| - testThirdParty(test, "foo", "foo", false, "same domain isn't third-party"); |
| - testThirdParty(test, "foo", "bar", true, "different domain is third-party"); |
| - testThirdParty(test, "foo.com", "foo.com", false, |
| - "same domain with TLD (.com) isn't third-party"); |
| - testThirdParty(test, "foo.com", "bar.com", true, |
| - "same TLD (.com) but different domain is third-party"); |
| - testThirdParty(test, "foo.com", "www.foo.com", false, |
| - "same domain but differend subdomain isn't third-party"); |
| - testThirdParty(test, "foo.example.com", "bar.example.com", false, |
| - "same basedomain (example.com) isn't third-party"); |
| - testThirdParty(test, "foo.uk", "bar.uk", true, |
| - "same TLD (.uk) but different domain is third-party"); |
| - testThirdParty(test, "foo.co.uk", "bar.co.uk", true, |
| - "same TLD (.co.uk) but different domain is third-party"); |
| - testThirdParty(test, "foo.example.co.uk", "bar.example.co.uk", false, |
| - "same basedomain (example.co.uk) isn't third-party"); |
| - testThirdParty(test, "1.2.3.4", "1.2.3.4", false, |
| - "same IPv4 address isn't third-party"); |
| - testThirdParty(test, "1.1.1.1", "2.1.1.1", true, |
| - "different IPv4 address is third-party"); |
| - testThirdParty(test, "0x01ff0101", "0x01ff0101", false, |
| - "same IPv4 hexadecimal address isn't third-party"); |
| - testThirdParty(test, "0x01ff0101", "0x01ff0102", true, |
| - "different IPv4 hexadecimal address is third-party"); |
| - testThirdParty( |
| - test, |
| - "1.0xff.3.4", "1.0xff.3.4", false, |
| - "same IPv4 address with hexadecimal octet isn't third-party" |
| - ); |
| - testThirdParty( |
| - test, |
| - "1.0xff.1.1", "2.0xff.1.1", true, |
| - "different IPv4 address with hexadecimal octet is third-party" |
| - ); |
| - testThirdParty( |
| - test, |
| - "0xff.example.com", "example.com", false, |
| - "domain starts like a hexadecimal IPv4 address but isn't one" |
| - ); |
| - testThirdParty( |
| - test, |
| - "[2001:db8:85a3::8a2e:370:7334]", "[2001:db8:85a3::8a2e:370:7334]", false, |
| - "same IPv6 address isn't third-party" |
| - ); |
| - testThirdParty( |
| - test, |
| - "[2001:db8:85a3::8a2e:370:7334]", "[5001:db8:85a3::8a2e:370:7334]", true, |
| - "different IPv6 address is third-party" |
| - ); |
| - testThirdParty( |
| - test, |
| - "[::ffff:192.0.2.128]", "[::ffff:192.0.2.128]", false, |
| - "same IPv4-mapped IPv6 address isn't third-party" |
| - ); |
| - testThirdParty( |
| - test, |
| - "[::ffff:192.0.2.128]", "[::ffff:192.1.2.128]", true, |
| - "different IPv4-mapped IPv6 address is third-party" |
| - ); |
| - testThirdParty(test, "xn--f-1gaa.com", "f\u00f6\u00f6.com", false, |
| - "same IDN isn't third-party"); |
| - testThirdParty(test, "example.com..", "example.com....", false, |
| - "traling dots are ignored"); |
| + testThirdParty("foo", "foo", false, "same domain isn't third-party"); |
| + testThirdParty("foo", "bar", true, "different domain is third-party"); |
| + testThirdParty("foo.com", "foo.com", false, |
| + "same domain with TLD (.com) isn't third-party"); |
| + testThirdParty("foo.com", "bar.com", true, |
| + "same TLD (.com) but different domain is third-party"); |
| + testThirdParty("foo.com", "www.foo.com", false, |
| + "same domain but differend subdomain isn't third-party"); |
| + testThirdParty("foo.example.com", "bar.example.com", false, |
| + "same basedomain (example.com) isn't third-party"); |
| + testThirdParty("foo.uk", "bar.uk", true, |
| + "same TLD (.uk) but different domain is third-party"); |
| + testThirdParty("foo.co.uk", "bar.co.uk", true, |
| + "same TLD (.co.uk) but different domain is third-party"); |
| + testThirdParty("foo.example.co.uk", "bar.example.co.uk", false, |
| + "same basedomain (example.co.uk) isn't third-party"); |
| + testThirdParty("1.2.3.4", "1.2.3.4", false, |
| + "same IPv4 address isn't third-party"); |
| + testThirdParty("1.1.1.1", "2.1.1.1", true, |
| + "different IPv4 address is third-party"); |
| + testThirdParty("0x01ff0101", "0x01ff0101", false, |
| + "same IPv4 hexadecimal address isn't third-party"); |
| + testThirdParty("0x01ff0101", "0x01ff0102", true, |
| + "different IPv4 hexadecimal address is third-party"); |
| + testThirdParty( |
| + "1.0xff.3.4", "1.0xff.3.4", false, |
| + "same IPv4 address with hexadecimal octet isn't third-party" |
| + ); |
| + testThirdParty( |
| + "1.0xff.1.1", "2.0xff.1.1", true, |
| + "different IPv4 address with hexadecimal octet is third-party" |
| + ); |
| + testThirdParty( |
| + "0xff.example.com", "example.com", false, |
| + "domain starts like a hexadecimal IPv4 address but isn't one" |
| + ); |
| + testThirdParty( |
| + "[2001:db8:85a3::8a2e:370:7334]", "[2001:db8:85a3::8a2e:370:7334]", false, |
| + "same IPv6 address isn't third-party" |
| + ); |
| + testThirdParty( |
| + "[2001:db8:85a3::8a2e:370:7334]", "[5001:db8:85a3::8a2e:370:7334]", true, |
| + "different IPv6 address is third-party" |
| + ); |
| + testThirdParty( |
| + "[::ffff:192.0.2.128]", "[::ffff:192.0.2.128]", false, |
| + "same IPv4-mapped IPv6 address isn't third-party" |
| + ); |
| + testThirdParty( |
| + "[::ffff:192.0.2.128]", "[::ffff:192.1.2.128]", true, |
| + "different IPv4-mapped IPv6 address is third-party" |
| + ); |
| + testThirdParty("xn--f-1gaa.com", "f\u00f6\u00f6.com", false, |
| + "same IDN isn't third-party"); |
| + testThirdParty("example.com..", "example.com....", false, |
| + "traling dots are ignored"); |
| + }); |
| - test.done(); |
| -}; |
| + it("Get Base Domain", () => |
| + { |
| + let parts = ["aaa", "bbb", "ccc", "ddd", "eee"]; |
| + let levels = 3; |
| -exports.testGetBaseDomain = function(test) |
| -{ |
| - let parts = ["aaa", "bbb", "ccc", "ddd", "eee"]; |
| - let levels = 3; |
| + for (let suffix in publicSuffixes) |
| + { |
| + let offset = publicSuffixes[suffix]; |
| - for (let suffix in publicSuffixes) |
| - { |
| - let offset = publicSuffixes[suffix]; |
| + // If this fails, add more parts. |
| + assert.ok(offset <= parts.length - levels, |
| + "Not enough domain parts for testing"); |
| - // If this fails, add more parts. |
| - test.ok(offset <= parts.length - levels, |
| - "Not enough domain parts for testing"); |
| + for (let i = 0; i < offset + levels; i++) |
| + { |
| + let hostname = parts.slice(0, i).join("."); |
| + hostname += (hostname ? "." : "") + suffix; |
| - for (let i = 0; i < offset + levels; i++) |
| - { |
| - let hostname = parts.slice(0, i).join("."); |
| - hostname += (hostname ? "." : "") + suffix; |
| - |
| - let expected = parts.slice(Math.max(0, i - offset), i).join("."); |
| - expected += (expected ? "." : "") + suffix; |
| + let expected = parts.slice(Math.max(0, i - offset), i).join("."); |
| + expected += (expected ? "." : "") + suffix; |
| - test.equal(getBaseDomain(hostname), expected, |
| - `getBaseDomain("${hostname}") == "${expected}"` + |
| - ` with {suffix: "${suffix}", offset: ${offset}}`); |
| + assert.equal(getBaseDomain(hostname), expected, |
| + `getBaseDomain("${hostname}") == "${expected}"` + |
| + ` with {suffix: "${suffix}", offset: ${offset}}`); |
| + } |
| } |
| - } |
| - // Unknown suffixes. |
| - test.equal(typeof publicSuffixes["localhost"], "undefined"); |
| - test.equal(typeof publicSuffixes["localhost.localdomain"], "undefined"); |
| + // Unknown suffixes. |
| + assert.equal(typeof publicSuffixes["localhost"], "undefined"); |
| + assert.equal(typeof publicSuffixes["localhost.localdomain"], "undefined"); |
| - test.equal(getBaseDomain("localhost"), "localhost"); |
| - test.equal(getBaseDomain("localhost.localdomain"), "localhost.localdomain"); |
| - test.equal( |
| - getBaseDomain("mail.localhost.localdomain"), |
| - "localhost.localdomain" |
| - ); |
| - test.equal(getBaseDomain("www.example.localhost.localdomain"), |
| - "localhost.localdomain"); |
| + assert.equal(getBaseDomain("localhost"), "localhost"); |
| + assert.equal(getBaseDomain("localhost.localdomain"), "localhost.localdomain"); |
| + assert.equal( |
| + getBaseDomain("mail.localhost.localdomain"), |
| + "localhost.localdomain" |
| + ); |
| + assert.equal(getBaseDomain("www.example.localhost.localdomain"), |
| + "localhost.localdomain"); |
| - // Unknown suffixes that overlap partly with known suffixes. |
| - test.equal(typeof publicSuffixes["example.com"], "undefined"); |
| - test.equal(typeof publicSuffixes["africa.com"], "number"); |
| - test.equal(typeof publicSuffixes["compute.amazonaws.com"], "number"); |
| + // Unknown suffixes that overlap partly with known suffixes. |
| + assert.equal(typeof publicSuffixes["example.com"], "undefined"); |
| + assert.equal(typeof publicSuffixes["africa.com"], "number"); |
| + assert.equal(typeof publicSuffixes["compute.amazonaws.com"], "number"); |
| - test.equal(getBaseDomain("example.com"), "example.com"); |
| - test.equal(getBaseDomain("mail.example.com"), "example.com"); |
| - test.equal(getBaseDomain("secure.mail.example.com"), "example.com"); |
| + assert.equal(getBaseDomain("example.com"), "example.com"); |
| + assert.equal(getBaseDomain("mail.example.com"), "example.com"); |
| + assert.equal(getBaseDomain("secure.mail.example.com"), "example.com"); |
| - // Cascading offsets. |
| + // Cascading offsets. |
| - // If these sanity checks fail, look for other examles of cascading offsets |
| - // from the public suffix list. |
| - test.equal( |
| - typeof publicSuffixes[ |
| - "images.example.s3.dualstack.us-east-1.amazonaws.com" |
| - ], |
| - "undefined" |
| - ); |
| - test.equal( |
| - typeof publicSuffixes["example.s3.dualstack.us-east-1.amazonaws.com"], |
| - "undefined" |
| - ); |
| - test.equal(publicSuffixes["s3.dualstack.us-east-1.amazonaws.com"], 1); |
| - test.equal(typeof publicSuffixes["dualstack.us-east-1.amazonaws.com"], |
| - "undefined"); |
| - test.equal(typeof publicSuffixes["example.us-east-1.amazonaws.com"], |
| - "undefined"); |
| - test.equal(publicSuffixes["us-east-1.amazonaws.com"], 1); |
| - test.equal(typeof publicSuffixes["example.amazonaws.com"], "undefined"); |
| - test.equal(typeof publicSuffixes["amazonaws.com"], "undefined"); |
| + // If these sanity checks fail, look for other examles of cascading offsets |
| + // from the public suffix list. |
| + assert.equal( |
| + typeof publicSuffixes[ |
| + "images.example.s3.dualstack.us-east-1.amazonaws.com" |
| + ], |
| + "undefined" |
| + ); |
| + assert.equal( |
| + typeof publicSuffixes["example.s3.dualstack.us-east-1.amazonaws.com"], |
| + "undefined" |
| + ); |
| + assert.equal(publicSuffixes["s3.dualstack.us-east-1.amazonaws.com"], 1); |
| + assert.equal(typeof publicSuffixes["dualstack.us-east-1.amazonaws.com"], |
| + "undefined"); |
| + assert.equal(typeof publicSuffixes["example.us-east-1.amazonaws.com"], |
| + "undefined"); |
| + assert.equal(publicSuffixes["us-east-1.amazonaws.com"], 1); |
| + assert.equal(typeof publicSuffixes["example.amazonaws.com"], "undefined"); |
| + assert.equal(typeof publicSuffixes["amazonaws.com"], "undefined"); |
| - test.equal( |
| - getBaseDomain("images.example.s3.dualstack.us-east-1.amazonaws.com"), |
| - "example.s3.dualstack.us-east-1.amazonaws.com" |
| - ); |
| - test.equal(getBaseDomain("example.s3.dualstack.us-east-1.amazonaws.com"), |
| - "example.s3.dualstack.us-east-1.amazonaws.com"); |
| - test.equal(getBaseDomain("s3.dualstack.us-east-1.amazonaws.com"), |
| - "s3.dualstack.us-east-1.amazonaws.com"); |
| - test.equal(getBaseDomain("dualstack.us-east-1.amazonaws.com"), |
| - "dualstack.us-east-1.amazonaws.com"); |
| - test.equal(getBaseDomain("example.us-east-1.amazonaws.com"), |
| - "example.us-east-1.amazonaws.com"); |
| - test.equal( |
| - getBaseDomain("us-east-1.amazonaws.com"), |
| - "us-east-1.amazonaws.com" |
| - ); |
| - test.equal(getBaseDomain("example.amazonaws.com"), "amazonaws.com"); |
| - test.equal(getBaseDomain("amazonaws.com"), "amazonaws.com"); |
| + assert.equal( |
| + getBaseDomain("images.example.s3.dualstack.us-east-1.amazonaws.com"), |
| + "example.s3.dualstack.us-east-1.amazonaws.com" |
| + ); |
| + assert.equal(getBaseDomain("example.s3.dualstack.us-east-1.amazonaws.com"), |
| + "example.s3.dualstack.us-east-1.amazonaws.com"); |
| + assert.equal(getBaseDomain("s3.dualstack.us-east-1.amazonaws.com"), |
| + "s3.dualstack.us-east-1.amazonaws.com"); |
| + assert.equal(getBaseDomain("dualstack.us-east-1.amazonaws.com"), |
| + "dualstack.us-east-1.amazonaws.com"); |
| + assert.equal(getBaseDomain("example.us-east-1.amazonaws.com"), |
| + "example.us-east-1.amazonaws.com"); |
| + assert.equal( |
| + getBaseDomain("us-east-1.amazonaws.com"), |
| + "us-east-1.amazonaws.com" |
| + ); |
| + assert.equal(getBaseDomain("example.amazonaws.com"), "amazonaws.com"); |
| + assert.equal(getBaseDomain("amazonaws.com"), "amazonaws.com"); |
| - // Edge case. |
| - test.equal(getBaseDomain(""), ""); |
| + // Edge case. |
| + assert.equal(getBaseDomain(""), ""); |
| + }); |
| +}); |
| - test.done(); |
| -}; |