1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:58:11 +00:00

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".
This commit is contained in:
Sam Atkins 2023-02-15 13:56:37 +00:00 committed by Tim Flynn
parent 1453ac79e7
commit a419039bb2
2 changed files with 28 additions and 0 deletions

View file

@ -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)
{