From 81d930a594ae25a92bdaf2f7ed2ca3fea0523325 Mon Sep 17 00:00:00 2001
From: Jonathan Kew <jkew@mozilla.com>
Date: Tue, 28 Feb 2023 09:58:36 +0000
Subject: [PATCH] Bug 1819025 - Don't consider following join-controls when
 determining whether a space is collapsible. r=emilio

Differential Revision: https://phabricator.services.mozilla.com/D171061
---
 intl/unicharutil/util/nsUnicodeProperties.cpp | 9 +++++++++
 intl/unicharutil/util/nsUnicodeProperties.h   | 6 ++++++
 layout/generic/nsTextFrameUtils.cpp           | 2 +-
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/intl/unicharutil/util/nsUnicodeProperties.cpp b/intl/unicharutil/util/nsUnicodeProperties.cpp
index 7f5029765cc41..ea7fa80ea92b8 100644
--- a/intl/unicharutil/util/nsUnicodeProperties.cpp
+++ b/intl/unicharutil/util/nsUnicodeProperties.cpp
@@ -167,6 +167,15 @@ bool IsClusterExtender(uint32_t aCh, uint8_t aCategory) {
       (aCh >= 0xe0020 && aCh <= 0xe007f));   // emoji (flag) tag characters
 }
 
+bool IsClusterExtenderExcludingJoiners(uint32_t aCh, uint8_t aCategory) {
+  return (
+      (aCategory >= HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK &&
+       aCategory <= HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) ||
+      (aCh >= 0xff9e && aCh <= 0xff9f) ||    // katakana sound marks
+      (aCh >= 0x1F3FB && aCh <= 0x1F3FF) ||  // fitzpatrick skin tone modifiers
+      (aCh >= 0xe0020 && aCh <= 0xe007f));   // emoji (flag) tag characters
+}
+
 uint32_t CountGraphemeClusters(Span<const char16_t> aText) {
   intl::GraphemeClusterBreakIteratorUtf16 iter(aText);
   uint32_t result = 0;
diff --git a/intl/unicharutil/util/nsUnicodeProperties.h b/intl/unicharutil/util/nsUnicodeProperties.h
index 610dc3c734d27..6f3c9dbaf8936 100644
--- a/intl/unicharutil/util/nsUnicodeProperties.h
+++ b/intl/unicharutil/util/nsUnicodeProperties.h
@@ -159,6 +159,12 @@ inline bool IsClusterExtender(uint32_t aCh) {
   return IsClusterExtender(aCh, GetGeneralCategory(aCh));
 }
 
+bool IsClusterExtenderExcludingJoiners(uint32_t aCh, uint8_t aCategory);
+
+inline bool IsClusterExtenderExcludingJoiners(uint32_t aCh) {
+  return IsClusterExtenderExcludingJoiners(aCh, GetGeneralCategory(aCh));
+}
+
 // Count the number of grapheme clusters in the given string
 uint32_t CountGraphemeClusters(Span<const char16_t> aText);
 
diff --git a/layout/generic/nsTextFrameUtils.cpp b/layout/generic/nsTextFrameUtils.cpp
index 170ee0f7e6179..1cfa51fbdecf5 100644
--- a/layout/generic/nsTextFrameUtils.cpp
+++ b/layout/generic/nsTextFrameUtils.cpp
@@ -23,7 +23,7 @@ using namespace mozilla::dom;
 bool nsTextFrameUtils::IsSpaceCombiningSequenceTail(const char16_t* aChars,
                                                     int32_t aLength) {
   return aLength > 0 &&
-         (mozilla::unicode::IsClusterExtender(aChars[0]) ||
+         (mozilla::unicode::IsClusterExtenderExcludingJoiners(aChars[0]) ||
           (IsBidiControl(aChars[0]) &&
            IsSpaceCombiningSequenceTail(aChars + 1, aLength - 1)));
 }
-- 
GitLab