<!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>[206854] 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/206854">206854</a></dd>
<dt>Author</dt> <dd>n_wang@apple.com</dd>
<dt>Date</dt> <dd>2016-10-06 01:03:43 -0700 (Thu, 06 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>AX:[Mac] Unable to edit text input, textarea fields in iframe using VO naivgation
https://bugs.webkit.org/show_bug.cgi?id=162999

Reviewed by Chris Fleizach.

Source/WebCore:

In WebKit1, the top web area setting the selection to an input element inside an iframe
will make the input field not editable. The issue is that when the web area and the input element
have different documents, the setSelection function in FrameSelection will set the selection on
the input's frame and cause the caret to disappear. I fixed it by not setting the selection in such case.

Test: accessibility/mac/wk1-set-selected-text-marker-range-input-element.html

* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::setSelectedVisiblePositionRange):

LayoutTests:

* accessibility/mac/wk1-set-selected-text-marker-range-input-element-expected.txt: Added.
* accessibility/mac/wk1-set-selected-text-marker-range-input-element.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAccessibilityRenderObjectcpp">trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAccessibilityRenderObjecth">trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsaccessibilitymacwk1setselectedtextmarkerrangeinputelementexpectedtxt">trunk/LayoutTests/accessibility/mac/wk1-set-selected-text-marker-range-input-element-expected.txt</a></li>
<li><a href="#trunkLayoutTestsaccessibilitymacwk1setselectedtextmarkerrangeinputelementhtml">trunk/LayoutTests/accessibility/mac/wk1-set-selected-text-marker-range-input-element.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (206853 => 206854)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-10-06 07:44:23 UTC (rev 206853)
+++ trunk/LayoutTests/ChangeLog        2016-10-06 08:03:43 UTC (rev 206854)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-10-06  Nan Wang  &lt;n_wang@apple.com&gt;
+
+        AX:[Mac] Unable to edit text input, textarea fields in iframe using VO naivgation
+        https://bugs.webkit.org/show_bug.cgi?id=162999
+
+        Reviewed by Chris Fleizach.
+
+        * accessibility/mac/wk1-set-selected-text-marker-range-input-element-expected.txt: Added.
+        * accessibility/mac/wk1-set-selected-text-marker-range-input-element.html: Added.
+
</ins><span class="cx"> 2016-10-05  Yusuke Suzuki  &lt;utatane.tea@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [JSC] Add @throwXXXError bytecode intrinsic
</span></span></pre></div>
<a id="trunkLayoutTestsaccessibilitymacwk1setselectedtextmarkerrangeinputelementexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/accessibility/mac/wk1-set-selected-text-marker-range-input-element-expected.txt (0 => 206854)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/accessibility/mac/wk1-set-selected-text-marker-range-input-element-expected.txt                                (rev 0)
+++ trunk/LayoutTests/accessibility/mac/wk1-set-selected-text-marker-range-input-element-expected.txt        2016-10-06 08:03:43 UTC (rev 206854)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+
+This makes sure that in WK1 after setting selection of an input element on a different webarea, the input element is still editable.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+AXValue: 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsaccessibilitymacwk1setselectedtextmarkerrangeinputelementhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/accessibility/mac/wk1-set-selected-text-marker-range-input-element.html (0 => 206854)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/accessibility/mac/wk1-set-selected-text-marker-range-input-element.html                                (rev 0)
+++ trunk/LayoutTests/accessibility/mac/wk1-set-selected-text-marker-range-input-element.html        2016-10-06 08:03:43 UTC (rev 206854)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML//EN&quot;&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+var successfullyParsed = false;
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body id=&quot;body&quot;&gt;
+
+&lt;div id=&quot;content&quot;&gt;
+&lt;iframe id=&quot;iframe&quot; onload=&quot;startTest();&quot; src=&quot;data:text/html,&lt;body&gt;&lt;input type='text' name='foo' id='input' aria-label='label'&gt;&lt;/body&gt;&quot;&gt;&lt;/iframe&gt;
+&lt;/div&gt;
+
+&lt;p id=&quot;description&quot;&gt;&lt;/p&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+
+&lt;script&gt;
+
+    description(&quot;This makes sure that in WK1 after setting selection of an input element on a different webarea, the input element is still editable.&quot;);
+
+    window.jsTestIsAsync = true;
+    function startTest() {
+
+        if (window.accessibilityController) { 
+            accessibilityController.enableEnhancedAccessibility(true);
+            var input = accessibilityController.accessibleElementById(&quot;input&quot;);
+            var selectedRange = input.textMarkerRangeForElement(input);
+            var webArea = accessibilityController.rootElement.childAtIndex(0);
+            
+            var iframe = document.getElementById(&quot;iframe&quot;);
+            iframe.contentDocument.getElementById(&quot;input&quot;).focus();
+            webArea.setSelectedVisibleTextRange(selectedRange);
+            eventSender.keyDown(&quot;1&quot;);
+            debug(input.stringValue);
+            finishJSTest();
+        }
+    }
+
+    successfullyParsed = true;
+&lt;/script&gt;
+
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (206853 => 206854)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-06 07:44:23 UTC (rev 206853)
+++ trunk/Source/WebCore/ChangeLog        2016-10-06 08:03:43 UTC (rev 206854)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-10-06  Nan Wang  &lt;n_wang@apple.com&gt;
+
+        AX:[Mac] Unable to edit text input, textarea fields in iframe using VO naivgation
+        https://bugs.webkit.org/show_bug.cgi?id=162999
+
+        Reviewed by Chris Fleizach.
+
+        In WebKit1, the top web area setting the selection to an input element inside an iframe
+        will make the input field not editable. The issue is that when the web area and the input element
+        have different documents, the setSelection function in FrameSelection will set the selection on
+        the input's frame and cause the caret to disappear. I fixed it by not setting the selection in such case.
+
+        Test: accessibility/mac/wk1-set-selected-text-marker-range-input-element.html
+
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::setSelectedVisiblePositionRange):
+
</ins><span class="cx"> 2016-10-05  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r206845.
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAccessibilityRenderObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (206853 => 206854)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp        2016-10-06 07:44:23 UTC (rev 206853)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp        2016-10-06 08:03:43 UTC (rev 206854)
</span><span class="lines">@@ -2034,11 +2034,35 @@
</span><span class="cx">     
</span><span class="cx">     return boundsForRects(rect1, rect2, range);
</span><span class="cx"> }
</span><ins>+
+bool AccessibilityRenderObject::isVisiblePositionRangeInDifferentDocument(const VisiblePositionRange&amp; range) const
+{
+    if (range.start.isNull() || range.end.isNull())
+        return false;
</ins><span class="cx">     
</span><ins>+    VisibleSelection newSelection = VisibleSelection(range.start, range.end);
+    if (Document* newSelectionDocument = newSelection.base().document()) {
+        if (RefPtr&lt;Frame&gt; newSelectionFrame = newSelectionDocument-&gt;frame()) {
+            Frame* frame = this-&gt;frame();
+            if (!frame || (newSelectionFrame != frame &amp;&amp; newSelectionDocument != frame-&gt;document()))
+                return true;
+        }
+    }
+    
+    return false;
+}
+    
</ins><span class="cx"> void AccessibilityRenderObject::setSelectedVisiblePositionRange(const VisiblePositionRange&amp; range) const
</span><span class="cx"> {
</span><span class="cx">     if (range.start.isNull() || range.end.isNull())
</span><span class="cx">         return;
</span><ins>+    
+    // In WebKit1, when the top web area sets the selection to be an input element in an iframe, the caret will disappear.
+    // FrameSelection::setSelectionWithoutUpdatingAppearance is setting the selection on the new frame in this case, and causing this behavior.
+    if (isWebArea() &amp;&amp; parentObject() &amp;&amp; parentObject()-&gt;isAttachment()) {
+        if (isVisiblePositionRangeInDifferentDocument(range))
+            return;
+    }
</ins><span class="cx"> 
</span><span class="cx">     // make selection and tell the document to use it. if it's zero length, then move to that position
</span><span class="cx">     if (range.start == range.end) {
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAccessibilityRenderObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h (206853 => 206854)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h        2016-10-06 07:44:23 UTC (rev 206853)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h        2016-10-06 08:03:43 UTC (rev 206854)
</span><span class="lines">@@ -173,6 +173,7 @@
</span><span class="cx">     IntRect boundsForRange(const RefPtr&lt;Range&gt;) const override;
</span><span class="cx">     IntRect boundsForRects(LayoutRect&amp;, LayoutRect&amp;, RefPtr&lt;Range&gt;) const;
</span><span class="cx">     void setSelectedVisiblePositionRange(const VisiblePositionRange&amp;) const override;
</span><ins>+    bool isVisiblePositionRangeInDifferentDocument(const VisiblePositionRange&amp;) const;
</ins><span class="cx">     bool ariaHasPopup() const override;
</span><span class="cx"> 
</span><span class="cx">     bool supportsARIADropping() const override;
</span></span></pre>
</div>
</div>

</body>
</html>