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