summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2023-02-15 13:56:37 +0000
committerTim Flynn <trflynn89@pm.me>2023-02-15 12:48:26 -0500
commita419039bb2e10dad80ae5b34cc2b3b0189f65a6c (patch)
treefdcdc053094ed7500246cc5ecc38e9ce50e89327 /Userland/Libraries/LibWeb
parent1453ac79e79dcce39066ba511f4a1d3ef10f39ed (diff)
downloadserenity-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.cpp26
-rw-r--r--Userland/Libraries/LibWeb/Infra/Strings.h2
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);