<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[173682] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/173682">173682</a></dd>
<dt>Author</dt> <dd>enrica@apple.com</dd>
<dt>Date</dt> <dd>2014-09-16 17:48:01 -0700 (Tue, 16 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Should have an editing behavior specific for IOS.
https://bugs.webkit.org/show_bug.cgi?id=136876

Reviewed by Sam Weinig.

This patch introduces a new editing behavior type to be able
to perform editing tasks that are specific to iOS.
All the existing EditingBehavior methods return the same boolean
value for for Mac and iOS. A new one has been introduced to support
a specific behavior in the DeleteSelectionCommand.

* editing/DeleteSelectionCommand.cpp:
(WebCore::DeleteSelectionCommand::doApply):
* editing/EditingBehavior.h:
(WebCore::EditingBehavior::shouldConsiderSelectionAsDirectional):
(WebCore::EditingBehavior::shouldCenterAlignWhenSelectionIsRevealed):
(WebCore::EditingBehavior::shouldToggleStyleBasedOnStartOfSelection):
(WebCore::EditingBehavior::shouldAlwaysGrowSelectionWhenExtendingToBoundary):
(WebCore::EditingBehavior::shouldSelectOnContextualMenuClick):
(WebCore::EditingBehavior::shouldExtendSelectionByWordOrLineAcrossCaret):
(WebCore::EditingBehavior::shouldRebalanceWhiteSpacesInSecureField):
* editing/EditingBehaviorTypes.h:
* editing/FrameSelection.cpp:
(WebCore::FrameSelection::positionForPlatform):
* page/Settings.cpp:
(WebCore::editingBehaviorTypeForPlatform):
* testing/InternalSettings.cpp:
(WebCore::InternalSettings::setEditingBehavior):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreeditingDeleteSelectionCommandcpp">trunk/Source/WebCore/editing/DeleteSelectionCommand.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingEditingBehaviorh">trunk/Source/WebCore/editing/EditingBehavior.h</a></li>
<li><a href="#trunkSourceWebCoreeditingEditingBehaviorTypesh">trunk/Source/WebCore/editing/EditingBehaviorTypes.h</a></li>
<li><a href="#trunkSourceWebCoreeditingFrameSelectioncpp">trunk/Source/WebCore/editing/FrameSelection.cpp</a></li>
<li><a href="#trunkSourceWebCorepageSettingscpp">trunk/Source/WebCore/page/Settings.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingInternalSettingscpp">trunk/Source/WebCore/testing/InternalSettings.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (173681 => 173682)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-09-17 00:32:18 UTC (rev 173681)
+++ trunk/Source/WebCore/ChangeLog        2014-09-17 00:48:01 UTC (rev 173682)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2014-09-16  Enrica Casucci  &lt;enrica@apple.com&gt;
+
+        Should have an editing behavior specific for IOS.
+        https://bugs.webkit.org/show_bug.cgi?id=136876
+
+        Reviewed by Sam Weinig.
+
+        This patch introduces a new editing behavior type to be able
+        to perform editing tasks that are specific to iOS.
+        All the existing EditingBehavior methods return the same boolean
+        value for for Mac and iOS. A new one has been introduced to support
+        a specific behavior in the DeleteSelectionCommand.
+
+        * editing/DeleteSelectionCommand.cpp:
+        (WebCore::DeleteSelectionCommand::doApply):
+        * editing/EditingBehavior.h:
+        (WebCore::EditingBehavior::shouldConsiderSelectionAsDirectional):
+        (WebCore::EditingBehavior::shouldCenterAlignWhenSelectionIsRevealed):
+        (WebCore::EditingBehavior::shouldToggleStyleBasedOnStartOfSelection):
+        (WebCore::EditingBehavior::shouldAlwaysGrowSelectionWhenExtendingToBoundary):
+        (WebCore::EditingBehavior::shouldSelectOnContextualMenuClick):
+        (WebCore::EditingBehavior::shouldExtendSelectionByWordOrLineAcrossCaret):
+        (WebCore::EditingBehavior::shouldRebalanceWhiteSpacesInSecureField):
+        * editing/EditingBehaviorTypes.h:
+        * editing/FrameSelection.cpp:
+        (WebCore::FrameSelection::positionForPlatform):
+        * page/Settings.cpp:
+        (WebCore::editingBehaviorTypeForPlatform):
+        * testing/InternalSettings.cpp:
+        (WebCore::InternalSettings::setEditingBehavior):
+
</ins><span class="cx"> 2014-09-16  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r173670.
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingDeleteSelectionCommandcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/DeleteSelectionCommand.cpp (173681 => 173682)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/DeleteSelectionCommand.cpp        2014-09-17 00:32:18 UTC (rev 173681)
+++ trunk/Source/WebCore/editing/DeleteSelectionCommand.cpp        2014-09-17 00:48:01 UTC (rev 173682)
</span><span class="lines">@@ -861,24 +861,17 @@
</span><span class="cx">         insertNodeAt(placeholder.get(), m_endingPosition);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-#if PLATFORM(IOS)
-    // This checking is due to iphone shows the last entered character momentarily, removing and adding back the 
-    // space when deleting password cause space been showed insecurely.
-    bool isSecure = NO;
-    Node* node = m_endingPosition.deprecatedNode();
-    if (node &amp;&amp; node-&gt;isTextNode()) {
-        Text* textNode = static_cast&lt;Text*&gt;(node);    
-        if (textNode-&gt;length() &gt; 0) {
-            RenderObject* renderer = textNode-&gt;renderer();
-            isSecure = renderer-&gt;style().textSecurity() != TSNONE;
-        }
</del><ins>+    bool shouldRebalaceWhiteSpace = true;
+    if (!frame().editor().behavior().shouldRebalanceWhiteSpacesInSecureField()) {
+        Node* node = m_endingPosition.deprecatedNode();
+        if (node &amp;&amp; node-&gt;isTextNode()) {
+            Text* textNode = toText(node);
+            if (textNode-&gt;length())
+                shouldRebalaceWhiteSpace = textNode-&gt;renderer()-&gt;style().textSecurity() == TSNONE;
+        }        
</ins><span class="cx">     }
</span><del>-        
-    if (!isSecure)
</del><ins>+    if (shouldRebalaceWhiteSpace)
</ins><span class="cx">         rebalanceWhitespaceAt(m_endingPosition);
</span><del>-#else
-    rebalanceWhitespaceAt(m_endingPosition);
-#endif
</del><span class="cx"> 
</span><span class="cx">     calculateTypingStyleAfterDelete();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingEditingBehaviorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/EditingBehavior.h (173681 => 173682)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/EditingBehavior.h        2014-09-17 00:32:18 UTC (rev 173681)
+++ trunk/Source/WebCore/editing/EditingBehavior.h        2014-09-17 00:48:01 UTC (rev 173682)
</span><span class="lines">@@ -46,22 +46,22 @@
</span><span class="cx"> 
</span><span class="cx">     // On Windows, selections should always be considered as directional, regardless if it is
</span><span class="cx">     // mouse-based or keyboard-based.
</span><del>-    bool shouldConsiderSelectionAsDirectional() const { return m_type != EditingMacBehavior; }
</del><ins>+    bool shouldConsiderSelectionAsDirectional() const { return m_type != EditingMacBehavior &amp;&amp; m_type != EditingIOSBehavior; }
</ins><span class="cx"> 
</span><span class="cx">     // On Mac, when revealing a selection (for example as a result of a Find operation on the Browser),
</span><span class="cx">     // content should be scrolled such that the selection gets certer aligned.
</span><del>-    bool shouldCenterAlignWhenSelectionIsRevealed() const { return m_type == EditingMacBehavior; }
</del><ins>+    bool shouldCenterAlignWhenSelectionIsRevealed() const { return m_type == EditingMacBehavior || m_type == EditingIOSBehavior; }
</ins><span class="cx"> 
</span><span class="cx">     // On Mac, style is considered present when present at the beginning of selection. On other platforms,
</span><span class="cx">     // style has to be present throughout the selection.
</span><del>-    bool shouldToggleStyleBasedOnStartOfSelection() const { return m_type == EditingMacBehavior; }
</del><ins>+    bool shouldToggleStyleBasedOnStartOfSelection() const { return m_type == EditingMacBehavior || m_type == EditingIOSBehavior; }
</ins><span class="cx"> 
</span><span class="cx">     // Standard Mac behavior when extending to a boundary is grow the selection rather than leaving the base
</span><span class="cx">     // in place and moving the extent. Matches NSTextView.
</span><del>-    bool shouldAlwaysGrowSelectionWhenExtendingToBoundary() const { return m_type == EditingMacBehavior; }
</del><ins>+    bool shouldAlwaysGrowSelectionWhenExtendingToBoundary() const { return m_type == EditingMacBehavior || m_type == EditingIOSBehavior; }
</ins><span class="cx"> 
</span><span class="cx">     // On Mac, when processing a contextual click, the object being clicked upon should be selected.
</span><del>-    bool shouldSelectOnContextualMenuClick() const { return m_type == EditingMacBehavior; }
</del><ins>+    bool shouldSelectOnContextualMenuClick() const { return m_type == EditingMacBehavior || m_type == EditingIOSBehavior; }
</ins><span class="cx"> 
</span><span class="cx">     // On Linux, should be able to get and insert spelling suggestions without selecting the misspelled word.
</span><span class="cx">     bool shouldAllowSpellingSuggestionsWithoutSelection() const
</span><span class="lines">@@ -78,13 +78,17 @@
</span><span class="cx">     // On Mac, selecting backwards by word/line from the middle of a word/line, and then going
</span><span class="cx">     // forward leaves the caret back in the middle with no selection, instead of directly selecting
</span><span class="cx">     // to the other end of the line/word (Unix/Windows behavior).
</span><del>-    bool shouldExtendSelectionByWordOrLineAcrossCaret() const { return m_type != EditingMacBehavior; }
</del><ins>+    bool shouldExtendSelectionByWordOrLineAcrossCaret() const { return m_type != EditingMacBehavior &amp;&amp; m_type != EditingIOSBehavior; }
</ins><span class="cx"> 
</span><span class="cx">     // Based on native behavior, when using ctrl(alt)+arrow to move caret by word, ctrl(alt)+left arrow moves caret to
</span><span class="cx">     // immediately before the word in all platforms, for example, the word break positions are: &quot;|abc |def |hij |opq&quot;.
</span><span class="cx">     // But ctrl+right arrow moves caret to &quot;abc |def |hij |opq&quot; on Windows and &quot;abc| def| hij| opq|&quot; on Mac and Linux.
</span><span class="cx">     bool shouldSkipSpaceWhenMovingRight() const { return m_type == EditingWindowsBehavior; }
</span><span class="cx"> 
</span><ins>+    // On iOS the last entered character in a secure filed is shown momentarily, removing and adding back the
+    // space when deleting password cause space been showed insecurely.
+    bool shouldRebalanceWhiteSpacesInSecureField() const { return m_type != EditingIOSBehavior; }
+
</ins><span class="cx"> private:
</span><span class="cx">     EditingBehaviorType m_type;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingEditingBehaviorTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/EditingBehaviorTypes.h (173681 => 173682)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/EditingBehaviorTypes.h        2014-09-17 00:32:18 UTC (rev 173681)
+++ trunk/Source/WebCore/editing/EditingBehaviorTypes.h        2014-09-17 00:48:01 UTC (rev 173682)
</span><span class="lines">@@ -39,7 +39,8 @@
</span><span class="cx"> enum EditingBehaviorType {
</span><span class="cx">     EditingMacBehavior,
</span><span class="cx">     EditingWindowsBehavior,
</span><del>-    EditingUnixBehavior
</del><ins>+    EditingUnixBehavior,
+    EditingIOSBehavior
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // WebCore namespace
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingFrameSelectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/FrameSelection.cpp (173681 => 173682)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/FrameSelection.cpp        2014-09-17 00:32:18 UTC (rev 173681)
+++ trunk/Source/WebCore/editing/FrameSelection.cpp        2014-09-17 00:48:01 UTC (rev 173682)
</span><span class="lines">@@ -616,7 +616,7 @@
</span><span class="cx"> 
</span><span class="cx"> VisiblePosition FrameSelection::positionForPlatform(bool isGetStart) const
</span><span class="cx"> {
</span><del>-    if (m_frame &amp;&amp; m_frame-&gt;settings().editingBehaviorType() == EditingMacBehavior)
</del><ins>+    if (m_frame &amp;&amp; (m_frame-&gt;settings().editingBehaviorType() == EditingMacBehavior || m_frame-&gt;settings().editingBehaviorType() == EditingIOSBehavior))
</ins><span class="cx">         return isGetStart ? m_selection.visibleStart() : m_selection.visibleEnd();
</span><span class="cx">     // Linux and Windows always extend selections from the extent endpoint.
</span><span class="cx">     // FIXME: VisibleSelection should be fixed to ensure as an invariant that
</span></span></pre></div>
<a id="trunkSourceWebCorepageSettingscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Settings.cpp (173681 => 173682)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Settings.cpp        2014-09-17 00:32:18 UTC (rev 173681)
+++ trunk/Source/WebCore/page/Settings.cpp        2014-09-17 00:48:01 UTC (rev 173682)
</span><span class="lines">@@ -107,7 +107,9 @@
</span><span class="cx"> static EditingBehaviorType editingBehaviorTypeForPlatform()
</span><span class="cx"> {
</span><span class="cx">     return
</span><del>-#if OS(DARWIN)
</del><ins>+#if PLATFORM(IOS)
+    EditingIOSBehavior
+#elif OS(DARWIN)
</ins><span class="cx">     EditingMacBehavior
</span><span class="cx"> #elif OS(WINDOWS)
</span><span class="cx">     EditingWindowsBehavior
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalSettingscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/InternalSettings.cpp (173681 => 173682)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/InternalSettings.cpp        2014-09-17 00:32:18 UTC (rev 173681)
+++ trunk/Source/WebCore/testing/InternalSettings.cpp        2014-09-17 00:48:01 UTC (rev 173682)
</span><span class="lines">@@ -349,6 +349,8 @@
</span><span class="cx">         settings()-&gt;setEditingBehaviorType(EditingMacBehavior);
</span><span class="cx">     else if (equalIgnoringCase(editingBehavior, &quot;unix&quot;))
</span><span class="cx">         settings()-&gt;setEditingBehaviorType(EditingUnixBehavior);
</span><ins>+    else if (equalIgnoringCase(editingBehavior, &quot;ios&quot;))
+        settings()-&gt;setEditingBehaviorType(EditingIOSBehavior);
</ins><span class="cx">     else
</span><span class="cx">         ec = SYNTAX_ERR;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>