49static bool characterSequenceIsEmoji(const Vector<UChar, 4>& normalizedCharacters, int32_t normalizedLength)
50{
51 UChar32 character;
52 unsigned clusterLength = 0;
53 SurrogatePairAwareTextIterator iterator(normalizedCharacters.data(), 0, normalizedLength, normalizedLength);
54 if (!iterator.consume(character, clusterLength))
55 return false;
56
57 if (isEmojiKeycapBase(character)) {
58 iterator.advance(clusterLength);
59 UChar32 nextCharacter;
60 if (!iterator.consume(nextCharacter, clusterLength))
61 return false;
62
63 if (nextCharacter == combiningEnclosingKeycap)
64 return true;
65
66 // Variation selector 16.
67 if (nextCharacter == 0xFE0F) {
68 iterator.advance(clusterLength);
69 if (!iterator.consume(nextCharacter, clusterLength))
70 return false;
71
72 if (nextCharacter == combiningEnclosingKeycap)
73 return true;
74 }
75
76 return false;
77 }
78
79 // Regional indicator.
80 if (isEmojiRegionalIndicator(character)) {
81 iterator.advance(clusterLength);
82 UChar32 nextCharacter;
83 if (!iterator.consume(nextCharacter, clusterLength))
84 return false;
85
86 if (isEmojiRegionalIndicator(nextCharacter))
87 return true;
88
89 return false;
90 }
91
92 if (character == combiningEnclosingKeycap)
93 return true;
94
95 if (isEmojiWithPresentationByDefault(character)
96 || isEmojiModifierBase(character)
97 || isEmojiFitzpatrickModifier(character))
98 return true;
99
100 return false;
101}
102