Index: Source/platform/text/BidiResolver.h |
diff --git a/Source/platform/text/BidiResolver.h b/Source/platform/text/BidiResolver.h |
index 97d3ad496f3362ce5ad5805fc17bb2b91e2be225..64c7bb1f4c9a007898b44445523619111818df41 100644 |
--- a/Source/platform/text/BidiResolver.h |
+++ b/Source/platform/text/BidiResolver.h |
@@ -548,18 +548,31 @@ TextDirection BidiResolver<Iterator, Run>::determineParagraphDirectionality(bool |
} |
if (m_current.atParagraphSeparator()) |
break; |
- if (UChar current = m_current.current()) { |
- WTF::Unicode::Direction charDirection = WTF::Unicode::direction(current); |
- if (charDirection == WTF::Unicode::LeftToRight) { |
- if (hasStrongDirectionality) |
- *hasStrongDirectionality = true; |
- return LTR; |
- } |
- if (charDirection == WTF::Unicode::RightToLeft || charDirection == WTF::Unicode::RightToLeftArabic) { |
- if (hasStrongDirectionality) |
- *hasStrongDirectionality = true; |
- return RTL; |
- } |
+ UChar32 current = m_current.current(); |
+ if (UNLIKELY(U16_IS_SURROGATE(current))) { |
+ increment(); |
+ // If this not the high part of the surrogate pair, then drop it and move to the next. |
+ if (!U16_IS_SURROGATE_LEAD(current)) |
+ continue; |
+ UChar high = static_cast<UChar>(current); |
+ if (m_current.atEnd()) |
+ continue; |
+ UChar low = m_current.current(); |
+ // Verify the low part. If invalid, then assume an invalid surrogate pair and retry. |
+ if (!U16_IS_TRAIL(low)) |
+ continue; |
+ current = U16_GET_SUPPLEMENTARY(high, low); |
+ } |
+ WTF::Unicode::Direction charDirection = WTF::Unicode::direction(current); |
+ if (charDirection == WTF::Unicode::LeftToRight) { |
+ if (hasStrongDirectionality) |
+ *hasStrongDirectionality = true; |
+ return LTR; |
+ } |
+ if (charDirection == WTF::Unicode::RightToLeft || charDirection == WTF::Unicode::RightToLeftArabic) { |
+ if (hasStrongDirectionality) |
+ *hasStrongDirectionality = true; |
+ return RTL; |
} |
increment(); |
} |