<!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>[189695] releases/WebKitGTK/webkit-2.10</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/189695">189695</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-09-14 01:42:43 -0700 (Mon, 14 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/188769">r188769</a> - AX: Table with CSS that makes a row anonymous can return NULL from cellForColumnAndRow
https://bugs.webkit.org/show_bug.cgi?id=148293

Patch by Doug Russell &lt;d_russell@apple.com&gt; on 2015-08-21
Reviewed by Chris Fleizach.

When RenderTableRows are anonymous, they may not be added to the accessible data
table's internal row list. However, when calculating the row range for a cell,
we were still accounting for those anonymous sections.
Change how the row range is calculated to directly ask the accessible parent row
for its index. This will ensure it’s more inline with what’s being represented to
the accessibility API.

Source/WebCore:

Test: accessibility/aria-table-content.html

* accessibility/AccessibilityTableCell.cpp:
(WebCore::AccessibilityTableCell::parentRow):
(WebCore::AccessibilityTableCell::rowIndexRange):
* accessibility/AccessibilityTableCell.h:

LayoutTests:

* accessibility/aria-table-content-expected.txt: Added.
* accessibility/aria-table-content.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreaccessibilityAccessibilityTableCellcpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/accessibility/AccessibilityTableCell.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreaccessibilityAccessibilityTableCellh">releases/WebKitGTK/webkit-2.10/Source/WebCore/accessibility/AccessibilityTableCell.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestsaccessibilityariatablecontentexpectedtxt">releases/WebKitGTK/webkit-2.10/LayoutTests/accessibility/aria-table-content-expected.txt</a></li>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestsaccessibilityariatablecontenthtml">releases/WebKitGTK/webkit-2.10/LayoutTests/accessibility/aria-table-content.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit210LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog (189694 => 189695)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog        2015-09-14 08:37:43 UTC (rev 189694)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog        2015-09-14 08:42:43 UTC (rev 189695)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2015-08-21  Doug Russell  &lt;d_russell@apple.com&gt;
+
+        AX: Table with CSS that makes a row anonymous can return NULL from cellForColumnAndRow
+        https://bugs.webkit.org/show_bug.cgi?id=148293
+
+        Reviewed by Chris Fleizach.
+
+        When RenderTableRows are anonymous, they may not be added to the accessible data 
+        table's internal row list. However, when calculating the row range for a cell, 
+        we were still accounting for those anonymous sections.
+        Change how the row range is calculated to directly ask the accessible parent row 
+        for its index. This will ensure it’s more inline with what’s being represented to 
+        the accessibility API.
+
+        * accessibility/aria-table-content-expected.txt: Added.
+        * accessibility/aria-table-content.html: Added.
+
</ins><span class="cx"> 2015-08-20  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Overflow check elimination fails for a simple test case
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestsaccessibilityariatablecontentexpectedtxt"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.10/LayoutTests/accessibility/aria-table-content-expected.txt (0 => 189695)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/accessibility/aria-table-content-expected.txt                                (rev 0)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/accessibility/aria-table-content-expected.txt        2015-09-14 08:42:43 UTC (rev 189695)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+Header
+Item 1
+
+This tests that in an aria table with CSS that makes a row anonymous, the cells can be accessed.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS cell00.role is 'AXRole: AXCell'
+PASS cell01.role is 'AXRole: AXCell'
+PASS cell00.isEqual(table.rowAtIndex(0).childAtIndex(0)) is true
+PASS cell01.isEqual(table.rowAtIndex(1).childAtIndex(0)) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestsaccessibilityariatablecontenthtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.10/LayoutTests/accessibility/aria-table-content.html (0 => 189695)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/accessibility/aria-table-content.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/accessibility/aria-table-content.html        2015-09-14 08:42:43 UTC (rev 189695)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  div.foo table:not(.no-header):before{content:'';}
+&lt;/style&gt;
+&lt;title&gt;Table Anonymous Row&lt;/title&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;foo&quot; role=&quot;grid&quot; id=&quot;table&quot;&gt;
+  &lt;table&gt;
+        &lt;thead&gt; &lt;tr&gt; &lt;th&gt;Header&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt;
+        &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;Item 1&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
+  &lt;/table&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 tests that in an aria table with CSS that makes a row anonymous, the cells can be accessed.&quot;);
+
+if (window.accessibilityController) {
+    var table = accessibilityController.accessibleElementById(&quot;table&quot;);
+    var cell00 = table.cellForColumnAndRow(0,0);
+    shouldBe(&quot;cell00.role&quot;, &quot;'AXRole: AXCell'&quot;);
+    var cell01 = table.cellForColumnAndRow(0,1);
+    shouldBe(&quot;cell01.role&quot;, &quot;'AXRole: AXCell'&quot;);
+    shouldBeTrue(&quot;cell00.isEqual(table.rowAtIndex(0).childAtIndex(0))&quot;);
+    shouldBeTrue(&quot;cell01.isEqual(table.rowAtIndex(1).childAtIndex(0))&quot;);
+}
+
+&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="releasesWebKitGTKwebkit210SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog (189694 => 189695)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2015-09-14 08:37:43 UTC (rev 189694)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2015-09-14 08:42:43 UTC (rev 189695)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2015-08-21  Doug Russell  &lt;d_russell@apple.com&gt;
+
+        AX: Table with CSS that makes a row anonymous can return NULL from cellForColumnAndRow
+        https://bugs.webkit.org/show_bug.cgi?id=148293
+
+        Reviewed by Chris Fleizach.
+
+        When RenderTableRows are anonymous, they may not be added to the accessible data 
+        table's internal row list. However, when calculating the row range for a cell, 
+        we were still accounting for those anonymous sections.
+        Change how the row range is calculated to directly ask the accessible parent row 
+        for its index. This will ensure it’s more inline with what’s being represented to 
+        the accessibility API.
+
+        Test: accessibility/aria-table-content.html
+
+        * accessibility/AccessibilityTableCell.cpp:
+        (WebCore::AccessibilityTableCell::parentRow):
+        (WebCore::AccessibilityTableCell::rowIndexRange):
+        * accessibility/AccessibilityTableCell.h:
+
</ins><span class="cx"> 2015-08-21  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         HistoryItems will null CachedPages should never be left in the list of items; 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreaccessibilityAccessibilityTableCellcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/accessibility/AccessibilityTableCell.cpp (189694 => 189695)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/accessibility/AccessibilityTableCell.cpp        2015-09-14 08:37:43 UTC (rev 189694)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/accessibility/AccessibilityTableCell.cpp        2015-09-14 08:42:43 UTC (rev 189695)
</span><span class="lines">@@ -302,41 +302,25 @@
</span><span class="cx">             headers.append(tableCell);
</span><span class="cx">     }
</span><span class="cx"> }
</span><del>-    
</del><ins>+
+AccessibilityTableRow* AccessibilityTableCell::parentRow() const
+{
+    AccessibilityObject* parent = parentObjectUnignored();
+    if (!is&lt;AccessibilityTableRow&gt;(*parent))
+        return nullptr;
+    return downcast&lt;AccessibilityTableRow&gt;(parent);
+}
+
</ins><span class="cx"> void AccessibilityTableCell::rowIndexRange(std::pair&lt;unsigned, unsigned&gt;&amp; rowRange) const
</span><span class="cx"> {
</span><span class="cx">     if (!is&lt;RenderTableCell&gt;(m_renderer))
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     RenderTableCell&amp; renderCell = downcast&lt;RenderTableCell&gt;(*m_renderer);
</span><del>-    rowRange.first = renderCell.rowIndex();
</del><span class="cx">     rowRange.second = renderCell.rowSpan();
</span><span class="cx">     
</span><del>-    // since our table might have multiple sections, we have to offset our row appropriately
-    RenderTableSection* section = renderCell.section();
-    RenderTable* table = renderCell.table();
-    if (!table || !section)
-        return;
-
-    RenderTableSection* footerSection = table-&gt;footer();
-    unsigned rowOffset = 0;
-    for (RenderTableSection* tableSection = table-&gt;topSection(); tableSection; tableSection = table-&gt;sectionBelow(tableSection, SkipEmptySections)) {
-        // Don't add row offsets for bottom sections that are placed in before the body section.
-        if (tableSection == footerSection)
-            continue;
-        if (tableSection == section) {
-            // If the table section is anonymous, we should to use the parent row's API to get the rowIndex
-            if (tableSection-&gt;isAnonymous()) {
-                AccessibilityObject* parent = parentObjectUnignored();
-                if (is&lt;AccessibilityTableRow&gt;(*parent))
-                    rowOffset = downcast&lt;AccessibilityTableRow&gt;(*parent).rowIndex();
-            }
-            break;
-        }
-        rowOffset += tableSection-&gt;numRows();
-    }
-
-    rowRange.first += rowOffset;
</del><ins>+    if (AccessibilityTableRow* parentRow = this-&gt;parentRow())
+        rowRange.first = parentRow-&gt;rowIndex();
</ins><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> void AccessibilityTableCell::columnIndexRange(std::pair&lt;unsigned, unsigned&gt;&amp; columnRange) const
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreaccessibilityAccessibilityTableCellh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/accessibility/AccessibilityTableCell.h (189694 => 189695)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/accessibility/AccessibilityTableCell.h        2015-09-14 08:37:43 UTC (rev 189694)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/accessibility/AccessibilityTableCell.h        2015-09-14 08:42:43 UTC (rev 189695)
</span><span class="lines">@@ -34,7 +34,8 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx">     
</span><span class="cx"> class AccessibilityTable;
</span><del>-    
</del><ins>+class AccessibilityTableRow;
+
</ins><span class="cx"> class AccessibilityTableCell : public AccessibilityRenderObject {
</span><span class="cx"> public:
</span><span class="cx">     static Ref&lt;AccessibilityTableCell&gt; create(RenderObject*);
</span><span class="lines">@@ -56,6 +57,7 @@
</span><span class="cx"> protected:
</span><span class="cx">     explicit AccessibilityTableCell(RenderObject*);
</span><span class="cx"> 
</span><ins>+    AccessibilityTableRow* parentRow() const;
</ins><span class="cx">     virtual AccessibilityTable* parentTable() const;
</span><span class="cx">     virtual AccessibilityRole determineAccessibilityRole() override final;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>