fast/encoding/parser-tests-*.html tests sometimes crash
authordmazzoni@google.com <dmazzoni@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 10 Feb 2013 06:11:14 +0000 (06:11 +0000)
committerdmazzoni@google.com <dmazzoni@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 10 Feb 2013 06:11:14 +0000 (06:11 +0000)
https://bugs.webkit.org/show_bug.cgi?id=108058

Reviewed by Chris Fleizach.

Source/WebCore:

To avoid calling accessibilityIsIgnored while the render
tree is unstable, call accessibilityIsIgnored in the
notification timer handler, only for childrenChanged
notifications.

This exposed a problem where notifications queued on
objects can fire after the object has been deleted; fix that
by checking the object's id, which is always set to 0 when
removed from the tree.

Covered by existing tests.

* accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::childrenChanged):
(WebCore::AXObjectCache::notificationPostTimerFired):

LayoutTests:

Make test less brittle by (1) giving the iframe an aria-role so
it's never ignored, and (2) using accessibilityElementById instead
of assuming an element is in a specific place in the AX tree.

* accessibility/loading-iframe-updates-axtree.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@142385 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/accessibility/loading-iframe-updates-axtree.html
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AXObjectCache.cpp

index 2b1b26b..ae30c46 100644 (file)
@@ -1,3 +1,16 @@
+2013-02-09  Dominic Mazzoni  <dmazzoni@google.com>
+
+        fast/encoding/parser-tests-*.html tests sometimes crash
+        https://bugs.webkit.org/show_bug.cgi?id=108058
+
+        Reviewed by Chris Fleizach.
+
+        Make test less brittle by (1) giving the iframe an aria-role so
+        it's never ignored, and (2) using accessibilityElementById instead
+        of assuming an element is in a specific place in the AX tree.
+
+        * accessibility/loading-iframe-updates-axtree.html:
+
 2013-02-09  Stephen Chenney  <schenney@chromium.org>
 
         [Chromium] Reverting earlier change now
index 2ce779b..008eb87 100644 (file)
@@ -11,9 +11,7 @@
         description("This tests that if an iframe loads new content after its accessibility object has already been accessed, the iframe accessibility object's descendants are the new scroll area and web area, not the old deleted ones.");
 
         if (window.accessibilityController) {
-            window.root = accessibilityController.rootElement;
-            window.body = root.childAtIndex(0);
-            window.iframe = body.childAtIndex(1).childAtIndex(0);
+            window.iframe = accessibilityController.accessibleElementById('iframe');
             window.scrollarea = iframe.childAtIndex(0);
             window.subwebarea = scrollarea.childAtIndex(0);
         }
@@ -21,7 +19,7 @@
         window.iframeElement = document.getElementById("iframe");
         iframeElement.addEventListener("load", function() {
             if (window.accessibilityController) {
-                window.newIframe = body.childAtIndex(1).childAtIndex(0);
+                window.newIframe = accessibilityController.accessibleElementById('iframe');
                 window.newScrollarea = newIframe.childAtIndex(0);
                 window.newSubwebarea = newScrollarea.childAtIndex(0);
 
@@ -53,7 +51,7 @@
 
 <p>Before</p>
 
-<iframe id="iframe"></iframe>
+<iframe id="iframe" role="group"></iframe>
 
 <p>After</p>
 
index 4387dca..b91e8c3 100644 (file)
@@ -1,3 +1,26 @@
+2013-02-09  Dominic Mazzoni  <dmazzoni@google.com>
+
+        fast/encoding/parser-tests-*.html tests sometimes crash
+        https://bugs.webkit.org/show_bug.cgi?id=108058
+
+        Reviewed by Chris Fleizach.
+
+        To avoid calling accessibilityIsIgnored while the render
+        tree is unstable, call accessibilityIsIgnored in the
+        notification timer handler, only for childrenChanged
+        notifications.
+
+        This exposed a problem where notifications queued on
+        objects can fire after the object has been deleted; fix that
+        by checking the object's id, which is always set to 0 when
+        removed from the tree.
+
+        Covered by existing tests.
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::AXObjectCache::childrenChanged):
+        (WebCore::AXObjectCache::notificationPostTimerFired):
+
 2013-02-09  Eric Carlson  <eric.carlson@apple.com>
 
         [Mac] Do not assume MediaAccessibility framework is installed
index 77d3a04..ee95c49 100644 (file)
@@ -616,9 +616,6 @@ void AXObjectCache::childrenChanged(AccessibilityObject* obj)
         return;
 
     obj->childrenChanged();
-
-    if (obj->parentObjectIfExists() && obj->lastKnownIsIgnoredValue() != obj->accessibilityIsIgnored())
-        childrenChanged(obj->parentObject());
 }
     
 void AXObjectCache::notificationPostTimerFired(Timer<AXObjectCache>*)
@@ -630,6 +627,9 @@ void AXObjectCache::notificationPostTimerFired(Timer<AXObjectCache>*)
     unsigned i = 0, count = m_notificationsToPost.size();
     for (i = 0; i < count; ++i) {
         AccessibilityObject* obj = m_notificationsToPost[i].first.get();
+        if (!obj->axObjectID())
+            continue;
+
 #ifndef NDEBUG
         // Make sure none of the render views are in the process of being layed out.
         // Notifications should only be sent after the renderer has finished
@@ -641,7 +641,11 @@ void AXObjectCache::notificationPostTimerFired(Timer<AXObjectCache>*)
         }
 #endif
         
-        postPlatformNotification(obj, m_notificationsToPost[i].second);
+        AXNotification notification = m_notificationsToPost[i].second;
+        postPlatformNotification(obj, notification);
+
+        if (notification == AXChildrenChanged && obj->parentObjectIfExists() && obj->lastKnownIsIgnoredValue() != obj->accessibilityIsIgnored())
+            childrenChanged(obj->parentObject());
     }
     
     m_notificationsToPost.clear();