<!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>[202132] 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/202132">202132</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2016-06-16 11:49:14 -0700 (Thu, 16 Jun 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS WK2] On iPad, indirect focussing of a text field doesn't always scroll to the correct location
https://bugs.webkit.org/show_bug.cgi?id=158828

Reviewed by Enrica Casucci.

Source/WebKit2:

WebPage::getAssistedNodeInformation() unconditionally set information.selectionRect()
to a 1x1 rect at the last interaction location. This caused -[WKWebView _zoomToFocusRect:...]
to early return under the !forceScroll clause if the last interaction rect was visible, but
the elementRect was not. This would happen, for example, if a click in a &lt;button&gt; focussed
an input on some other portion of the page. This behavior is iPad-only, because forceScroll
is only NO there.

Fix by making getAssistedNodeInformation() only set the selectionRect to the last interaction
location if that is inside of the elementRect (this caters to the case where a tap is inside
an input which is larger than the screen). Otherwise, set it to the empty rect.

Make this testable by allowing a test to opt into the iPad-style scrolling/zooming behavior
in this code path (essentially, making forceScroll NO for testing), via testing SPI on WKWebView,
plumbed through to WKContentView.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView forceIPadStyleZoomOnInputFocus]):
(-[WKWebView setForceIPadStyleZoomOnInputFocus:]):
* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/ios/WKContentViewInteraction.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _displayFormNodeInputView]):
(-[WKContentView requiresAccessoryView:]):
(-[WKContentView inputAccessoryView]):
(-[WKContentView forceIPadStyleZoomOnInputFocus]):
(-[WKContentView setForceIPadStyleZoomOnInputFocus:]):
(-[WKContentView requiresAccessoryView]): Remove redundant returns, and allow testing to
override the &quot;isIPad&quot; condition.
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::getAssistedNodeInformation):

Tools:

Expose &quot;forceIPadStyleZoomOnInputFocus&quot; on UIScriptController, which allows iPad-style
zooming behavior on &lt;input&gt; focus in the iPhone simulator, which is used for testing.

* WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl:
* WebKitTestRunner/UIScriptContext/UIScriptController.cpp:
(WTR::UIScriptController::forceIPadStyleZoomOnInputFocus):
(WTR::UIScriptController::setForceIPadStyleZoomOnInputFocus):
* WebKitTestRunner/UIScriptContext/UIScriptController.h:
* WebKitTestRunner/ios/TestControllerIOS.mm:
(WTR::TestController::platformResetStateToConsistentValues):
* WebKitTestRunner/ios/UIScriptControllerIOS.mm:
(WTR::UIScriptController::forceIPadStyleZoomOnInputFocus):
(WTR::UIScriptController::setForceIPadStyleZoomOnInputFocus):

LayoutTests:

Add various tests for focusing form fields. focus-input-via-button-ipad.html tests
the change in the current patch.

* fast/forms/ios/focus-input-in-fixed-expected.txt: Added.
* fast/forms/ios/focus-input-in-fixed.html: Added.
* fast/forms/ios/focus-input-via-button-ipad-expected.txt: Added.
* fast/forms/ios/focus-input-via-button-ipad.html: Added.
* fast/forms/ios/focus-long-textarea-expected.txt: Added.
* fast/forms/ios/focus-long-textarea.html: Added.
* fast/forms/ios/resources/zooming-test-utils.js:
(testZoomAfterTap):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastformsiosresourceszoomingtestutilsjs">trunk/LayoutTests/fast/forms/ios/resources/zooming-test-utils.js</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewPrivateh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewInteractionh">trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewInteractionmm">trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm">trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsWebKitTestRunnerUIScriptContextBindingsUIScriptControlleridl">trunk/Tools/WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl</a></li>
<li><a href="#trunkToolsWebKitTestRunnerUIScriptContextUIScriptControllercpp">trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerUIScriptContextUIScriptControllerh">trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.h</a></li>
<li><a href="#trunkToolsWebKitTestRunneriosTestControllerIOSmm">trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunneriosUIScriptControllerIOSmm">trunk/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastformsiosfocusinputinfixedexpectedtxt">trunk/LayoutTests/fast/forms/ios/focus-input-in-fixed-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfocusinputinfixedhtml">trunk/LayoutTests/fast/forms/ios/focus-input-in-fixed.html</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfocusinputviabuttonipadexpectedtxt">trunk/LayoutTests/fast/forms/ios/focus-input-via-button-ipad-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfocusinputviabuttonipadhtml">trunk/LayoutTests/fast/forms/ios/focus-input-via-button-ipad.html</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfocuslongtextareaexpectedtxt">trunk/LayoutTests/fast/forms/ios/focus-long-textarea-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfocuslongtextareahtml">trunk/LayoutTests/fast/forms/ios/focus-long-textarea.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/LayoutTests/ChangeLog        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-06-15  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS WK2] On iPad, indirect focussing of a text field doesn't always scroll to the correct location
+        https://bugs.webkit.org/show_bug.cgi?id=158828
+
+        Reviewed by Enrica Casucci.
+        
+        Add various tests for focusing form fields. focus-input-via-button-ipad.html tests
+        the change in the current patch.
+
+        * fast/forms/ios/focus-input-in-fixed-expected.txt: Added.
+        * fast/forms/ios/focus-input-in-fixed.html: Added.
+        * fast/forms/ios/focus-input-via-button-ipad-expected.txt: Added.
+        * fast/forms/ios/focus-input-via-button-ipad.html: Added.
+        * fast/forms/ios/focus-long-textarea-expected.txt: Added.
+        * fast/forms/ios/focus-long-textarea.html: Added.
+        * fast/forms/ios/resources/zooming-test-utils.js:
+        (testZoomAfterTap):
+
</ins><span class="cx"> 2016-06-16  Adam Bergkvist  &lt;adam.bergkvist@ericsson.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebRTC: Check type of this in RTCPeerConnection JS built-in functions
</span></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfocusinputinfixedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/forms/ios/focus-input-in-fixed-expected.txt (0 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/focus-input-in-fixed-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/forms/ios/focus-input-in-fixed-expected.txt        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+
+tap location        { x: 40.000, y: 130.000 }
+scale        1.455
+visibleRect        { left: 0.000, top: 37.809, width: 219.979, height: 329.968 }
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfocusinputinfixedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/forms/ios/focus-input-in-fixed.html (0 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/focus-input-in-fixed.html                                (rev 0)
+++ trunk/LayoutTests/fast/forms/ios/focus-input-in-fixed.html        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+&lt;!DOCTYPE html&gt; &lt;!-- webkit-test-runner [ useFlexibleViewport=true ] --&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;meta name=&quot;viewport&quot; content=&quot;initial-scale=0.5&quot;&gt;
+    &lt;style&gt;
+        .fixed {
+            position: fixed;
+            height: 200px;
+            width: 400px;
+            top: 100px;
+            left: 10px;
+            background-color: silver;
+        }
+        
+        input[type=&quot;text&quot;] {
+            margin: 20px;
+        }
+    &lt;/style&gt;
+    
+    &lt;script src=&quot;resources/zooming-test-utils.js&quot;&gt;&lt;/script&gt;
+    &lt;script&gt;
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+    
+    function doTest()
+    {
+        testZoomAfterTap(document.getElementById('input'), 10, 10);
+    }
+
+    window.addEventListener('load', doTest, false);
+    &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+&lt;div class=&quot;fixed&quot;&gt;
+    &lt;input id=&quot;input&quot; type=&quot;text&quot;&gt;
+&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfocusinputviabuttonipadexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/forms/ios/focus-input-via-button-ipad-expected.txt (0 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/focus-input-via-button-ipad-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/forms/ios/focus-input-via-button-ipad-expected.txt        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+Tests zooming into a text input on tap.
+
+Click to focus input
+
+tap location        { x: 20.000, y: 62.000 }
+scale        1.455
+visibleRect        { left: 0.000, top: 791.923, width: 219.979, height: 329.968 }
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfocusinputviabuttonipadhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/forms/ios/focus-input-via-button-ipad.html (0 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/focus-input-via-button-ipad.html                                (rev 0)
+++ trunk/LayoutTests/fast/forms/ios/focus-input-via-button-ipad.html        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+&lt;!DOCTYPE html&gt; &lt;!-- webkit-test-runner [ useFlexibleViewport=true ] --&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;meta name=&quot;viewport&quot; content=&quot;initial-scale=0.5&quot;&gt;
+    &lt;style&gt;
+        input[type=&quot;text&quot;] {
+            margin: 800px 20px;
+        }
+        button {
+            display: block;
+        }
+    &lt;/style&gt;
+    
+    &lt;script src=&quot;resources/zooming-test-utils.js&quot;&gt;&lt;/script&gt;
+    &lt;script&gt;
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+    
+    function buttonClicked()
+    {
+        document.getElementById('input').focus();
+    }
+
+    function doTest()
+    {
+        const useIPadZoomingBehavior = true;
+        testZoomAfterTap(document.getElementById('target'), 10, 10, useIPadZoomingBehavior);
+    }
+
+    window.addEventListener('load', doTest, false);
+    &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+&lt;p&gt;Tests zooming into a text input on tap.&lt;/p&gt;
+&lt;button id=&quot;target&quot; onclick=&quot;buttonClicked()&quot;&gt;Click to focus input&lt;/button&gt;
+
+&lt;input id=&quot;input&quot; type=&quot;text&quot;&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfocuslongtextareaexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/forms/ios/focus-long-textarea-expected.txt (0 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/focus-long-textarea-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/forms/ios/focus-long-textarea-expected.txt        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+Tests zooming into a tall textarea on tap.
+
+
+tap location        { x: 38.000, y: 664.000 }
+scale        1.455
+visibleRect        { left: 0.000, top: 492.546, width: 219.979, height: 329.968 }
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfocuslongtextareahtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/forms/ios/focus-long-textarea.html (0 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/focus-long-textarea.html                                (rev 0)
+++ trunk/LayoutTests/fast/forms/ios/focus-long-textarea.html        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -0,0 +1,66 @@
</span><ins>+&lt;!DOCTYPE html&gt; &lt;!-- webkit-test-runner [ useFlexibleViewport=true ] --&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;meta name=&quot;viewport&quot; content=&quot;initial-scale=0.5&quot;&gt;
+    &lt;style&gt;
+        textarea {
+            margin: 400px 20px;
+        }
+    &lt;/style&gt;
+    
+    &lt;script src=&quot;resources/zooming-test-utils.js&quot;&gt;&lt;/script&gt;
+    &lt;script&gt;
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    function doTest()
+    {
+        var textarea = document.getElementById('input');
+        var verticalPoint = textarea.clientHeight / 2;
+        testZoomAfterTap(textarea, 10, verticalPoint);
+    }
+
+    window.addEventListener('load', doTest, false);
+    &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+&lt;p&gt;Tests zooming into a tall textarea on tap.&lt;/p&gt;
+&lt;textarea id=&quot;input&quot; rows=&quot;30&quot;&gt;
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+&lt;/textarea&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsiosresourceszoomingtestutilsjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/ios/resources/zooming-test-utils.js (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/resources/zooming-test-utils.js        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/LayoutTests/fast/forms/ios/resources/zooming-test-utils.js        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -1,12 +1,12 @@
</span><span class="cx"> 
</span><del>-function testZoomAfterTap(targetElement, xOffset, yOffset)
</del><ins>+function testZoomAfterTap(targetElement, xOffset, yOffset, useIPadBehavior)
</ins><span class="cx"> {
</span><span class="cx">     if (!window.testRunner || !testRunner.runUIScript)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     var point = getPointInsideElement(targetElement, xOffset, yOffset);
</span><span class="cx"> 
</span><del>-    var uiScript = zoomAfterSingleTapUIScript(point.x, point.y);
</del><ins>+    var uiScript = zoomAfterSingleTapUIScript(point.x, point.y, useIPadBehavior);
</ins><span class="cx">     testRunner.runUIScript(uiScript, function(result) {
</span><span class="cx">         var results = tableFromJSON(result);
</span><span class="cx">         document.body.appendChild(results);
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function zoomAfterSingleTapUIScript(x, y)
</del><ins>+function zoomAfterSingleTapUIScript(x, y, useIPadBehavior)
</ins><span class="cx"> {
</span><span class="cx">     return `
</span><span class="cx">         (function() {
</span><span class="lines">@@ -34,6 +34,8 @@
</span><span class="cx">                 uiController.uiScriptComplete(result);
</span><span class="cx">             };
</span><span class="cx"> 
</span><ins>+            if (${useIPadBehavior})
+                uiController.forceIPadStyleZoomOnInputFocus = true;
</ins><span class="cx">             uiController.singleTapAtPoint(${x}, ${y}, function() {});
</span><span class="cx">         })();`
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Source/WebKit2/ChangeLog        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2016-06-15  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS WK2] On iPad, indirect focussing of a text field doesn't always scroll to the correct location
+        https://bugs.webkit.org/show_bug.cgi?id=158828
+
+        Reviewed by Enrica Casucci.
+        
+        WebPage::getAssistedNodeInformation() unconditionally set information.selectionRect()
+        to a 1x1 rect at the last interaction location. This caused -[WKWebView _zoomToFocusRect:...]
+        to early return under the !forceScroll clause if the last interaction rect was visible, but
+        the elementRect was not. This would happen, for example, if a click in a &lt;button&gt; focussed
+        an input on some other portion of the page. This behavior is iPad-only, because forceScroll
+        is only NO there.
+        
+        Fix by making getAssistedNodeInformation() only set the selectionRect to the last interaction
+        location if that is inside of the elementRect (this caters to the case where a tap is inside
+        an input which is larger than the screen). Otherwise, set it to the empty rect.
+        
+        Make this testable by allowing a test to opt into the iPad-style scrolling/zooming behavior
+        in this code path (essentially, making forceScroll NO for testing), via testing SPI on WKWebView,
+        plumbed through to WKContentView.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView forceIPadStyleZoomOnInputFocus]):
+        (-[WKWebView setForceIPadStyleZoomOnInputFocus:]):
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/ios/WKContentViewInteraction.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView _displayFormNodeInputView]):
+        (-[WKContentView requiresAccessoryView:]):
+        (-[WKContentView inputAccessoryView]):
+        (-[WKContentView forceIPadStyleZoomOnInputFocus]):
+        (-[WKContentView setForceIPadStyleZoomOnInputFocus:]):
+        (-[WKContentView requiresAccessoryView]): Remove redundant returns, and allow testing to
+        override the &quot;isIPad&quot; condition.
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::getAssistedNodeInformation):
+
</ins><span class="cx"> 2016-06-15  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Forward/Back keyboard shortcuts need to flip for RTL
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -4486,6 +4486,16 @@
</span><span class="cx">     [_contentView accessoryTab:NO];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (BOOL)forceIPadStyleZoomOnInputFocus
+{
+    return [_contentView forceIPadStyleZoomOnInputFocus];
+}
+
+- (void)setForceIPadStyleZoomOnInputFocus:(BOOL)forceIPadStyleZoom
+{
+    [_contentView setForceIPadStyleZoomOnInputFocus:forceIPadStyleZoom];
+}
+
</ins><span class="cx"> #endif // PLATFORM(IOS)
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(MAC)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -255,8 +255,10 @@
</span><span class="cx"> - (CGPoint)_convertPointFromContentsToView:(CGPoint)point WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
</span><span class="cx"> - (CGPoint)_convertPointFromViewToContents:(CGPoint)point WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
</span><span class="cx"> 
</span><del>-- (void)keyboardAccessoryBarNext;
-- (void)keyboardAccessoryBarPrevious;
</del><ins>+- (void)keyboardAccessoryBarNext WK_AVAILABLE(NA, WK_IOS_TBA);
+- (void)keyboardAccessoryBarPrevious WK_AVAILABLE(NA, WK_IOS_TBA);
+
+@property (nonatomic) BOOL forceIPadStyleZoomOnInputFocus WK_AVAILABLE(NA, WK_IOS_TBA);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if !TARGET_OS_IPHONE
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewInteractionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -171,6 +171,9 @@
</span><span class="cx">     BOOL _showDebugTapHighlightsForFastClicking;
</span><span class="cx"> 
</span><span class="cx">     BOOL _resigningFirstResponder;
</span><ins>+
+    // For testing.
+    BOOL _forceIPadStyleZoomOnInputFocus;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @end
</span><span class="lines">@@ -231,4 +234,10 @@
</span><span class="cx"> @end
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+@interface WKContentView (WKInteractionTesting)
+
+@property (nonatomic) BOOL forceIPadStyleZoomOnInputFocus;
+
+@end
+
</ins><span class="cx"> #endif // PLATFORM(IOS)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewInteractionmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -1067,8 +1067,9 @@
</span><span class="cx">                   fontSize:_assistedNodeInformation.nodeFontSize
</span><span class="cx">               minimumScale:_assistedNodeInformation.minimumScaleFactor
</span><span class="cx">               maximumScale:_assistedNodeInformation.maximumScaleFactor
</span><del>-              allowScaling:(_assistedNodeInformation.allowsUserScalingIgnoringForceAlwaysScaling &amp;&amp; !UICurrentUserInterfaceIdiomIsPad())
-               forceScroll:[self requiresAccessoryView]];
</del><ins>+              allowScaling:(_assistedNodeInformation.allowsUserScalingIgnoringForceAlwaysScaling &amp;&amp; (!UICurrentUserInterfaceIdiomIsPad() || _forceIPadStyleZoomOnInputFocus))
+               forceScroll:[self requiresAccessoryView:_forceIPadStyleZoomOnInputFocus]];
+
</ins><span class="cx">     _didAccessoryTabInitiateFocus = NO;
</span><span class="cx">     [self _ensureFormAccessoryView];
</span><span class="cx">     [self _updateAccessory];
</span><span class="lines">@@ -1579,7 +1580,7 @@
</span><span class="cx">     [_textSelectionAssistant didEndScrollingOverflow];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (BOOL)requiresAccessoryView
</del><ins>+- (BOOL)requiresAccessoryView:(BOOL)forceIPadBehavior
</ins><span class="cx"> {
</span><span class="cx">     if ([_formInputSession accessoryViewShouldNotShow])
</span><span class="cx">         return NO;
</span><span class="lines">@@ -1595,10 +1596,8 @@
</span><span class="cx">     case InputType::Phone:
</span><span class="cx">     case InputType::Number:
</span><span class="cx">     case InputType::NumberPad:
</span><del>-        return !UICurrentUserInterfaceIdiomIsPad();
</del><span class="cx">     case InputType::ContentEditable:
</span><span class="cx">     case InputType::TextArea:
</span><del>-        return !UICurrentUserInterfaceIdiomIsPad();
</del><span class="cx">     case InputType::Select:
</span><span class="cx">     case InputType::Date:
</span><span class="cx">     case InputType::DateTime:
</span><span class="lines">@@ -1606,7 +1605,7 @@
</span><span class="cx">     case InputType::Month:
</span><span class="cx">     case InputType::Week:
</span><span class="cx">     case InputType::Time:
</span><del>-        return !UICurrentUserInterfaceIdiomIsPad();
</del><ins>+        return !(UICurrentUserInterfaceIdiomIsPad() || forceIPadBehavior);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1621,7 +1620,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (UIView *)inputAccessoryView
</span><span class="cx"> {
</span><del>-    if (![self requiresAccessoryView])
</del><ins>+    if (![self requiresAccessoryView:NO])
</ins><span class="cx">         return nil;
</span><span class="cx"> 
</span><span class="cx">     return self.formAccessoryView;
</span><span class="lines">@@ -4112,6 +4111,21 @@
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+@implementation WKContentView (WKInteractionTesting)
+
+- (BOOL)forceIPadStyleZoomOnInputFocus
+{
+    return _forceIPadStyleZoomOnInputFocus;
+}
+
+- (void)setForceIPadStyleZoomOnInputFocus:(BOOL)forceIPadStyleZoom
+{
+    _forceIPadStyleZoomOnInputFocus = forceIPadStyleZoom;
+}
+
+@end
+
+
</ins><span class="cx"> // UITextRange, UITextPosition and UITextSelectionRect implementations for WK2
</span><span class="cx"> 
</span><span class="cx"> @implementation WKTextRange (UITextInputAdditions)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -2516,9 +2516,8 @@
</span><span class="cx"> {
</span><span class="cx">     layoutIfNeeded();
</span><span class="cx"> 
</span><del>-    // FIXME: This should return the selection rect, but when this is called at focus time
</del><ins>+    // FIXME: information.selectionRect should be set to the actual selection rect, but when this is called at focus time
</ins><span class="cx">     // we don't have a selection yet. Using the last interaction location is a reasonable approximation for now.
</span><del>-    // FIXME: should the selection rect always be inside the elementRect?
</del><span class="cx">     information.selectionRect = IntRect(m_lastInteractionLocation, IntSize(1, 1));
</span><span class="cx"> 
</span><span class="cx">     if (RenderObject* renderer = m_assistedNode-&gt;renderer()) {
</span><span class="lines">@@ -2538,8 +2537,12 @@
</span><span class="cx">             information.elementRect = frameView-&gt;contentsToRootView(renderer-&gt;absoluteBoundingBoxRect());
</span><span class="cx">             frameView-&gt;setCustomFixedPositionLayoutRect(currentFixedPositionRect);
</span><span class="cx">             
</span><del>-            if (!information.elementRect.contains(information.selectionRect))
</del><ins>+            if (!information.elementRect.contains(m_lastInteractionLocation))
</ins><span class="cx">                 information.selectionRect.setLocation(information.elementRect.location());
</span><ins>+        } else {
+            // Don't use the selection rect if interaction was outside the element rect.
+            if (!information.elementRect.contains(m_lastInteractionLocation))
+                information.selectionRect = IntRect();
</ins><span class="cx">         }
</span><span class="cx">     } else
</span><span class="cx">         information.elementRect = IntRect();
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Tools/ChangeLog        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2016-06-15  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        [iOS WK2] On iPad, indirect focussing of a text field doesn't always scroll to the correct location
+        https://bugs.webkit.org/show_bug.cgi?id=158828
+
+        Reviewed by Enrica Casucci.
+        
+        Expose &quot;forceIPadStyleZoomOnInputFocus&quot; on UIScriptController, which allows iPad-style
+        zooming behavior on &lt;input&gt; focus in the iPhone simulator, which is used for testing.
+
+        * WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl:
+        * WebKitTestRunner/UIScriptContext/UIScriptController.cpp:
+        (WTR::UIScriptController::forceIPadStyleZoomOnInputFocus):
+        (WTR::UIScriptController::setForceIPadStyleZoomOnInputFocus):
+        * WebKitTestRunner/UIScriptContext/UIScriptController.h:
+        * WebKitTestRunner/ios/TestControllerIOS.mm:
+        (WTR::TestController::platformResetStateToConsistentValues):
+        * WebKitTestRunner/ios/UIScriptControllerIOS.mm:
+        (WTR::UIScriptController::forceIPadStyleZoomOnInputFocus):
+        (WTR::UIScriptController::setForceIPadStyleZoomOnInputFocus):
+
</ins><span class="cx"> 2016-06-15  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Forward/Back keyboard shortcuts need to flip for RTL
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerUIScriptContextBindingsUIScriptControlleridl"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Tools/WebKitTestRunner/UIScriptContext/Bindings/UIScriptController.idl        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -60,5 +60,8 @@
</span><span class="cx"> 
</span><span class="cx">     readonly attribute object contentVisibleRect; // Returned object has 'left', 'top', 'width', 'height' properties.
</span><span class="cx"> 
</span><ins>+    // Behavior
+    attribute boolean forceIPadStyleZoomOnInputFocus;
+
</ins><span class="cx">     void uiScriptComplete(DOMString result);
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerUIScriptContextUIScriptControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.cpp (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.cpp        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.cpp        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -178,6 +178,15 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool UIScriptController::forceIPadStyleZoomOnInputFocus() const
+{
+    return false;
+}
+
+void UIScriptController::setForceIPadStyleZoomOnInputFocus(bool)
+{
+}
+
</ins><span class="cx"> void UIScriptController::platformSetWillBeginZoomingCallback()
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerUIScriptContextUIScriptControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.h (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.h        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Tools/WebKitTestRunner/UIScriptContext/UIScriptController.h        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -80,6 +80,9 @@
</span><span class="cx">     double maximumZoomScale() const;
</span><span class="cx"> 
</span><span class="cx">     JSObjectRef contentVisibleRect() const;
</span><ins>+    
+    bool forceIPadStyleZoomOnInputFocus() const;
+    void setForceIPadStyleZoomOnInputFocus(bool);
</ins><span class="cx"> 
</span><span class="cx">     void uiScriptComplete(JSStringRef result);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunneriosTestControllerIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -29,13 +29,13 @@
</span><span class="cx"> #import &quot;PlatformWebView.h&quot;
</span><span class="cx"> #import &quot;TestInvocation.h&quot;
</span><span class="cx"> #import &lt;Foundation/Foundation.h&gt;
</span><ins>+#import &lt;UIKit/UIKit.h&gt;
</ins><span class="cx"> #import &lt;WebKit/WKPreferencesRefPrivate.h&gt;
</span><span class="cx"> #import &lt;WebKit/WKProcessPoolPrivate.h&gt;
</span><span class="cx"> #import &lt;WebKit/WKStringCF.h&gt;
</span><span class="cx"> #import &lt;WebKit/WKUserContentControllerPrivate.h&gt;
</span><del>-#import &lt;WebKit/WKWebView.h&gt;
-#import &lt;WebKit/WKWebViewConfiguration.h&gt;
</del><span class="cx"> #import &lt;WebKit/WKWebViewConfigurationPrivate.h&gt;
</span><ins>+#import &lt;WebKit/WKWebViewPrivate.h&gt;
</ins><span class="cx"> #import &lt;wtf/MainThread.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WTR {
</span><span class="lines">@@ -83,6 +83,7 @@
</span><span class="cx"> void TestController::platformResetStateToConsistentValues()
</span><span class="cx"> {
</span><span class="cx">     cocoaResetStateToConsistentValues();
</span><ins>+    [mainWebView()-&gt;platformView() setForceIPadStyleZoomOnInputFocus:NO];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TestController::platformConfigureViewForTest(const TestInvocation&amp; test)
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunneriosUIScriptControllerIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm (202131 => 202132)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm        2016-06-16 18:25:54 UTC (rev 202131)
+++ trunk/Tools/WebKitTestRunner/ios/UIScriptControllerIOS.mm        2016-06-16 18:49:14 UTC (rev 202132)
</span><span class="lines">@@ -209,6 +209,18 @@
</span><span class="cx">     return m_context-&gt;objectFromRect(wkRect);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool UIScriptController::forceIPadStyleZoomOnInputFocus() const
+{
+    TestRunnerWKWebView *webView = TestController::singleton().mainWebView()-&gt;platformView();
+    return webView.forceIPadStyleZoomOnInputFocus;
+}
+
+void UIScriptController::setForceIPadStyleZoomOnInputFocus(bool value)
+{
+    TestRunnerWKWebView *webView = TestController::singleton().mainWebView()-&gt;platformView();
+    webView.forceIPadStyleZoomOnInputFocus = value;
+}
+
</ins><span class="cx"> void UIScriptController::platformSetWillBeginZoomingCallback()
</span><span class="cx"> {
</span><span class="cx">     TestRunnerWKWebView *webView = TestController::singleton().mainWebView()-&gt;platformView();
</span></span></pre>
</div>
</div>

</body>
</html>