/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include"gtest/gtest.h" #include"gtest/MozGTestBench.h"// For MOZ_GTEST_BENCH #include"mozilla/dom/ScriptSettings.h" #include"mozilla/net/URLPatternGlue.h" #include"mozilla/net/urlpattern_glue.h"
usingnamespace mozilla::net;
template <typename T> using Optional = mozilla::Maybe<T>;
auto proto = UrlPatternGetProtocol(pattern);
ASSERT_EQ(proto, nsCString("*")); auto host = UrlPatternGetHostname(pattern);
ASSERT_EQ(host, nsCString("*")); auto path = UrlPatternGetPathname(pattern);
ASSERT_EQ(path, nsCString("/foo/thing"));
nsAutoCString res;
res = UrlPatternGetProtocol(pattern);
ASSERT_EQ(res, nsCString("https"));
res = UrlPatternGetUsername(pattern);
ASSERT_EQ(res, nsCString("user"));
res = UrlPatternGetPassword(pattern);
ASSERT_EQ(res, nsCString("passw"));
res = UrlPatternGetHostname(pattern);
ASSERT_EQ(res, nsCString("example.com"));
res = UrlPatternGetPort(pattern);
ASSERT_EQ(res, nsCString("66"));
res = UrlPatternGetPathname(pattern);
ASSERT_EQ(res, nsCString("/"));
res = UrlPatternGetSearch(pattern);
ASSERT_EQ(res, nsCString("find"));
res = UrlPatternGetHash(pattern);
ASSERT_EQ(res, nsCString("anchor")); // neither lib or quirks URLPattern has base_url so nothing to check
}
Optional<nsCString> base;
{ // path not fixed up (?) auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, ""_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // unspecified user and password is fine auto test = CreateUrlPatternInput(
CreateInit("https", "user", "pass", "example.com", "", "/", "", ""));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // unspecified port is fine auto test = CreateUrlPatternInput(
CreateInit("https", "", "", "example.com", "444", "/", "", ""));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // unspecified search is fine auto test = CreateUrlPatternInput(
CreateInit("https", "", "", "example.com", "", "/", "thisok", ""));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // unspecified hash is fine auto test = CreateUrlPatternInput(
CreateInit("https", "", "", "example.com", "", "/", "", "thisok"));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // pathname different auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/a"_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // scheme different auto test = CreateUrlPatternInput(
CreateSimpleInit("http"_ns, "example.com"_ns, "/"_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // domain different auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.org"_ns, "/"_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
}
nsCString anything("anything");
Optional<nsCString> base;
{ // exact match auto test = CreateUrlPatternInput(init);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // missing protocol auto test = CreateUrlPatternInput(CreateInit("", "user", anything.get(), "example.com", "444", "/", "query", "frag"));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing user auto test = CreateUrlPatternInput(CreateInit("https", "", anything.get(), "example.com", "444", "/", "query", "frag"));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing password auto test = CreateUrlPatternInput(CreateInit( "https", "user", "", "example.com", "444", "/", "query", "frag"));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing hostname auto test = CreateUrlPatternInput(CreateInit( "https", "user", anything.get(), "", "444", "/", "query", "frag"));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing port auto test = CreateUrlPatternInput(
CreateInit("https", "user", anything.get(), "example.com", "", "/", "query", "frag"));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing query auto test = CreateUrlPatternInput(
CreateInit("https", "user", anything.get(), "example.com", "444", "/", "", "frag"));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing frag auto test = CreateUrlPatternInput(
CreateInit("https", "user", anything.get(), "example.com", "444", "/", "query", ""));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
}
// check basic url with wildcard
{
UrlPatternGlue pattern{};
UrlPatternOptions options = {.ignore_case = false}; auto init = CreateSimpleInit("https"_ns, "example.com"_ns, "/*"_ns); bool res = urlpattern_parse_pattern_from_init(&init, options, &pattern);
ASSERT_TRUE(res);
Optional<nsCString> base;
{ // root path matches wildcard auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // filename matches wildcard auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/thing"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // dir/filename matches wildcard auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/dir/thing"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
}
// check matching in pathname (needs to be at least two slashes)
{
UrlPatternGlue pattern{};
UrlPatternOptions options = {.ignore_case = false}; auto init =
CreateSimpleInit("https"_ns, "example.com"_ns, "/:category/*"_ns); bool res = urlpattern_parse_pattern_from_init(&init, options, &pattern);
ASSERT_TRUE(res);
Optional<nsCString> base;
{ // no directory and not enough slashes auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/"_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // no directory auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "//"_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // not enough slashes auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/products"_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // dir/ works auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/products/"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // diretory/filename auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/blog/thing"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // nested directory auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/blog/thing/"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
}
// check optional `s` in protocol
{
UrlPatternGlue pattern{};
UrlPatternOptions options = {.ignore_case = false}; auto init = CreateSimpleInit("http{s}?"_ns, "example.com"_ns, "/"_ns); bool res = urlpattern_parse_pattern_from_init(&init, options, &pattern);
ASSERT_TRUE(res);
Optional<nsCString> base;
{ // insecure matches auto test = CreateUrlPatternInput(
CreateSimpleInit("http"_ns, "example.com"_ns, "/"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // secure matches auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
}
// basic relative wildcard path with base domain
{
UrlPatternGlue pattern{};
UrlPatternOptions options = {.ignore_case = false}; auto init = CreateInit(""_ns, ""_ns, ""_ns, ""_ns, ""_ns, "/admin/*"_ns, ""_ns, ""_ns, "https://example.com"_ns); bool res = urlpattern_parse_pattern_from_init(&init, options, &pattern);
ASSERT_TRUE(res);
Optional<nsCString> base;
{ auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/admin/"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/admin/thing"_ns));
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // incorrect relative path doesn't match // auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/nonadmin/"_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // root path not matching relative path doesn't match auto test = CreateUrlPatternInput(
CreateSimpleInit("https"_ns, "example.com"_ns, "/"_ns));
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
}
}
Optional<nsCString> base;
{ // path fixed up "/" auto test = CreateUrlPatternInput("https://example.com"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput("https://example.com/"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // unspecified user and password is fine auto test = CreateUrlPatternInput("https://user:passw@example.com"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // unspecified port is empty so 444 doesn't match auto test = CreateUrlPatternInput("https://example.com:444/"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // unspecified search is fine auto test = CreateUrlPatternInput("https://example.com/?thisok"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // unspecified hash is fine auto test = CreateUrlPatternInput("https://example.com/#thisok"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // pathname different auto test = CreateUrlPatternInput("https://example.com/a"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // scheme different auto test = CreateUrlPatternInput("http://example.com/"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // domain different auto test = CreateUrlPatternInput("http://example.org"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
}
// check basic literal matching (all fields, except password) // because user:pass is parsed as: `username: user:pass, password: *` // when pattern is from_string
{
nsCString str("https://user:*@example.com:444/?query#frag");
UrlPatternGlue pattern{};
UrlPatternOptions options = {.ignore_case = false};
nsCString baseUrl(""); bool res =
urlpattern_parse_pattern_from_string(&str, &baseUrl, options, &pattern);
ASSERT_TRUE(res);
Optional<nsCString> base;
{ // exact match, except password auto test = CreateUrlPatternInput( "https://user:anything@example.com:444/?query#frag"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // missing protocol auto test =
CreateUrlPatternInput("user:anything@example.com:444/?query#frag"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing user auto test = CreateUrlPatternInput( "https://:anything@example.com:444/?query#frag"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing password is fine auto test =
CreateUrlPatternInput("https://user@example.com:444/?query#frag"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // missing password is fine auto test =
CreateUrlPatternInput("https://user@example.com:444/?query#frag"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // missing hostname auto test =
CreateUrlPatternInput("https://user:anything@:444/?query#frag"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing port auto test = CreateUrlPatternInput( "https://user:anything@example.com/?query#frag"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing query auto test = CreateUrlPatternInput( "https://user:anything@example.com:444/#frag"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // missing frag auto test = CreateUrlPatternInput( "https://user:anything@example.com:444/?query"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
}
Optional<nsCString> base;
{ auto test = CreateUrlPatternInput("https://example.com/"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput("https://example.com/thing"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput("https://example.com/dir/thing"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
}
// check matching in pathname (needs to be at least two slashes)
{
nsCString str("https://example.com/:category/*");
UrlPatternGlue pattern{};
UrlPatternOptions options = {.ignore_case = false};
nsCString baseUrl(""); bool res =
urlpattern_parse_pattern_from_string(&str, &baseUrl, options, &pattern);
ASSERT_TRUE(res);
Optional<nsCString> base;
{ auto test = CreateUrlPatternInput("https://example.com/"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ // not enough slashes auto test = CreateUrlPatternInput("https://example.com/products"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput("https://example.com/products/"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput("https://example.com/blog/thing"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ // 3 slashes auto test = CreateUrlPatternInput("https://example.com/blog/thing/"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
}
Optional<nsCString> base;
{ auto test = CreateUrlPatternInput("https://example.com/admin/"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput("https://example.com/admin/thing"_ns);
ASSERT_TRUE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput("https://example.com/nonadmin/"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
{ auto test = CreateUrlPatternInput("https://example.com/"_ns);
ASSERT_FALSE(UrlPatternTest(pattern, test, base));
}
}
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.13Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-09-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.