From 0f2e52cdad289aba62b836c0e20609522c72f7ba Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Tue, 18 Mar 2025 20:25:06 +1300 Subject: [PATCH] LibURL/Pattern: Implement 'compute protocol matches a special scheme' --- .../LibURL/Pattern/ConstructorStringParser.cpp | 11 ++++++++++- .../wpt-import/urlpattern/urlpattern.any.txt | 14 +++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Libraries/LibURL/Pattern/ConstructorStringParser.cpp b/Libraries/LibURL/Pattern/ConstructorStringParser.cpp index a6a1f50bc31..32bf7afa979 100644 --- a/Libraries/LibURL/Pattern/ConstructorStringParser.cpp +++ b/Libraries/LibURL/Pattern/ConstructorStringParser.cpp @@ -381,7 +381,16 @@ String ConstructorStringParser::make_a_component_string() const // https://urlpattern.spec.whatwg.org/#compute-protocol-matches-a-special-scheme-flag PatternErrorOr ConstructorStringParser::compute_protocol_matches_a_special_scheme_flag() { - // FIXME: Implement this. + // 1. Let protocol string be the result of running make a component string given parser. + auto protocol_string = make_a_component_string(); + + // 2. Let protocol component be the result of compiling a component given protocol string, canonicalize a protocol, and default options. + auto protocol_component = TRY(Component::compile(protocol_string.code_points(), canonicalize_a_protocol, Options::default_())); + + // 3. If the result of running protocol component matches a special scheme given protocol component is true, then set parser’s protocol matches a special scheme flag to true. + if (protocol_component_matches_a_special_scheme(protocol_component)) + m_protocol_matches_a_special_scheme = true; + return {}; } diff --git a/Tests/LibWeb/Text/expected/wpt-import/urlpattern/urlpattern.any.txt b/Tests/LibWeb/Text/expected/wpt-import/urlpattern/urlpattern.any.txt index 47225472e17..2a754e8a652 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/urlpattern/urlpattern.any.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/urlpattern/urlpattern.any.txt @@ -2,8 +2,8 @@ Harness status: OK Found 350 tests -155 Pass -195 Fail +160 Pass +190 Fail Pass Loading data... Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/bar"}] Pass Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/ba"}] @@ -218,10 +218,10 @@ Fail Pattern: ["/foo?bar#baz","https://example.com:8080"] Inputs: [{"pathname":" Pass Pattern: ["/foo"] Inputs: undefined Pass Pattern: ["example.com/foo"] Inputs: undefined Pass Pattern: ["http{s}?://{*.}?example.com/:product/:endpoint"] Inputs: ["https://sub.example.com/foo/bar"] -Fail Pattern: ["https://example.com?foo"] Inputs: ["https://example.com/?foo"] -Fail Pattern: ["https://example.com#foo"] Inputs: ["https://example.com/#foo"] -Fail Pattern: ["https://example.com:8080?foo"] Inputs: ["https://example.com:8080/?foo"] -Fail Pattern: ["https://example.com:8080#foo"] Inputs: ["https://example.com:8080/#foo"] +Pass Pattern: ["https://example.com?foo"] Inputs: ["https://example.com/?foo"] +Pass Pattern: ["https://example.com#foo"] Inputs: ["https://example.com/#foo"] +Pass Pattern: ["https://example.com:8080?foo"] Inputs: ["https://example.com:8080/?foo"] +Pass Pattern: ["https://example.com:8080#foo"] Inputs: ["https://example.com:8080/#foo"] Pass Pattern: ["https://example.com/?foo"] Inputs: ["https://example.com/?foo"] Pass Pattern: ["https://example.com/#foo"] Inputs: ["https://example.com/#foo"] Fail Pattern: ["https://example.com/*?foo"] Inputs: ["https://example.com/?foo"] @@ -259,7 +259,7 @@ Pass Pattern: ["https://foo\\:bar@example.com"] Inputs: ["https://foo:bar@exampl Pass Pattern: ["https://foo@example.com"] Inputs: ["https://foo@example.com"] Pass Pattern: ["https://\\:bar@example.com"] Inputs: ["https://:bar@example.com"] Pass Pattern: ["https://:user::pass@example.com"] Inputs: ["https://foo:bar@example.com"] -Fail Pattern: ["https\\:foo\\:bar@example.com"] Inputs: ["https:foo:bar@example.com"] +Pass Pattern: ["https\\:foo\\:bar@example.com"] Inputs: ["https:foo:bar@example.com"] Fail Pattern: ["data\\:foo\\:bar@example.com"] Inputs: ["data:foo:bar@example.com"] Pass Pattern: ["https://foo{\\:}bar@example.com"] Inputs: ["https://foo:bar@example.com"] Pass Pattern: ["data{\\:}channel.html","https://example.com"] Inputs: ["https://example.com/data:channel.html"]