<!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>[174741] 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/174741">174741</a></dd>
<dt>Author</dt> <dd>cfleizach@apple.com</dd>
<dt>Date</dt> <dd>2014-10-15 12:35:29 -0700 (Wed, 15 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>AX: Going back is broken for VoiceOver
https://bugs.webkit.org/show_bug.cgi?id=137382

Reviewed by Darin Adler.

Source/WebCore:

There were two issues preventing VoiceOver from navigating when using page history to go back/forward.
  1) Existing AXLoadComplete does not get fired when you just move through page history. 
       There were existing frameLoad notifications used by GTK. I think we should use those which seem more reliable.
  2) The AccessibilityScrollView cached its children, but on some history page loads, that cache was never cleared out.
       Rather than trying to find those places to clear out the cache, it's easier to just add the elements to the children
       array everytime it's asked for. Since there's only ever 3 elements (web area + 2 scroll bars) this should not be a performance hit.

Tests are not possible since they require monitoring notifications across multiple page loads.

* accessibility/AXObjectCache.h:
* accessibility/AccessibilityScrollView.cpp:
(WebCore::AccessibilityScrollView::updateChildrenIfNecessary):
* accessibility/ios/AXObjectCacheIOS.mm:
(WebCore::AXObjectCache::frameLoadingEventPlatformNotification):
* accessibility/mac/AXObjectCacheMac.mm:
(WebCore::AXObjectCache::frameLoadingEventPlatformNotification):
* dom/Document.cpp:
(WebCore::Document::implicitClose):

LayoutTests:

Update tests now that AXLoadComplete is sent more reliably.

* platform/mac/accessibility/aria-expanded-notifications-expected.txt:
* platform/mac/accessibility/aria-expanded-notifications.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmacaccessibilityariaexpandednotificationsexpectedtxt">trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmacaccessibilityariaexpandednotificationshtml">trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAXObjectCacheh">trunk/Source/WebCore/accessibility/AXObjectCache.h</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityAccessibilityScrollViewcpp">trunk/Source/WebCore/accessibility/AccessibilityScrollView.cpp</a></li>
<li><a href="#trunkSourceWebCoreaccessibilityiosAXObjectCacheIOSmm">trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm</a></li>
<li><a href="#trunkSourceWebCoreaccessibilitymacAXObjectCacheMacmm">trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/LayoutTests/ChangeLog        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2014-10-13  Chris Fleizach  &lt;cfleizach@apple.com&gt;
+
+        AX: Going back is broken for VoiceOver
+        https://bugs.webkit.org/show_bug.cgi?id=137382
+
+        Reviewed by Darin Adler.
+
+        Update tests now that AXLoadComplete is sent more reliably.
+
+        * platform/mac/accessibility/aria-expanded-notifications-expected.txt:
+        * platform/mac/accessibility/aria-expanded-notifications.html:
+
</ins><span class="cx"> 2014-10-15  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Sometimes can't scroll overflow:scroll areas in subframes
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacaccessibilityariaexpandednotificationsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications-expected.txt (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications-expected.txt        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications-expected.txt        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -9,6 +9,7 @@
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span><ins>+Notification: AXLoadComplete
</ins><span class="cx"> Notification: AXRowCountChanged
</span><span class="cx"> Notification: AXRowCollapsed
</span><span class="cx"> Notification: AXRowCountChanged
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacaccessibilityariaexpandednotificationshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications.html (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications.html        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications.html        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx">     function notifyCallback(element, notification) {  
</span><span class="cx">         notifyName = notification;
</span><span class="cx">         document.getElementById(&quot;notifications&quot;).innerHTML += &quot;Notification: &quot; + notifyName + &quot;&lt;br&gt;&quot;;
</span><del>-        if (notifyCount == 3) {
</del><ins>+        if (notifyCount == 4) {
</ins><span class="cx">             accessibilityController.removeNotificationListener();
</span><span class="cx">             window.testRunner.notifyDone();
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/Source/WebCore/ChangeLog        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2014-10-13  Chris Fleizach  &lt;cfleizach@apple.com&gt;
+
+        AX: Going back is broken for VoiceOver
+        https://bugs.webkit.org/show_bug.cgi?id=137382
+
+        Reviewed by Darin Adler.
+
+        There were two issues preventing VoiceOver from navigating when using page history to go back/forward.
+          1) Existing AXLoadComplete does not get fired when you just move through page history. 
+               There were existing frameLoad notifications used by GTK. I think we should use those which seem more reliable.
+          2) The AccessibilityScrollView cached its children, but on some history page loads, that cache was never cleared out.
+               Rather than trying to find those places to clear out the cache, it's easier to just add the elements to the children
+               array everytime it's asked for. Since there's only ever 3 elements (web area + 2 scroll bars) this should not be a performance hit.
+
+        Tests are not possible since they require monitoring notifications across multiple page loads.
+
+        * accessibility/AXObjectCache.h:
+        * accessibility/AccessibilityScrollView.cpp:
+        (WebCore::AccessibilityScrollView::updateChildrenIfNecessary):
+        * accessibility/ios/AXObjectCacheIOS.mm:
+        (WebCore::AXObjectCache::frameLoadingEventPlatformNotification):
+        * accessibility/mac/AXObjectCacheMac.mm:
+        (WebCore::AXObjectCache::frameLoadingEventPlatformNotification):
+        * dom/Document.cpp:
+        (WebCore::Document::implicitClose):
+
</ins><span class="cx"> 2014-10-15  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Sometimes can't scroll overflow:scroll areas in subframes
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAXObjectCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AXObjectCache.h (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AXObjectCache.h        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.h        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -165,6 +165,7 @@
</span><span class="cx">         AXFocusedUIElementChanged,
</span><span class="cx">         AXLayoutComplete,
</span><span class="cx">         AXLoadComplete,
</span><ins>+        AXNewDocumentLoadComplete,
</ins><span class="cx">         AXSelectedChildrenChanged,
</span><span class="cx">         AXSelectedTextChanged,
</span><span class="cx">         AXValueChanged,
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAccessibilityScrollViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AccessibilityScrollView.cpp (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AccessibilityScrollView.cpp        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/Source/WebCore/accessibility/AccessibilityScrollView.cpp        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -106,13 +106,11 @@
</span><span class="cx"> 
</span><span class="cx"> void AccessibilityScrollView::updateChildrenIfNecessary()
</span><span class="cx"> {
</span><del>-    if (m_childrenDirty)
-        clearChildren();
-
-    if (!m_haveChildren)
-        addChildren();
-    
-    updateScrollbars();
</del><ins>+    // Always update our children when asked for them so that we don't inadvertently cache them after
+    // a new web area has been created for this scroll view (like when moving back and forth through history).
+    // Since a ScrollViews children will always be relatively small and limited this should not be a performance problem.
+    clearChildren();
+    addChildren();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AccessibilityScrollView::updateScrollbars()
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityiosAXObjectCacheIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -99,8 +99,13 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AXObjectCache::frameLoadingEventPlatformNotification(AccessibilityObject*, AXLoadingEvent)
</del><ins>+void AXObjectCache::frameLoadingEventPlatformNotification(AccessibilityObject* axFrameObject, AXLoadingEvent loadingEvent)
</ins><span class="cx"> {
</span><ins>+    if (!axFrameObject)
+        return;
+    
+    if (loadingEvent == AXLoadingFinished &amp;&amp; axFrameObject-&gt;document() == axFrameObject-&gt;topDocument())
+        postPlatformNotification(axFrameObject, AXLoadComplete);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AXObjectCache::platformHandleFocusedUIElementChanged(Node*, Node* newNode)
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilitymacAXObjectCacheMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -160,8 +160,13 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AXObjectCache::frameLoadingEventPlatformNotification(AccessibilityObject*, AXLoadingEvent)
</del><ins>+void AXObjectCache::frameLoadingEventPlatformNotification(AccessibilityObject* axFrameObject, AXLoadingEvent loadingEvent)
</ins><span class="cx"> {
</span><ins>+    if (!axFrameObject)
+        return;
+    
+    if (loadingEvent == AXLoadingFinished &amp;&amp; axFrameObject-&gt;document() == axFrameObject-&gt;topDocument())
+        postPlatformNotification(axFrameObject, AXLoadComplete);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AXObjectCache::platformHandleFocusedUIElementChanged(Node*, Node*)
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (174740 => 174741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2014-10-15 19:18:23 UTC (rev 174740)
+++ trunk/Source/WebCore/dom/Document.cpp        2014-10-15 19:35:29 UTC (rev 174741)
</span><span class="lines">@@ -2495,10 +2495,14 @@
</span><span class="cx">         // The AX cache may have been cleared at this point, but we need to make sure it contains an
</span><span class="cx">         // AX object to send the notification to. getOrCreate will make sure that an valid AX object
</span><span class="cx">         // exists in the cache (we ignore the return value because we don't need it here). This is 
</span><del>-        // only safe to call when a layout is not in progress, so it can not be used in postNotification.    
</del><ins>+        // only safe to call when a layout is not in progress, so it can not be used in postNotification.
+        //
+        // This notification is now called AXNewDocumentLoadComplete because there are other handlers that will
+        // catch new AND page history loads, and that uses AXLoadComplete
+        
</ins><span class="cx">         axObjectCache()-&gt;getOrCreate(renderView());
</span><span class="cx">         if (this == &amp;topDocument())
</span><del>-            axObjectCache()-&gt;postNotification(renderView(), AXObjectCache::AXLoadComplete);
</del><ins>+            axObjectCache()-&gt;postNotification(renderView(), AXObjectCache::AXNewDocumentLoadComplete);
</ins><span class="cx">         else {
</span><span class="cx">             // AXLoadComplete can only be posted on the top document, so if it's a document
</span><span class="cx">             // in an iframe that just finished loading, post AXLayoutComplete instead.
</span></span></pre>
</div>
</div>

</body>
</html>