Title: [210399] trunk
Revision
210399
Author
[email protected]
Date
2017-01-05 17:04:34 -0800 (Thu, 05 Jan 2017)

Log Message

Carets can split up marriages and families
https://bugs.webkit.org/show_bug.cgi?id=166711
<rdar://problem/29019333>

Reviewed by Alex Christensen.

Source/WTF:

There are four code points which should be allowed to accept emoji modifiers:
- U+1F46A FAMILY
- U+1F46B MAN AND WOMAN HOLDING HANDS
- U+1F46C TWO MEN HOLDING HANDS
- U+1F46D TWO WOMEN HOLDING HANDS

Even though macOS's and iOS's emoji keyboard don't allow users to actually type
these combinations, we may still receive them from other platforms. We should
therefore treat these as joining sequences. Rendering isn't a problem because
the fonts accept the emoji modifiers, but our caret placement code isn't educated
about it. Currently, we treat these emoji groups as ligatures, allowing the caret
to be placed between the two code points, which visually shows as being horizontally
centered in the glyph. Instead, we should treat these code points as accepting
emoji modifiers.

Tests: editing/caret/emoji.html
       editing/caret/ios/emoji.html

* wtf/text/TextBreakIterator.cpp:
(WTF::cursorMovementIterator):

LayoutTests:

AFAICT we don't have a test where we arrow-through a set of emoji. We do
have tests where we backspace-through a set of emoji. Add a new test for
the arrow keys.

* platform/ios/TestExpectations:
* platform/mac/editing/caret/emoji-expected.txt: Added.
* editing/caret/emoji.html: Added.
* editing/caret/ios/emoji-expected.txt: Added.
* editing/caret/ios/emoji.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (210398 => 210399)


--- trunk/LayoutTests/ChangeLog	2017-01-06 00:24:11 UTC (rev 210398)
+++ trunk/LayoutTests/ChangeLog	2017-01-06 01:04:34 UTC (rev 210399)
@@ -1,3 +1,21 @@
+2017-01-05  Myles C. Maxfield  <[email protected]>
+
+        Carets can split up marriages and families
+        https://bugs.webkit.org/show_bug.cgi?id=166711
+        <rdar://problem/29019333>
+
+        Reviewed by Alex Christensen.
+
+        AFAICT we don't have a test where we arrow-through a set of emoji. We do
+        have tests where we backspace-through a set of emoji. Add a new test for
+        the arrow keys.
+
+        * platform/ios/TestExpectations:
+        * platform/mac/editing/caret/emoji-expected.txt: Added.
+        * editing/caret/emoji.html: Added.
+        * editing/caret/ios/emoji-expected.txt: Added.
+        * editing/caret/ios/emoji.html: Added.
+
 2017-01-05  Ryan Haddad  <[email protected]>
 
         Rebaseline fast/canvas/webgl/context-creation-attributes.html after r210372.

Added: trunk/LayoutTests/editing/caret/emoji.html (0 => 210399)


--- trunk/LayoutTests/editing/caret/emoji.html	                        (rev 0)
+++ trunk/LayoutTests/editing/caret/emoji.html	2017-01-06 01:04:34 UTC (rev 210399)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div id="test" contenteditable="true">&#x1f46b;&#x1f46b;&#x1f3fb;&#x1f46b;&#x1f3ff;&#x1f46c;&#x1f46c;&#x1f3fb;&#x1f46c;&#x1f3ff;&#x1f46d;&#x1f46d;&#x1f3fb;&#x1f46d;&#x1f3ff;&#x1f46a;&#x1f46a;&#x1f3fb;&#x1f46a;&#x1f3ff;
+</div>
+<script src=""
+<script>
+Markup.description("This test verifies that deletions are correct over emoji groups and emoji with variations");
+var testElement = document.getElementById('test');
+getSelection().setBaseAndExtent(testElement.firstChild, testElement.firstChild.length, testElement.firstChild, testElement.firstChild.length);
+Markup.dump("test");
+if (window.eventSender) {
+	while (window.getSelection().getRangeAt(0).startOffset > 0) {
+    	eventSender.keyDown("leftArrow");
+    	Markup.dump("test");
+	}
+}
+
+</script>
+</body>
+</html>

Added: trunk/LayoutTests/editing/caret/ios/emoji-expected.html (0 => 210399)


--- trunk/LayoutTests/editing/caret/ios/emoji-expected.html	                        (rev 0)
+++ trunk/LayoutTests/editing/caret/ios/emoji-expected.html	2017-01-06 01:04:34 UTC (rev 210399)
@@ -0,0 +1,14 @@
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS currentWidth is within 1 of 15
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/editing/caret/ios/emoji.html (0 => 210399)


--- trunk/LayoutTests/editing/caret/ios/emoji.html	                        (rev 0)
+++ trunk/LayoutTests/editing/caret/ios/emoji.html	2017-01-06 01:04:34 UTC (rev 210399)
@@ -0,0 +1,85 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<html>
+<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
+<head>
+    <script src=""
+    <style>
+        body {
+            margin: 0;
+        }
+
+        input {
+            width: 100%;
+            height: 50px;
+            position: absolute;
+            left: 0;
+            top: 0;
+        }
+
+        div {
+            background-image: linear-gradient(0deg, blue, red);
+            height: 4000px;
+        }
+    </style>
+    <script>
+    window.jsTestIsAsync = true;
+
+    function tapInInputScript(tapX, tapY)
+    {
+        return `
+        var caretPositions = [];
+
+        function pressArrow() {
+            uiController.typeCharacterUsingHardwareKeyboard("leftArrow", function() {
+                uiController.doAfterNextStablePresentationUpdate(function() {
+                    var selectionRectLeft = uiController.textSelectionCaretRect.left;
+                    var caretPositionsLength = caretPositions.length;
+                    if (caretPositionsLength == 0 || caretPositions[caretPositionsLength - 1] != selectionRectLeft) {
+                        caretPositions.push(selectionRectLeft);
+                        pressArrow();
+                    } else
+                        uiController.uiScriptComplete(JSON.stringify(caretPositions));
+                });
+            });
+        };
+
+        (function() {
+            uiController.didShowKeyboardCallback = function() {
+                uiController.doAfterNextStablePresentationUpdate(function() {
+                    pressArrow();
+                });
+            };
+            uiController.singleTapAtPoint(${tapX}, ${tapY}, function() { });
+        })()`;
+    }
+
+    var pixelWidth;
+    var currentWidth;
+    function run()
+    {
+        if (!window.testRunner || !testRunner.runUIScript) {
+            description("To manually test, place the caret in the field above and use the arrow keys to make sure the carets don't appear in the middle of characters.");
+            return;
+        }
+
+        testRunner.runUIScript(tapInInputScript(window.innerWidth * 2 / 3, 30), caretPositions => {
+            caretPositions = JSON.parse(caretPositions);
+            pixelWidth = -1;
+            for (var i = 0; i < caretPositions.length - 1; ++i) {
+                currentWidth = caretPositions[i] - caretPositions[i + 1];
+                if (pixelWidth == -1)
+                    pixelWidth = currentWidth;
+                else
+                    shouldBeCloseTo("currentWidth", pixelWidth, 1);
+            }
+            finishJSTest();
+        });
+    }
+    </script>
+</head>
+<body _onload_=run()>
+    <input value="&#x1f46b;&#x1f46b;&#x1f3fb;&#x1f46b;&#x1f3ff;&#x1f46c;&#x1f46c;&#x1f3fb;&#x1f46c;&#x1f3ff;&#x1f46d;&#x1f46d;&#x1f3fb;&#x1f46d;&#x1f3ff;&#x1f46a;&#x1f46a;&#x1f3fb;&#x1f46a;&#x1f3ff;"></input>
+    <script src=""
+</body>
+
+</html>

Modified: trunk/LayoutTests/platform/ios-simulator/TestExpectations (210398 => 210399)


--- trunk/LayoutTests/platform/ios-simulator/TestExpectations	2017-01-06 00:24:11 UTC (rev 210398)
+++ trunk/LayoutTests/platform/ios-simulator/TestExpectations	2017-01-06 01:04:34 UTC (rev 210399)
@@ -2770,3 +2770,6 @@
 media/encrypted-media/mock-navigator-requestMediaKeySystemAccess.html [ Skip ]
 
 webkit.org/b/166736 fast/scrolling/page-cache-back-overflow-scroll-restore.html [ Skip ]
+
+# editing/caret/ios/emoji.html is used instead.
+editing/caret/emoji.html [ Failure ]

Added: trunk/LayoutTests/platform/mac/editing/caret/emoji-expected.txt (0 => 210399)


--- trunk/LayoutTests/platform/mac/editing/caret/emoji-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/mac/editing/caret/emoji-expected.txt	2017-01-06 01:04:34 UTC (rev 210399)
@@ -0,0 +1,53 @@
+This test verifies that deletions are correct over emoji groups and emoji with variations
+
+Dump of markup 1:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿<#selection-caret>
+"
+
+Dump of markup 2:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻<#selection-caret>πŸ‘ͺ🏿
+"
+
+Dump of markup 3:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺ<#selection-caret>πŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 4:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏ<#selection-caret>πŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 5:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»<#selection-caret>πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 6:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­<#selection-caret>πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 7:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏ<#selection-caret>πŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 8:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»<#selection-caret>πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 9:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬<#selection-caret>πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 10:
+| "πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏ<#selection-caret>πŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 11:
+| "πŸ‘«πŸ‘«πŸ»<#selection-caret>πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 12:
+| "πŸ‘«<#selection-caret>πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
+
+Dump of markup 13:
+| "<#selection-caret>πŸ‘«πŸ‘«πŸ»πŸ‘«πŸΏπŸ‘¬πŸ‘¬πŸ»πŸ‘¬πŸΏπŸ‘­πŸ‘­πŸ»πŸ‘­πŸΏπŸ‘ͺπŸ‘ͺ🏻πŸ‘ͺ🏿
+"
Property changes on: trunk/LayoutTests/platform/mac/editing/caret/emoji-expected.txt
___________________________________________________________________

Added: svn:eol-style

+native \ No newline at end of property

Added: svn:keywords

+Author Date Id Rev URL \ No newline at end of property

Modified: trunk/Source/WTF/ChangeLog (210398 => 210399)


--- trunk/Source/WTF/ChangeLog	2017-01-06 00:24:11 UTC (rev 210398)
+++ trunk/Source/WTF/ChangeLog	2017-01-06 01:04:34 UTC (rev 210399)
@@ -1,3 +1,32 @@
+2017-01-05  Myles C. Maxfield  <[email protected]>
+
+        Carets can split up marriages and families
+        https://bugs.webkit.org/show_bug.cgi?id=166711
+        <rdar://problem/29019333>
+
+        Reviewed by Alex Christensen.
+
+        There are four code points which should be allowed to accept emoji modifiers:
+        - U+1F46A FAMILY
+        - U+1F46B MAN AND WOMAN HOLDING HANDS
+        - U+1F46C TWO MEN HOLDING HANDS
+        - U+1F46D TWO WOMEN HOLDING HANDS
+
+        Even though macOS's and iOS's emoji keyboard don't allow users to actually type
+        these combinations, we may still receive them from other platforms. We should
+        therefore treat these as joining sequences. Rendering isn't a problem because
+        the fonts accept the emoji modifiers, but our caret placement code isn't educated
+        about it. Currently, we treat these emoji groups as ligatures, allowing the caret
+        to be placed between the two code points, which visually shows as being horizontally
+        centered in the glyph. Instead, we should treat these code points as accepting
+        emoji modifiers.
+
+        Tests: editing/caret/emoji.html
+               editing/caret/ios/emoji.html
+
+        * wtf/text/TextBreakIterator.cpp:
+        (WTF::cursorMovementIterator):
+
 2017-01-05  Filip Pizlo  <[email protected]>
 
         AutomaticThread timeout shutdown leaves a small window where notify() would think that the thread is still running

Modified: trunk/Source/WTF/wtf/text/TextBreakIterator.cpp (210398 => 210399)


--- trunk/Source/WTF/wtf/text/TextBreakIterator.cpp	2017-01-06 00:24:11 UTC (rev 210398)
+++ trunk/Source/WTF/wtf/text/TextBreakIterator.cpp	2017-01-06 01:04:34 UTC (rev 210399)
@@ -216,7 +216,7 @@
         "$EmojiVar = [\\uFE0F];" // Emoji-style variation selector
 #if ADDITIONAL_EMOJI_SUPPORT
         "$EmojiForSeqs = [\\u2640 \\u2642 \\u26F9 \\u2764 \\U0001F308 \\U0001F3C3-\\U0001F3C4 \\U0001F3CA-\\U0001F3CC \\U0001F3F3 \\U0001F441 \\U0001F466-\\U0001F469 \\U0001F46E-\\U0001F46F \\U0001F471 \\U0001F473 \\U0001F477 \\U0001F481-\\U0001F482 \\U0001F486-\\U0001F487 \\U0001F48B \\U0001F575 \\U0001F5E8 \\U0001F645-\\U0001F647 \\U0001F64B \\U0001F64D-\\U0001F64E \\U0001F6A3 \\U0001F6B4-\\U0001F6B6 \\u2695-\\u2696 \\u2708 \\U0001F33E \\U0001F373 \\U0001F393 \\U0001F3A4 \\U0001F3A8 \\U0001F3EB \\U0001F3ED \\U0001F4BB-\\U0001F4BC \\U0001F527 \\U0001F52C \\U0001F680 \\U0001F692 \\U0001F926 \\U0001F937-\\U0001F939 \\U0001F93C-\\U0001F93E];" // Emoji that participate in ZWJ sequences
-        "$EmojiForMods = [\\u261D \\u26F9 \\u270A-\\u270D \\U0001F385 \\U0001F3C3-\\U0001F3C4 \\U0001F3CA \\U0001F3CB \\U0001F442-\\U0001F443 \\U0001F446-\\U0001F450 \\U0001F466-\\U0001F469 \\U0001F46E-\\U0001F478 \\U0001F47C \\U0001F481-\\U0001F483 \\U0001F485-\\U0001F487 \\U0001F4AA \\U0001F575 \\U0001F590 \\U0001F595 \\U0001F596 \\U0001F645-\\U0001F647 \\U0001F64B-\\U0001F64F \\U0001F6A3 \\U0001F6B4-\\U0001F6B6 \\U0001F6C0 \\U0001F918 \\U0001F3C2 \\U0001F3C7 \\U0001F3CC \\U0001F574 \\U0001F57A \\U0001F6CC \\U0001F919-\\U0001F91E \\U0001F926 \\U0001F930 \\U0001F933-\\U0001F939 \\U0001F93C-\\U0001F93E] ;" // Emoji that take Fitzpatrick modifiers
+        "$EmojiForMods = [\\u261D \\u26F9 \\u270A-\\u270D \\U0001F385 \\U0001F3C3-\\U0001F3C4 \\U0001F3CA \\U0001F3CB \\U0001F442-\\U0001F443 \\U0001F446-\\U0001F450 \\U0001F466-\\U0001F478 \\U0001F47C \\U0001F481-\\U0001F483 \\U0001F485-\\U0001F487 \\U0001F4AA \\U0001F575 \\U0001F590 \\U0001F595 \\U0001F596 \\U0001F645-\\U0001F647 \\U0001F64B-\\U0001F64F \\U0001F6A3 \\U0001F6B4-\\U0001F6B6 \\U0001F6C0 \\U0001F918 \\U0001F3C2 \\U0001F3C7 \\U0001F3CC \\U0001F574 \\U0001F57A \\U0001F6CC \\U0001F919-\\U0001F91E \\U0001F926 \\U0001F930 \\U0001F933-\\U0001F939 \\U0001F93C-\\U0001F93E] ;" // Emoji that take Fitzpatrick modifiers
 #else
         "$EmojiForSeqs = [\\u2764 \\U0001F466-\\U0001F469 \\U0001F48B];" // Emoji that participate in ZWJ sequences
         "$EmojiForMods = [\\u261D \\u270A-\\u270C \\U0001F385 \\U0001F3C3-\\U0001F3C4 \\U0001F3C7 \\U0001F3CA \\U0001F442-\\U0001F443 \\U0001F446-\\U0001F450 \\U0001F466-\\U0001F469 \\U0001F46E-\\U0001F478 \\U0001F47C \\U0001F481-\\U0001F483 \\U0001F485-\\U0001F487 \\U0001F4AA \\U0001F596 \\U0001F645-\\U0001F647 \\U0001F64B-\\U0001F64F \\U0001F6A3 \\U0001F6B4-\\U0001F6B6 \\U0001F6C0] ;" // Emoji that take Fitzpatrick modifiers
@@ -449,7 +449,7 @@
     "$EmojiVar = \\uFE0F;"
 #if ADDITIONAL_EMOJI_SUPPORT
     "$EmojiForSeqs = [\\u2640 \\u2642 \\u26F9 \\u2764 \\U0001F308 \\U0001F3C3-\\U0001F3C4 \\U0001F3CA-\\U0001F3CC \\U0001F3F3 \\U0001F441 \\U0001F466-\\U0001F469 \\U0001F46E-\\U0001F46F \\U0001F471 \\U0001F473 \\U0001F477 \\U0001F481-\\U0001F482 \\U0001F486-\\U0001F487 \\U0001F48B \\U0001F575 \\U0001F5E8 \\U0001F645-\\U0001F647 \\U0001F64B \\U0001F64D-\\U0001F64E \\U0001F6A3 \\U0001F6B4-\\U0001F6B6 \\u2695-\\u2696 \\u2708 \\U0001F33E \\U0001F373 \\U0001F393 \\U0001F3A4 \\U0001F3A8 \\U0001F3EB \\U0001F3ED \\U0001F4BB-\\U0001F4BC \\U0001F527 \\U0001F52C \\U0001F680 \\U0001F692 \\U0001F926 \\U0001F937-\\U0001F939 \\U0001F93C-\\U0001F93E];" // Emoji that participate in ZWJ sequences
-    "$EmojiForMods = [\\u261D \\u26F9 \\u270A-\\u270D \\U0001F385 \\U0001F3C3-\\U0001F3C4 \\U0001F3CA \\U0001F3CB \\U0001F442-\\U0001F443 \\U0001F446-\\U0001F450 \\U0001F466-\\U0001F469 \\U0001F46E-\\U0001F478 \\U0001F47C \\U0001F481-\\U0001F483 \\U0001F485-\\U0001F487 \\U0001F4AA \\U0001F575 \\U0001F590 \\U0001F595 \\U0001F596 \\U0001F645-\\U0001F647 \\U0001F64B-\\U0001F64F \\U0001F6A3 \\U0001F6B4-\\U0001F6B6 \\U0001F6C0 \\U0001F918 \\U0001F3C2 \\U0001F3C7 \\U0001F3CC \\U0001F574 \\U0001F57A \\U0001F6CC \\U0001F919-\\U0001F91E \\U0001F926 \\U0001F930 \\U0001F933-\\U0001F939 \\U0001F93C-\\U0001F93E] ;" // Emoji that take Fitzpatrick modifiers
+    "$EmojiForMods = [\\u261D \\u26F9 \\u270A-\\u270D \\U0001F385 \\U0001F3C3-\\U0001F3C4 \\U0001F3CA \\U0001F3CB \\U0001F442-\\U0001F443 \\U0001F446-\\U0001F450 \\U0001F466-\\U0001F478 \\U0001F47C \\U0001F481-\\U0001F483 \\U0001F485-\\U0001F487 \\U0001F4AA \\U0001F575 \\U0001F590 \\U0001F595 \\U0001F596 \\U0001F645-\\U0001F647 \\U0001F64B-\\U0001F64F \\U0001F6A3 \\U0001F6B4-\\U0001F6B6 \\U0001F6C0 \\U0001F918 \\U0001F3C2 \\U0001F3C7 \\U0001F3CC \\U0001F574 \\U0001F57A \\U0001F6CC \\U0001F919-\\U0001F91E \\U0001F926 \\U0001F930 \\U0001F933-\\U0001F939 \\U0001F93C-\\U0001F93E] ;" // Emoji that take Fitzpatrick modifiers
 #else
     "$EmojiForSeqs = [\\u2764 \\U0001F466-\\U0001F469 \\U0001F48B];"
     "$EmojiForMods = [\\u261D \\u270A-\\u270C \\U0001F385 \\U0001F3C3-\\U0001F3C4 \\U0001F3C7 \\U0001F3CA \\U0001F442-\\U0001F443 \\U0001F446-\\U0001F450 \\U0001F466-\\U0001F469 \\U0001F46E-\\U0001F478 \\U0001F47C \\U0001F481-\\U0001F483 \\U0001F485-\\U0001F487 \\U0001F4AA \\U0001F596 \\U0001F645-\\U0001F647 \\U0001F64B-\\U0001F64F \\U0001F6A3 \\U0001F6B4-\\U0001F6B6 \\U0001F6C0] ;" // Emoji that take Fitzpatrick modifiers
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to