Title: [93068] trunk
Revision
93068
Author
[email protected]
Date
2011-08-15 16:34:29 -0700 (Mon, 15 Aug 2011)

Log Message

        Regional indicator symbols that are combined should behave as a single character when editing
        https://bugs.webkit.org/show_bug.cgi?id=65395

        Reviewed by Dan Bernstein.

        Part one: make backspace work.

        Test: editing/deleting/regional-indicators.html

        * rendering/RenderText.cpp:
        (WebCore::isRegionalIndicator):
        (WebCore::RenderText::previousOffsetForBackwardDeletion): Added a special case for regional
        indicator symbols.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (93067 => 93068)


--- trunk/LayoutTests/ChangeLog	2011-08-15 23:18:25 UTC (rev 93067)
+++ trunk/LayoutTests/ChangeLog	2011-08-15 23:34:29 UTC (rev 93068)
@@ -1,3 +1,13 @@
+2011-08-15  Alexey Proskuryakov  <[email protected]>
+
+        Regional indicator symbols that are combined should behave as a single character when editing
+        https://bugs.webkit.org/show_bug.cgi?id=65395
+
+        Reviewed by Dan Bernstein.
+
+        * editing/deleting/regional-indicators-expected.txt: Added.
+        * editing/deleting/regional-indicators.html: Added.
+
 2011-08-15  Chris Rogers  <[email protected]>
 
         Add shell implementation for Web Audio API's MediaElementAudioSourceNode

Modified: trunk/LayoutTests/editing/deleting/delete-3928305-fix.html (93067 => 93068)


--- trunk/LayoutTests/editing/deleting/delete-3928305-fix.html	2011-08-15 23:18:25 UTC (rev 93067)
+++ trunk/LayoutTests/editing/deleting/delete-3928305-fix.html	2011-08-15 23:34:29 UTC (rev 93068)
@@ -13,7 +13,7 @@
 
 <script>
 
-function editingTest() {
+function editisngTest() {
     for (i = 0; i < 4; i++)
     	moveSelectionForwardByCharacterCommand(); 
     for (i = 0; i < 3; i++)

Added: trunk/LayoutTests/editing/deleting/regional-indicators-expected.txt (0 => 93068)


--- trunk/LayoutTests/editing/deleting/regional-indicators-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/editing/deleting/regional-indicators-expected.txt	2011-08-15 23:34:29 UTC (rev 93068)
@@ -0,0 +1,5 @@
+This test checks how backspacing works with regional indicator characters.
+
+a
+1. Delete a flag: PASS
+2. Delete a lone regional indicator character: PASS

Added: trunk/LayoutTests/editing/deleting/regional-indicators.html (0 => 93068)


--- trunk/LayoutTests/editing/deleting/regional-indicators.html	                        (rev 0)
+++ trunk/LayoutTests/editing/deleting/regional-indicators.html	2011-08-15 23:34:29 UTC (rev 93068)
@@ -0,0 +1,26 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+</head>
+<body>
+<p>This test checks how backspacing works with regional indicator characters.</p>
+<div contenteditable id="test">🇯🇵🇯🇵🇯🇵</div> <!-- (j)(p)(j)(p)(j)(p) -->
+<script>
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+var div = document.getElementById("test");
+var afterLastIndicator = document.createRange();
+afterLastIndicator.setStart(div.firstChild, 12);
+document.getSelection().addRange(afterLastIndicator);
+document.execCommand("Delete");
+document.write("1. Delete a flag: " + (div.textContent == "🇯🇵🇯🇵" ? "PASS" : "FAIL") + "<br>");
+
+div.innerText = "a🇯" // a, (j)
+afterLastIndicator.setStart(div.firstChild, 3);
+document.getSelection().addRange(afterLastIndicator);
+document.execCommand("Delete");
+document.write("2. Delete a lone regional indicator character: " + (div.textContent == "a" ? "PASS" : "FAIL"));
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (93067 => 93068)


--- trunk/Source/WebCore/ChangeLog	2011-08-15 23:18:25 UTC (rev 93067)
+++ trunk/Source/WebCore/ChangeLog	2011-08-15 23:34:29 UTC (rev 93068)
@@ -1,3 +1,19 @@
+2011-08-15  Alexey Proskuryakov  <[email protected]>
+
+        Regional indicator symbols that are combined should behave as a single character when editing
+        https://bugs.webkit.org/show_bug.cgi?id=65395
+
+        Reviewed by Dan Bernstein.
+
+        Part one: make backspace work.
+
+        Test: editing/deleting/regional-indicators.html
+
+        * rendering/RenderText.cpp:
+        (WebCore::isRegionalIndicator):
+        (WebCore::RenderText::previousOffsetForBackwardDeletion): Added a special case for regional
+        indicator symbols.
+
 2011-08-15  Jeffrey Pfau  <[email protected]>
 
         New XML parser: Re-entering a character node should not clobber the buffered characters

Modified: trunk/Source/WebCore/rendering/RenderText.cpp (93067 => 93068)


--- trunk/Source/WebCore/rendering/RenderText.cpp	2011-08-15 23:18:25 UTC (rev 93067)
+++ trunk/Source/WebCore/rendering/RenderText.cpp	2011-08-15 23:34:29 UTC (rev 93068)
@@ -1499,6 +1499,12 @@
     return charType == U_NON_SPACING_MARK || charType == U_ENCLOSING_MARK || charType == U_COMBINING_SPACING_MARK;
 }
 
+inline bool isRegionalIndicator(UChar32 c)
+{
+    // National flag emoji each consists of a pair of regional indicator symbols.
+    return 0x1F1E6 <= c && c <= 0x1F1FF;
+}
+
 #endif
 
 int RenderText::previousOffsetForBackwardDeletion(int current) const
@@ -1507,6 +1513,7 @@
     ASSERT(m_text);
     StringImpl& text = *m_text.impl();
     UChar32 character;
+    bool sawRegionalIndicator = false;
     while (current > 0) {
         if (U16_IS_TRAIL(text[--current]))
             --current;
@@ -1515,10 +1522,25 @@
 
         UChar32 character = text.characterStartingAt(current);
 
+        if (sawRegionalIndicator) {
+            // We don't check if the pair of regional indicator symbols before current position can actually be combined
+            // into a flag, and just delete it. This may not agree with how the pair is rendered in edge cases,
+            // but is good enough in practice.
+            if (isRegionalIndicator(character))
+                break;
+            // Don't delete a preceding character that isn't a regional indicator symbol.
+            U16_FWD_1_UNSAFE(text, current);
+        }
+
         // We don't combine characters in Armenian ... Limbu range for backward deletion.
         if ((character >= 0x0530) && (character < 0x1950))
             break;
 
+        if (isRegionalIndicator(character)) {
+            sawRegionalIndicator = true;
+            continue;
+        }
+
         if (!isMark(character) && (character != 0xFF9E) && (character != 0xFF9F))
             break;
     }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to