diff options
author | Sam Atkins <atkinssj@serenityos.org> | 2023-02-15 13:56:37 +0000 |
---|---|---|
committer | Tim Flynn <trflynn89@pm.me> | 2023-02-15 12:48:26 -0500 |
commit | a419039bb2e10dad80ae5b34cc2b3b0189f65a6c (patch) | |
tree | fdcdc053094ed7500246cc5ecc38e9ce50e89327 /Userland/Libraries/LibWeb | |
parent | 1453ac79e79dcce39066ba511f4a1d3ef10f39ed (diff) | |
download | serenity-a419039bb2e10dad80ae5b34cc2b3b0189f65a6c.zip |
LibWeb: Implement ASCII case-insensitive matching
While DeprecatedString and StringView use ASCII case-insensitivity when
matching, String uses the Unicode rules, so in order to match the spec,
we need to *not* use `String::equals_ignoring_case()`.
This function needs to be used everywhere that the spec refers to
an "ASCII case-insensitive match".
Diffstat (limited to 'Userland/Libraries/LibWeb')
-rw-r--r-- | Userland/Libraries/LibWeb/Infra/Strings.cpp | 26 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Infra/Strings.h | 2 |
2 files changed, 28 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/Infra/Strings.cpp b/Userland/Libraries/LibWeb/Infra/Strings.cpp index 9a95fb9750..3f381c8426 100644 --- a/Userland/Libraries/LibWeb/Infra/Strings.cpp +++ b/Userland/Libraries/LibWeb/Infra/Strings.cpp @@ -2,10 +2,12 @@ * Copyright (c) 2022, Linus Groh <linusg@serenityos.org> * Copyright (c) 2022, networkException <networkexception@serenityos.org> * Copyright (c) 2023, Kenneth Myhra <kennethmyhra@serenityos.org> + * Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ +#include <AK/CharacterTypes.h> #include <AK/DeprecatedString.h> #include <AK/Utf16View.h> #include <AK/Utf8View.h> @@ -14,6 +16,30 @@ namespace Web::Infra { +// https://infra.spec.whatwg.org/#ascii-case-insensitive +bool is_ascii_case_insensitive_match(StringView a, StringView b) +{ + // A string A is an ASCII case-insensitive match for a string B, + // if the ASCII lowercase of A is the ASCII lowercase of B. + + Utf8View a_view { a }; + Utf8View b_view { b }; + + if (a_view.length() != b_view.length()) + return false; + + auto b_iterator = b_view.begin(); + for (auto a_char : a_view) { + auto b_char = *b_iterator; + ++b_iterator; + + if (to_ascii_lowercase(a_char) != to_ascii_lowercase(b_char)) + return false; + } + + return true; +} + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace DeprecatedString strip_and_collapse_whitespace(StringView string) { diff --git a/Userland/Libraries/LibWeb/Infra/Strings.h b/Userland/Libraries/LibWeb/Infra/Strings.h index a3f6fa3d8f..f44f6d9865 100644 --- a/Userland/Libraries/LibWeb/Infra/Strings.h +++ b/Userland/Libraries/LibWeb/Infra/Strings.h @@ -2,6 +2,7 @@ * Copyright (c) 2022, Linus Groh <linusg@serenityos.org> * Copyright (c) 2022, networkException <networkexception@serenityos.org> * Copyright (c) 2023, Kenneth Myhra <kennethmyhra@serenityos.org> + * Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -12,6 +13,7 @@ namespace Web::Infra { +bool is_ascii_case_insensitive_match(StringView a, StringView b); DeprecatedString strip_and_collapse_whitespace(StringView string); bool is_code_unit_prefix(StringView potential_prefix, StringView input); ErrorOr<String> convert_to_scalar_value_string(StringView string); |