<!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>[214692] trunk</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/214692">214692</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2017-03-31 15:36:00 -0700 (Fri, 31 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK2] Tapping away to dismiss the selection does not update the selected DOM range using character granularity
https://bugs.webkit.org/show_bug.cgi?id=170328
&lt;rdar://problem/30904558&gt;

Reviewed by Tim Horton.

Source/WebKit2:

When UIKit clears the selection while in text interaction mode, it notifies its document view (i.e., the
WKContentView) by setting its selected text range to nil. When character granularity selection is enabled, use
this as a cue to notify the web process that the selection is being cleared out.

-setSelectedTextRange: is a noop in the general case because the web process acts as the source of truth for what
the selection currently consists of, and notifies the UI process and UIKit via WKTextPosition and WKTextRange.
However, in the case of character granularity selections, tapping away to clear the selection is handled by
UIKit's text gesture recognizer cluster, which then informs the document (via -setSelectedTextRange:) that the
selection should be cleared out.

Adds a new Layout test: editing/selection/character-granularity-selected-range-after-dismissing-selection.html.

* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView setSelectedTextRange:]):

LayoutTests:

Adds a new layout test verifying that when a user taps away to clear the current selection in character
granularity selection mode, the selected DOM range in the web process does not fall out of sync with UIKit's
selection views, which are dismissed.

* editing/selection/character-granularity-selected-range-after-dismissing-selection-expected.txt: Added.
* editing/selection/character-granularity-selected-range-after-dismissing-selection.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsTestExpectations">trunk/LayoutTests/TestExpectations</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewInteractionmm">trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestseditingselectioncharactergranularityselectedrangeafterdismissingselectionexpectedtxt">trunk/LayoutTests/editing/selection/character-granularity-selected-range-after-dismissing-selection-expected.txt</a></li>
<li><a href="#trunkLayoutTestseditingselectioncharactergranularityselectedrangeafterdismissingselectionhtml">trunk/LayoutTests/editing/selection/character-granularity-selected-range-after-dismissing-selection.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (214691 => 214692)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-03-31 22:18:27 UTC (rev 214691)
+++ trunk/LayoutTests/ChangeLog        2017-03-31 22:36:00 UTC (rev 214692)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2017-03-31  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        [WK2] Tapping away to dismiss the selection does not update the selected DOM range using character granularity
+        https://bugs.webkit.org/show_bug.cgi?id=170328
+        &lt;rdar://problem/30904558&gt;
+
+        Reviewed by Tim Horton.
+
+        Adds a new layout test verifying that when a user taps away to clear the current selection in character
+        granularity selection mode, the selected DOM range in the web process does not fall out of sync with UIKit's
+        selection views, which are dismissed.
+
+        * editing/selection/character-granularity-selected-range-after-dismissing-selection-expected.txt: Added.
+        * editing/selection/character-granularity-selected-range-after-dismissing-selection.html: Added.
+
</ins><span class="cx"> 2017-03-31  Youenn Fablet  &lt;youenn@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add a test to ensure webrtc generated certificates and names are ephemeral
</span></span></pre></div>
<a id="trunkLayoutTestsTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/TestExpectations (214691 => 214692)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/TestExpectations        2017-03-31 22:18:27 UTC (rev 214691)
+++ trunk/LayoutTests/TestExpectations        2017-03-31 22:36:00 UTC (rev 214692)
</span><span class="lines">@@ -79,6 +79,7 @@
</span><span class="cx"> 
</span><span class="cx"> # This test only makes sense on iOS
</span><span class="cx"> fast/attachment/attachment-wrapping-action.html
</span><ins>+editing/selection/character-granularity-selected-range-after-dismissing-selection.html [ Skip ]
</ins><span class="cx"> editing/selection/caret-after-tap-in-editable-selection.html [ Skip ]
</span><span class="cx"> 
</span><span class="cx"> # Only iOS has selection UI drawn by UIKit
</span></span></pre></div>
<a id="trunkLayoutTestseditingselectioncharactergranularityselectedrangeafterdismissingselectionexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/editing/selection/character-granularity-selected-range-after-dismissing-selection-expected.txt (0 => 214692)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/editing/selection/character-granularity-selected-range-after-dismissing-selection-expected.txt                                (rev 0)
+++ trunk/LayoutTests/editing/selection/character-granularity-selected-range-after-dismissing-selection-expected.txt        2017-03-31 22:36:00 UTC (rev 214692)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+WEB
+KIT
+The selected content is now: &quot;WEB&quot;
+The selected content is now: &quot;&quot;
+
</ins></span></pre></div>
<a id="trunkLayoutTestseditingselectioncharactergranularityselectedrangeafterdismissingselectionhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/editing/selection/character-granularity-selected-range-after-dismissing-selection.html (0 => 214692)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/editing/selection/character-granularity-selected-range-after-dismissing-selection.html                                (rev 0)
+++ trunk/LayoutTests/editing/selection/character-granularity-selected-range-after-dismissing-selection.html        2017-03-31 22:36:00 UTC (rev 214692)
</span><span class="lines">@@ -0,0 +1,58 @@
</span><ins>+&lt;!-- webkit-test-runner [ useFlexibleViewport=true, useCharacterSelectionGranularity=true ] --&gt;
+&lt;meta name=viewport content=&quot;width=device-width, initial-scale=1&quot;&gt;
+&lt;div style=&quot;font-size: 125px;&quot;&gt;WEB&lt;br&gt;KIT&lt;/div&gt;
+&lt;div id=&quot;output&quot; style=&quot;color: green; margin-top: 1em;&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+    function selectUpperTextScript()
+    {
+        return `
+        (() =&gt; {
+            uiController.longPressAtPoint(100, 100, () =&gt; {
+                uiController.uiScriptComplete();
+            });
+        })();`
+    }
+
+    function tapLowerTextScript()
+    {
+        return `
+        (() =&gt; {
+            uiController.singleTapAtPoint(100, 225, () =&gt; {
+                uiController.uiScriptComplete();
+            });
+        })();`
+    }
+
+    function appendOutput(message)
+    {
+        let code = document.createElement(&quot;code&quot;);
+        code.appendChild(document.createTextNode(message));
+        output.appendChild(code);
+        output.appendChild(document.createElement(&quot;br&quot;));
+    }
+
+    (() =&gt; {
+        if (!window.testRunner) {
+            appendOutput(`This test cannot be run manually; character granularity selections must be enabled.`);
+            return;
+        }
+
+        let selectedString = &quot;&quot;;
+        document.addEventListener(&quot;selectionchange&quot;, () =&gt; {
+            let currentSelectedString = getSelection().toString();
+            if (selectedString === currentSelectedString)
+                return;
+
+            selectedString = currentSelectedString;
+            appendOutput(`The selected content is now: &quot;${selectedString}&quot;`);
+            if (selectedString === &quot;&quot;)
+                testRunner.notifyDone();
+        });
+    })();
+
+    testRunner.dumpAsText();
+    testRunner.waitUntilDone();
+    testRunner.runUIScript(selectUpperTextScript(), () =&gt; {
+        testRunner.runUIScript(tapLowerTextScript(), () =&gt; { });
+    });
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (214691 => 214692)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-03-31 22:18:27 UTC (rev 214691)
+++ trunk/Source/WebKit2/ChangeLog        2017-03-31 22:36:00 UTC (rev 214692)
</span><span class="lines">@@ -1,5 +1,28 @@
</span><span class="cx"> 2017-03-31  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        [WK2] Tapping away to dismiss the selection does not update the selected DOM range using character granularity
+        https://bugs.webkit.org/show_bug.cgi?id=170328
+        &lt;rdar://problem/30904558&gt;
+
+        Reviewed by Tim Horton.
+
+        When UIKit clears the selection while in text interaction mode, it notifies its document view (i.e., the
+        WKContentView) by setting its selected text range to nil. When character granularity selection is enabled, use
+        this as a cue to notify the web process that the selection is being cleared out.
+
+        -setSelectedTextRange: is a noop in the general case because the web process acts as the source of truth for what
+        the selection currently consists of, and notifies the UI process and UIKit via WKTextPosition and WKTextRange.
+        However, in the case of character granularity selections, tapping away to clear the selection is handled by
+        UIKit's text gesture recognizer cluster, which then informs the document (via -setSelectedTextRange:) that the
+        selection should be cleared out.
+
+        Adds a new Layout test: editing/selection/character-granularity-selected-range-after-dismissing-selection.html.
+
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView setSelectedTextRange:]):
+
+2017-03-31  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
</ins><span class="cx">         [WK2] Tapping editable text inside of a range selection no longer changes the selection to a caret
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=170327
</span><span class="cx">         &lt;rdar://problem/31363816&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewInteractionmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (214691 => 214692)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm        2017-03-31 22:18:27 UTC (rev 214691)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm        2017-03-31 22:36:00 UTC (rev 214692)
</span><span class="lines">@@ -2977,6 +2977,11 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)setSelectedTextRange:(UITextRange *)range
</span><span class="cx"> {
</span><ins>+    if (_webView.configuration.selectionGranularity != WKSelectionGranularityCharacter)
+        return;
+
+    if (!range)
+        [self clearSelection];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (BOOL)hasMarkedText
</span></span></pre>
</div>
</div>

</body>
</html>