1
0
Fork 0
firefox/remote/shared/webdriver/test/xpcshell/test_URLPattern_matchURLPattern.js
Daniel Baumann 5e9a113729
Adding upstream version 140.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-25 09:37:52 +02:00

607 lines
12 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
const { matchURLPattern, parseURLPattern } = ChromeUtils.importESModule(
"chrome://remote/content/shared/webdriver/URLPattern.sys.mjs"
);
// Test several variations which should match a string based http://example.com
// pattern.
add_task(async function test_matchURLPattern_url_variations() {
const pattern = parseURLPattern({
type: "string",
pattern: "http://example.com",
});
const urls = [
"http://example.com",
"http://EXAMPLE.com",
"http://user:password@example.com",
"http://example.com:80",
"http://example.com/",
"http://example.com/#some-hash",
"http:example.com",
"http:/example.com",
"http://example.com?",
"http://example.com/?",
];
for (const url of urls) {
ok(
matchURLPattern(pattern, url),
`url "${url}" should match pattern "http://example.com"`
);
}
// Test URLs close to http://example.com but which should not match.
const failingUrls = [
"https://example.com",
"http://example.com:88",
"http://example.com/a",
"http://example.com/?abc",
];
for (const url of failingUrls) {
ok(
!matchURLPattern(pattern, url),
`url "${url}" should not match pattern "http://example.com"`
);
}
});
add_task(async function test_matchURLPattern_stringPatterns() {
const tests = [
{
pattern: "http://example.com",
url: "http://example.com",
match: true,
},
{
pattern: "HTTP://example.com:80",
url: "http://example.com",
match: true,
},
{
pattern: "http://example.com:80",
url: "http://example.com",
match: true,
},
{
pattern: "http://example.com/path",
url: "http://example.com/path",
match: true,
},
{
pattern: "http://example.com/PATH_CASE",
url: "http://example.com/path_case",
match: false,
},
{
pattern: "http://example.com/path_single_segment",
url: "http://example.com/path_single_segment/",
match: false,
},
{
pattern: "http://example.com/path",
url: "http://example.com/path_continued",
match: false,
},
{
pattern: "http://example.com/path_two_segments/",
url: "http://example.com/path_two_segments/",
match: true,
},
{
pattern: "http://example.com/path_two_segments/",
url: "http://example.com/path_two_segments",
match: false,
},
{
pattern: "http://example.com/emptysearch?",
url: "http://example.com/emptysearch?",
match: true,
},
{
pattern: "http://example.com/emptysearch?",
url: "http://example.com/emptysearch",
match: true,
},
{
pattern: "http://example.com/emptysearch?",
url: "http://example.com/emptysearch??",
match: false,
},
{
pattern: "http://example.com/emptysearch?",
url: "http://example.com/emptysearch?a",
match: false,
},
{
pattern: "http://example.com/search?param",
url: "http://example.com/search?param",
match: true,
},
{
pattern: "http://example.com/search?param",
url: "http://example.com/search?param=value",
match: false,
},
{
pattern: "http://example.com/search?param=value",
url: "http://example.com/search?param=value",
match: true,
},
{
pattern: "http://example.com/search?a=b&c=d",
url: "http://example.com/search?a=b&c=d",
match: true,
},
{
pattern: "http://example.com/search?a=b&c=d",
url: "http://example.com/search?c=d&a=b",
match: false,
},
{
pattern: "http://example.com/search?param",
url: "http://example.com/search?param#ref",
match: true,
},
{
pattern: "http://example.com/search?param#ref",
url: "http://example.com/search?param#ref",
match: true,
},
{
pattern: "http://example.com/search?param#ref",
url: "http://example.com/search?param",
match: true,
},
{
pattern: "http://example.com/search?param",
url: "http://example.com/search?parameter",
match: false,
},
{
pattern: "http://example.com/search?parameter",
url: "http://example.com/search?param",
match: false,
},
{
pattern: "https://example.com:80",
url: "https://example.com",
match: false,
},
{
pattern: "https://example.com:443",
url: "https://example.com",
match: true,
},
{
pattern: "ws://example.com",
url: "ws://example.com:80",
match: true,
},
];
runMatchPatternTests(tests, "string");
});
add_task(async function test_patternPatterns_no_property() {
const tests = [
// Test protocol
{
pattern: {},
url: "https://example.com",
match: true,
},
{
pattern: {},
url: "https://example.com",
match: true,
},
{
pattern: {},
url: "https://example.com:1234",
match: true,
},
{
pattern: {},
url: "https://example.com/a",
match: true,
},
{
pattern: {},
url: "https://example.com/a?test",
match: true,
},
];
runMatchPatternTests(tests, "pattern");
});
add_task(async function test_patternPatterns_protocol() {
const tests = [
// Test protocol
{
pattern: {
protocol: "http",
},
url: "http://example.com",
match: true,
},
{
pattern: {
protocol: "HTTP",
},
url: "http://example.com",
match: true,
},
{
pattern: {
protocol: "http",
},
url: "http://example.com:80",
match: true,
},
{
pattern: {
protocol: "http",
},
url: "http://example.com:1234",
match: true,
},
{
pattern: {
protocol: "http",
port: "80",
},
url: "http://example.com:80",
match: true,
},
{
pattern: {
protocol: "http",
port: "1234",
},
url: "http://example.com:1234",
match: true,
},
{
pattern: {
protocol: "http",
port: "1234",
},
url: "http://example.com",
match: false,
},
{
pattern: {
protocol: "http",
},
url: "https://wrong-scheme.com",
match: false,
},
{
pattern: {
protocol: "http",
},
url: "http://whatever.com/?search#ref",
match: true,
},
{
pattern: {
protocol: "http",
},
url: "http://example.com/a",
match: true,
},
{
pattern: {
protocol: "http",
},
url: "http://whatever.com/path?search#ref",
match: true,
},
];
runMatchPatternTests(tests, "pattern");
});
add_task(async function test_patternPatterns_port() {
const tests = [
{
pattern: {
protocol: "http",
port: "80",
},
url: "http://abc.com/",
match: true,
},
{
pattern: {
port: "1234",
},
url: "http://a.com:1234",
match: true,
},
{
pattern: {
port: "1234",
},
url: "https://a.com:1234",
match: true,
},
];
runMatchPatternTests(tests, "pattern");
});
add_task(async function test_patternPatterns_hostname() {
const tests = [
{
pattern: {
hostname: "example.com",
},
url: "http://example.com",
match: true,
},
{
pattern: {
hostname: "example.com",
},
url: "http://example.com:80",
match: true,
},
{
pattern: {
hostname: "example.com",
},
url: "https://example.com",
match: true,
},
{
pattern: {
hostname: "example.com",
},
url: "https://example.com:443",
match: true,
},
{
pattern: {
hostname: "example.com",
},
url: "ws://example.com",
match: true,
},
{
pattern: {
hostname: "example.com",
},
url: "ws://example.com:80",
match: true,
},
{
pattern: {
hostname: "example.com",
},
url: "http://example.com/path",
match: true,
},
{
pattern: {
hostname: "example.com",
},
url: "http://example.com/?search",
match: true,
},
{
pattern: {
hostname: "example\\{.com",
},
url: "http://example{.com/",
match: true,
},
{
pattern: {
hostname: "example\\{.com",
},
url: "http://example\\{.com/",
match: false,
},
{
pattern: {
hostname: "127.0.0.1",
},
url: "http://127.0.0.1/",
match: true,
},
{
pattern: {
hostname: "127.0.0.1",
},
url: "http://127.0.0.2/",
match: false,
},
{
pattern: {
hostname: "[2001:db8::1]",
},
url: "http://[2001:db8::1]/",
match: true,
},
{
pattern: {
hostname: "[::AB:1]",
},
url: "http://[::ab:1]/",
match: true,
},
];
runMatchPatternTests(tests, "pattern");
});
add_task(async function test_patternPatterns_pathname() {
const tests = [
{
pattern: {
pathname: "/",
},
url: "http://example.com",
match: true,
},
{
pattern: {
pathname: "/",
},
url: "http://example.com/",
match: true,
},
{
pattern: {
pathname: "/",
},
url: "http://example.com/?",
match: true,
},
{
pattern: {
pathname: "path",
},
url: "http://example.com/path",
match: true,
},
{
pattern: {
pathname: "/path",
},
url: "http://example.com/path",
match: true,
},
{
pattern: {
pathname: "path",
},
url: "http://example.com/path/",
match: false,
},
{
pattern: {
pathname: "path",
},
url: "http://example.com/path_continued",
match: false,
},
{
pattern: {
pathname: "/",
},
url: "http://example.com/path",
match: false,
},
];
runMatchPatternTests(tests, "pattern");
});
add_task(async function test_patternPatterns_search() {
const tests = [
{
pattern: {
search: "",
},
url: "http://example.com/?",
match: true,
},
{
pattern: {
search: "",
},
url: "http://example.com/",
match: true,
},
{
pattern: {
search: "",
},
url: "http://example.com/?#",
match: true,
},
{
pattern: {
search: "?",
},
url: "http://example.com/?",
match: true,
},
{
pattern: {
search: "?a",
},
url: "http://example.com/?a",
match: true,
},
{
pattern: {
search: "?",
},
url: "http://example.com/??",
match: false,
},
{
pattern: {
search: "query",
},
url: "http://example.com/?query",
match: true,
},
{
pattern: {
search: "?query",
},
url: "http://example.com/?query",
match: true,
},
{
pattern: {
search: "query=value",
},
url: "http://example.com/?query=value",
match: true,
},
{
pattern: {
search: "query",
},
url: "http://example.com/?query=value",
match: false,
},
{
pattern: {
search: "query",
},
url: "http://example.com/?query#value",
match: true,
},
];
runMatchPatternTests(tests, "pattern");
});
function runMatchPatternTests(tests, type) {
for (const test of tests) {
let pattern;
if (type == "pattern") {
pattern = parseURLPattern({ type: "pattern", ...test.pattern });
} else {
pattern = parseURLPattern({ type: "string", pattern: test.pattern });
}
equal(
matchURLPattern(pattern, test.url),
test.match,
`url "${test.url}" ${
test.match ? "should" : "should not"
} match pattern ${JSON.stringify(test.pattern)}`
);
}
}