AX: attributes to retrieve focusable and editable ancestors
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Mar 2016 22:43:21 +0000 (22:43 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Mar 2016 22:43:21 +0000 (22:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=155554

Patch by Doug Russell <d_russell@apple.com> on 2016-03-17
Reviewed by Chris Fleizach.

Add attributes to help give context to focus changes:
AXFocusableAncestor - nearest accessibility ancestor that returns true for
canSetFocusAttribute().
AXEditableAncestor - nearest accessibility ancestor that returns true for
isTextControl().
AXHighestEditableAncestor - highest element in accessibility that returns true
for isTextControl().

Source/WebCore:

Test: accessibility/mac/ancestor-attributes.html

* accessibility/AccessibilityNodeObject.cpp:
* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::focusableAncestor):
(WebCore::AccessibilityObject::editableAncestor):
(WebCore::AccessibilityObject::highestEditableAncestor):
* accessibility/AccessibilityObject.h:
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper accessibilityAttributeNames]):
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):

LayoutTests:

* accessibility/image-link-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/image-link-expected.txt.
* accessibility/image-map2-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/image-map2-expected.txt.
* accessibility/internal-link-anchors2-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/internal-link-anchors2-expected.txt.
* accessibility/lists-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/lists-expected.txt.
* accessibility/mac/ancestor-attributes-expected.txt: Added.
* accessibility/mac/ancestor-attributes.html: Added.
* accessibility/mac/aria-columnrowheaders-expected.txt:
* accessibility/mac/bounds-for-range-expected.txt:
* accessibility/mac/document-links-expected.txt:
* accessibility/mac/internal-link-anchors-expected.txt:
* accessibility/math-multiscript-attributes-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/math-multiscript-attributes-expected.txt.
* accessibility/plugin-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/plugin-expected.txt.
* accessibility/table-attributes-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-attributes-expected.txt.
* accessibility/table-cell-spans-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-cell-spans-expected.txt.
* accessibility/table-cells-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-cells-expected.txt.
* accessibility/table-detection-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-detection-expected.txt.
* accessibility/table-one-cell-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-one-cell-expected.txt.
* accessibility/table-sections-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-sections-expected.txt.
* accessibility/table-with-rules-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-with-rules-expected.txt.
* accessibility/transformed-element-expected.txt:

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

26 files changed:
LayoutTests/ChangeLog
LayoutTests/accessibility/image-link-expected.txt [moved from LayoutTests/platform/mac/accessibility/image-link-expected.txt with 87% similarity]
LayoutTests/accessibility/image-map2-expected.txt [moved from LayoutTests/platform/mac/accessibility/image-map2-expected.txt with 86% similarity]
LayoutTests/accessibility/internal-link-anchors2-expected.txt [moved from LayoutTests/platform/mac/accessibility/internal-link-anchors2-expected.txt with 86% similarity]
LayoutTests/accessibility/lists-expected.txt [moved from LayoutTests/platform/mac/accessibility/lists-expected.txt with 86% similarity]
LayoutTests/accessibility/mac/ancestor-attributes-expected.txt [new file with mode: 0644]
LayoutTests/accessibility/mac/ancestor-attributes.html [new file with mode: 0644]
LayoutTests/accessibility/mac/aria-columnrowheaders-expected.txt
LayoutTests/accessibility/mac/bounds-for-range-expected.txt
LayoutTests/accessibility/mac/document-links-expected.txt
LayoutTests/accessibility/mac/internal-link-anchors-expected.txt
LayoutTests/accessibility/math-multiscript-attributes-expected.txt [moved from LayoutTests/platform/mac/accessibility/math-multiscript-attributes-expected.txt with 85% similarity]
LayoutTests/accessibility/plugin-expected.txt [moved from LayoutTests/platform/mac/accessibility/plugin-expected.txt with 85% similarity]
LayoutTests/accessibility/table-attributes-expected.txt [moved from LayoutTests/platform/mac/accessibility/table-attributes-expected.txt with 88% similarity]
LayoutTests/accessibility/table-cell-spans-expected.txt [moved from LayoutTests/platform/mac/accessibility/table-cell-spans-expected.txt with 89% similarity]
LayoutTests/accessibility/table-cells-expected.txt [moved from LayoutTests/platform/mac/accessibility/table-cells-expected.txt with 89% similarity]
LayoutTests/accessibility/table-detection-expected.txt [moved from LayoutTests/platform/mac/accessibility/table-detection-expected.txt with 90% similarity]
LayoutTests/accessibility/table-one-cell-expected.txt [moved from LayoutTests/platform/mac/accessibility/table-one-cell-expected.txt with 86% similarity]
LayoutTests/accessibility/table-sections-expected.txt [moved from LayoutTests/platform/mac/accessibility/table-sections-expected.txt with 88% similarity]
LayoutTests/accessibility/table-with-rules-expected.txt [moved from LayoutTests/platform/mac/accessibility/table-with-rules-expected.txt with 89% similarity]
LayoutTests/accessibility/transformed-element-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityNodeObject.cpp
Source/WebCore/accessibility/AccessibilityObject.cpp
Source/WebCore/accessibility/AccessibilityObject.h
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm

index 10b8078..f4e5433 100644 (file)
@@ -1,3 +1,39 @@
+2016-03-17  Doug Russell  <d_russell@apple.com>
+
+        AX: attributes to retrieve focusable and editable ancestors
+        https://bugs.webkit.org/show_bug.cgi?id=155554
+
+        Reviewed by Chris Fleizach.
+
+        Add attributes to help give context to focus changes:
+        AXFocusableAncestor - nearest accessibility ancestor that returns true for
+        canSetFocusAttribute().
+        AXEditableAncestor - nearest accessibility ancestor that returns true for
+        isTextControl().
+        AXHighestEditableAncestor - highest element in accessibility that returns true
+        for isTextControl().
+
+        * accessibility/image-link-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/image-link-expected.txt.
+        * accessibility/image-map2-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/image-map2-expected.txt.
+        * accessibility/internal-link-anchors2-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/internal-link-anchors2-expected.txt.
+        * accessibility/lists-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/lists-expected.txt.
+        * accessibility/mac/ancestor-attributes-expected.txt: Added.
+        * accessibility/mac/ancestor-attributes.html: Added.
+        * accessibility/mac/aria-columnrowheaders-expected.txt:
+        * accessibility/mac/bounds-for-range-expected.txt:
+        * accessibility/mac/document-links-expected.txt:
+        * accessibility/mac/internal-link-anchors-expected.txt:
+        * accessibility/math-multiscript-attributes-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/math-multiscript-attributes-expected.txt.
+        * accessibility/plugin-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/plugin-expected.txt.
+        * accessibility/table-attributes-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-attributes-expected.txt.
+        * accessibility/table-cell-spans-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-cell-spans-expected.txt.
+        * accessibility/table-cells-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-cells-expected.txt.
+        * accessibility/table-detection-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-detection-expected.txt.
+        * accessibility/table-one-cell-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-one-cell-expected.txt.
+        * accessibility/table-sections-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-sections-expected.txt.
+        * accessibility/table-with-rules-expected.txt: Renamed from LayoutTests/platform/mac/accessibility/table-with-rules-expected.txt.
+        * accessibility/transformed-element-expected.txt:
+
 2016-03-17  Joseph Pecoraro  <pecoraro@apple.com>
 
         Unreviewed follow-up fix to test after r198353.
@@ -27,6 +27,9 @@ AXTopLevelUIElement: <AXLink: 'Delicious cake'>
 AXLanguage: 
 AXDOMIdentifier: test
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXLink: 'Delicious cake'>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXURL: http://www.wowhead.com/?item=33924
 AXAccessKey: (null)
 AXElementBusy: 0
@@ -57,6 +60,9 @@ AXTopLevelUIElement: <AXImage>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXImage>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXURL: LayoutTests/accessibility/resources/cake.png
 AXAccessKey: (null)
 AXElementBusy: 0
@@ -24,6 +24,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: result
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -51,6 +54,9 @@ AXTopLevelUIElement: <AXLink>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXLink>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXURL: http://www.apple.com/
 AXAccessKey: (null)
 AXElementBusy: 0
@@ -81,6 +87,9 @@ AXTopLevelUIElement: <AXLink>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXLink>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXURL: http://www.apple.com/
 AXAccessKey: (null)
 AXElementBusy: 0
@@ -24,6 +24,9 @@ AXTopLevelUIElement: <AXHeading: '[ edit ] Tourette syndrome'>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXHeading: '[ edit ] Tourette syndrome'>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -53,6 +56,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: bottom2
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -82,6 +88,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: bottom2
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -35,6 +35,9 @@ AXTopLevelUIElement: <AXList>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXList>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXSelectedChildren: (null)
 AXVisibleChildren: <array of size 2>
 AXOrientation: AXVerticalOrientation
@@ -66,6 +69,9 @@ AXTopLevelUIElement: <AXList>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXList>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXSelectedChildren: (null)
 AXVisibleChildren: <array of size 2>
 AXOrientation: AXVerticalOrientation
@@ -97,6 +103,9 @@ AXTopLevelUIElement: <AXList>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXList>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXSelectedChildren: (null)
 AXVisibleChildren: <array of size 5>
 AXOrientation: AXVerticalOrientation
@@ -128,6 +137,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -158,6 +170,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -186,6 +201,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -216,6 +234,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -244,6 +265,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -274,6 +298,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -301,6 +328,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -328,6 +358,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -355,6 +388,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -382,6 +418,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
diff --git a/LayoutTests/accessibility/mac/ancestor-attributes-expected.txt b/LayoutTests/accessibility/mac/ancestor-attributes-expected.txt
new file mode 100644 (file)
index 0000000..6fbe75f
--- /dev/null
@@ -0,0 +1,13 @@
+
+This tests attributes for looking up editable and focusable ancestors.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS input.isEqual(focusableAncestor) is true
+PASS input.isEqual(editableAncestor) is true
+PASS editable.isEqual(highestAncestor) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/accessibility/mac/ancestor-attributes.html b/LayoutTests/accessibility/mac/ancestor-attributes.html
new file mode 100644 (file)
index 0000000..31f9789
--- /dev/null
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body id="body">
+
+<div id="editable" contenteditable="true">
+       <input id="input" type="text"></input>
+</div>
+
+<p id="description"></p>
+<div id="console"></div>
+<script>
+    description("This tests attributes for looking up editable and focusable ancestors.");
+
+    var input = 0;
+    var editable = 0;
+    var focusableAncestor = 0;
+    var editableAncestor = 0;
+    var highestAncestor = 0;
+
+    if (window.accessibilityController) {
+        accessibilityController.enableEnhancedAccessibility(true);
+        editable = accessibilityController.accessibleElementById("editable");
+        input = accessibilityController.accessibleElementById("input");
+        focusableAncestor = input.uiElementAttributeValue("AXFocusableAncestor");
+        editableAncestor = input.uiElementAttributeValue("AXEditableAncestor");
+        highestAncestor = input.uiElementAttributeValue("AXHighestEditableAncestor");
+        shouldBe("input.isEqual(focusableAncestor)", "true");
+        shouldBe("input.isEqual(editableAncestor)", "true");
+        shouldBe("editable.isEqual(highestAncestor)", "true");
+    }
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
index 3c98db5..c261482 100644 (file)
@@ -30,6 +30,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: test
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -64,6 +67,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -98,6 +104,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -133,6 +142,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: obj1
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -167,6 +179,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
index c55aa81..87c68cc 100644 (file)
@@ -23,6 +23,9 @@ AXTopLevelUIElement: <AXStaticText>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXStaticText>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ----------------------
index 1634d93..16c7b48 100644 (file)
@@ -24,6 +24,9 @@ AXTopLevelUIElement: <AXLink>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXLink>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXURL: http://www.apple.com/
 AXAccessKey: (null)
 AXElementBusy: 0
@@ -54,6 +57,9 @@ AXTopLevelUIElement: <AXLink>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXLink>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXURL: http://www.apple.com/
 AXAccessKey: (null)
 AXElementBusy: 0
@@ -84,6 +90,9 @@ AXTopLevelUIElement: <AXLink: 'link 3'>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXLink: 'link 3'>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXURL: http://webkit.org/
 AXAccessKey: (null)
 AXElementBusy: 0
@@ -113,6 +122,9 @@ AXTopLevelUIElement: <AXLink: 'link 4'>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXLink: 'link 4'>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXURL: LayoutTests/accessibility/mac/document-links.html#asdf
 AXAccessKey: (null)
 AXElementBusy: 0
index 3baec4b..7c9af92 100644 (file)
@@ -24,6 +24,9 @@ AXTopLevelUIElement: <AXStaticText>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXStaticText>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -32,6 +32,9 @@ AXTopLevelUIElement:
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: 
+AXFocusableAncestor: 
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -59,6 +62,9 @@ AXTopLevelUIElement:
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: 
+AXFocusableAncestor: 
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -86,6 +92,9 @@ AXTopLevelUIElement:
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: 
+AXFocusableAncestor: 
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -113,6 +122,9 @@ AXTopLevelUIElement:
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: 
+AXFocusableAncestor: 
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -140,6 +152,9 @@ AXTopLevelUIElement:
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: 
+AXFocusableAncestor: 
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -23,6 +23,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -32,6 +32,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {0, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -66,6 +69,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {0, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -100,6 +106,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -134,6 +143,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {3, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -168,6 +180,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {3, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -206,6 +221,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {0, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -240,6 +258,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {3, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -274,6 +295,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 2}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -308,6 +332,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -346,6 +373,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 0
 AXHeader: <AXColumn>
 AXRows: <array of size 2>
@@ -377,6 +407,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 1
 AXHeader: <AXColumn>
 AXRows: <array of size 3>
@@ -408,6 +441,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 2
 AXHeader: <AXColumn>
 AXRows: <array of size 3>
@@ -439,6 +475,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 3
 AXHeader: <AXColumn>
 AXRows: <array of size 4>
@@ -470,6 +509,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 4
 AXHeader: <AXColumn>
 AXRows: <array of size 4>
@@ -505,6 +547,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 0
 AXElementBusy: 0
 
@@ -533,6 +578,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 1
 AXElementBusy: 0
 
@@ -561,6 +609,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 2
 AXElementBusy: 0
 
@@ -589,6 +640,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 3
 AXElementBusy: 0
 
@@ -621,6 +675,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {0, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -655,6 +712,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -689,6 +749,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {3, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -723,6 +786,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {3, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -757,6 +823,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {4, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -791,6 +860,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 2}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -825,6 +897,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -859,6 +934,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -893,6 +971,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {3, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -927,6 +1008,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {4, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -961,6 +1045,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -995,6 +1082,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1029,6 +1119,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {3, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1063,6 +1156,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {4, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1101,6 +1197,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -32,6 +32,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {0, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -69,6 +72,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {0, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -106,6 +112,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 2}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -143,6 +152,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 2}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -180,6 +192,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {3, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -34,6 +34,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {0, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -69,6 +72,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {3, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -104,6 +110,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 2}
 AXColumnIndexRange: NSRange: {0, 2}
 AXColumnHeaderUIElements: <array of size 0>
@@ -139,6 +148,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -174,6 +186,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {5, 1}
 AXColumnIndexRange: NSRange: {3, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -25,6 +25,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 2>
 AXVisibleRows: <array of size 2>
 AXColumns: <array of size 2>
@@ -69,6 +72,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -112,6 +118,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -144,6 +153,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -187,6 +199,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -230,6 +245,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 2>
 AXVisibleRows: <array of size 2>
 AXColumns: <array of size 2>
@@ -274,6 +292,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -317,6 +338,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -349,6 +373,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -381,6 +408,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -424,6 +454,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -456,6 +489,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: nmb
 AXDOMClassList: <array of size 1>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -494,6 +530,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -537,6 +576,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 2>
 AXVisibleRows: <array of size 2>
 AXColumns: <array of size 2>
@@ -581,6 +623,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -614,6 +659,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 3>
 AXVisibleRows: <array of size 3>
 AXColumns: <array of size 2>
@@ -659,6 +707,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 3>
 AXVisibleRows: <array of size 3>
 AXColumns: <array of size 2>
@@ -704,6 +755,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 2>
 AXVisibleRows: <array of size 2>
 AXColumns: <array of size 2>
@@ -748,6 +802,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 24>
 AXVisibleRows: <array of size 13>
 AXColumns: <array of size 1>
@@ -814,6 +871,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 2>
 AXVisibleRows: <array of size 2>
 AXColumns: <array of size 2>
@@ -25,5 +25,8 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
@@ -41,6 +41,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -75,6 +78,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -109,6 +115,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -147,6 +156,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -181,6 +193,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -215,6 +230,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -253,6 +271,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 0
 AXHeader: <AXColumn>
 AXRows: <array of size 4>
@@ -284,6 +305,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 1
 AXHeader: <AXColumn>
 AXRows: <array of size 4>
@@ -315,6 +339,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 2
 AXHeader: <AXColumn>
 AXRows: <array of size 4>
@@ -350,6 +377,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 0
 AXElementBusy: 0
 
@@ -378,6 +408,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 1
 AXElementBusy: 0
 
@@ -406,6 +439,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 2
 AXElementBusy: 0
 
@@ -434,6 +470,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 3
 AXElementBusy: 0
 
@@ -466,6 +505,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -500,6 +542,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -534,6 +579,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -568,6 +616,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -602,6 +653,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -636,6 +690,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -670,6 +727,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -704,6 +764,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -738,6 +801,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -772,6 +838,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -806,6 +875,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -840,6 +912,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -878,6 +953,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -913,6 +991,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -947,6 +1028,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -981,6 +1065,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -1019,6 +1106,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -1053,6 +1143,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1087,6 +1180,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1125,6 +1221,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 0
 AXHeader: <AXColumn>
 AXRows: <array of size 4>
@@ -1156,6 +1255,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 1
 AXHeader: <AXColumn>
 AXRows: <array of size 4>
@@ -1187,6 +1289,9 @@ AXTopLevelUIElement: <AXColumn>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXColumn>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 2
 AXHeader: <AXColumn>
 AXRows: <array of size 4>
@@ -1222,6 +1327,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 0
 AXElementBusy: 0
 
@@ -1250,6 +1358,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 1
 AXElementBusy: 0
 
@@ -1278,6 +1389,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 2
 AXElementBusy: 0
 
@@ -1306,6 +1420,9 @@ AXTopLevelUIElement: <AXRow>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXRow>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXIndex: 3
 AXElementBusy: 0
 
@@ -1338,6 +1455,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -1372,6 +1492,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -1406,6 +1529,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {0, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -1440,6 +1566,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1474,6 +1603,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1508,6 +1640,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {1, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -1542,6 +1677,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1576,6 +1714,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1610,6 +1751,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {2, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -1644,6 +1788,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {0, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1678,6 +1825,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {1, 1}
 AXColumnHeaderUIElements: <array of size 1>
@@ -1712,6 +1862,9 @@ AXTopLevelUIElement: <AXCell>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXCell>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRowIndexRange: NSRange: {3, 1}
 AXColumnIndexRange: NSRange: {2, 1}
 AXColumnHeaderUIElements: <array of size 0>
@@ -1750,6 +1903,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
 ------------
@@ -29,6 +29,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: testTable2
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -68,6 +71,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: testTable3
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -107,6 +113,9 @@ AXTopLevelUIElement: <AXTable>
 AXLanguage: 
 AXDOMIdentifier: testTable4
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXTable>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXRows: <array of size 1>
 AXVisibleRows: <array of size 1>
 AXColumns: <array of size 2>
@@ -146,6 +155,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
@@ -174,6 +186,9 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: 
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXTitleUIElement: (null)
 AXElementBusy: 0
 
index 495972a..2c152c8 100644 (file)
@@ -23,5 +23,8 @@ AXTopLevelUIElement: <AXGroup>
 AXLanguage: 
 AXDOMIdentifier: hiddenDiv
 AXDOMClassList: <array of size 0>
+AXFocusableAncestor: <AXGroup>
+AXEditableAncestor: (null)
+AXHighestEditableAncestor: (null)
 AXElementBusy: 0
 
index 449882d..dcf3882 100644 (file)
@@ -1,3 +1,30 @@
+2016-03-17  Doug Russell  <d_russell@apple.com>
+
+        AX: attributes to retrieve focusable and editable ancestors
+        https://bugs.webkit.org/show_bug.cgi?id=155554
+
+        Reviewed by Chris Fleizach.
+
+        Add attributes to help give context to focus changes:
+        AXFocusableAncestor - nearest accessibility ancestor that returns true for
+        canSetFocusAttribute().
+        AXEditableAncestor - nearest accessibility ancestor that returns true for
+        isTextControl().
+        AXHighestEditableAncestor - highest element in accessibility that returns true
+        for isTextControl().
+
+        Test: accessibility/mac/ancestor-attributes.html
+
+        * accessibility/AccessibilityNodeObject.cpp:
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::focusableAncestor):
+        (WebCore::AccessibilityObject::editableAncestor):
+        (WebCore::AccessibilityObject::highestEditableAncestor):
+        * accessibility/AccessibilityObject.h:
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeNames]):
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+
 2016-03-17  Sam Weinig  <sam@webkit.org>
 
         Implement document.queryCommandSupported("copy")
index 7dd9c3d..42fade1 100644 (file)
@@ -247,7 +247,7 @@ LayoutRect AccessibilityNodeObject::elementRect() const
 {
     return boundingBoxRect();
 }
-    
+
 LayoutRect AccessibilityNodeObject::boundingBoxRect() const
 {
     // AccessibilityNodeObjects have no mechanism yet to return a size or position.
index d4cf035..66fad2c 100644 (file)
@@ -2964,6 +2964,48 @@ void AccessibilityObject::setPreventKeyboardDOMEventDispatch(bool on)
 }
 #endif
 
+AccessibilityObject* AccessibilityObject::focusableAncestor()
+{
+    AccessibilityObject* potentialFocusableAncestor = this;
+    while (potentialFocusableAncestor) {
+        if (potentialFocusableAncestor->canSetFocusAttribute())
+            return potentialFocusableAncestor;
+        potentialFocusableAncestor = potentialFocusableAncestor->parentObject();
+    }
+
+    return nullptr;
+}
+
+AccessibilityObject* AccessibilityObject::editableAncestor()
+{
+    AccessibilityObject* potentialEditableAncestor = this;
+    while (potentialEditableAncestor) {
+        if (potentialEditableAncestor->isTextControl())
+            return potentialEditableAncestor;
+        potentialEditableAncestor = potentialEditableAncestor->parentObject();
+    }
+
+    return nullptr;
+}
+
+AccessibilityObject* AccessibilityObject::highestEditableAncestor()
+{
+    AccessibilityObject* editableAncestor = this->editableAncestor();
+    AccessibilityObject* previousEditableAncestor = nullptr;
+    while (editableAncestor) {
+        if (editableAncestor == previousEditableAncestor) {
+            if (AccessibilityObject* parent = editableAncestor->parentObject()) {
+                editableAncestor = parent->editableAncestor();
+                continue;
+            }
+            break;
+        }
+        previousEditableAncestor = editableAncestor;
+        editableAncestor = editableAncestor->editableAncestor();
+    }
+    return previousEditableAncestor;
+}
+
 bool AccessibilityObject::isStyleFormatGroup() const
 {
     Node* node = this->node();
index 814f4f5..5436f3a 100644 (file)
@@ -1037,6 +1037,10 @@ public:
     bool caretBrowsingEnabled() const;
     void setCaretBrowsingEnabled(bool);
 #endif
+
+    AccessibilityObject* focusableAncestor();
+    AccessibilityObject* editableAncestor();
+    AccessibilityObject* highestEditableAncestor();
     
 protected:
     AXID m_id;
index 93cfe31..59bfa1a 100644 (file)
@@ -536,6 +536,18 @@ using namespace HTMLNames;
 #define NSAccessibilityCaretBrowsingEnabledAttribute @"AXCaretBrowsingEnabled"
 #endif
 
+#ifndef NSAccessibilitFocusableAncestorAttribute
+#define NSAccessibilityFocusableAncestorAttribute @"AXFocusableAncestor"
+#endif
+
+#ifndef NSAccessibilityEditableAncestorAttribute
+#define NSAccessibilityEditableAncestorAttribute @"AXEditableAncestor"
+#endif
+
+#ifndef NSAccessibilityHighestEditableAncestorAttribute
+#define NSAccessibilityHighestEditableAncestorAttribute @"AXHighestEditableAncestor"
+#endif
+
 @implementation WebAccessibilityObjectWrapper
 
 - (void)unregisterUniqueIdForUIElement
@@ -1516,31 +1528,34 @@ static id textMarkerRangeFromVisiblePositions(AXObjectCache *cache, const Visibl
     NSMutableArray* tempArray;
     if (attributes == nil) {
         attributes = [[NSArray alloc] initWithObjects: NSAccessibilityRoleAttribute,
-                      NSAccessibilitySubroleAttribute,
-                      NSAccessibilityRoleDescriptionAttribute,
-                      NSAccessibilityChildrenAttribute,
-                      NSAccessibilityHelpAttribute,
-                      NSAccessibilityParentAttribute,
-                      NSAccessibilityPositionAttribute,
-                      NSAccessibilitySizeAttribute,
-                      NSAccessibilityTitleAttribute,
-                      NSAccessibilityDescriptionAttribute,
-                      NSAccessibilityValueAttribute,
-                      NSAccessibilityFocusedAttribute,
-                      NSAccessibilityEnabledAttribute,
-                      NSAccessibilityWindowAttribute,
-                      @"AXSelectedTextMarkerRange",
-                      @"AXStartTextMarker",
-                      @"AXEndTextMarker",
-                      @"AXVisited",
-                      NSAccessibilityLinkedUIElementsAttribute,
-                      NSAccessibilitySelectedAttribute,
-                      NSAccessibilityBlockQuoteLevelAttribute,
-                      NSAccessibilityTopLevelUIElementAttribute,
-                      NSAccessibilityLanguageAttribute,
-                      NSAccessibilityDOMIdentifierAttribute,
-                      NSAccessibilityDOMClassListAttribute,
-                      nil];
+            NSAccessibilitySubroleAttribute,
+            NSAccessibilityRoleDescriptionAttribute,
+            NSAccessibilityChildrenAttribute,
+            NSAccessibilityHelpAttribute,
+            NSAccessibilityParentAttribute,
+            NSAccessibilityPositionAttribute,
+            NSAccessibilitySizeAttribute,
+            NSAccessibilityTitleAttribute,
+            NSAccessibilityDescriptionAttribute,
+            NSAccessibilityValueAttribute,
+            NSAccessibilityFocusedAttribute,
+            NSAccessibilityEnabledAttribute,
+            NSAccessibilityWindowAttribute,
+            @"AXSelectedTextMarkerRange",
+            @"AXStartTextMarker",
+            @"AXEndTextMarker",
+            @"AXVisited",
+            NSAccessibilityLinkedUIElementsAttribute,
+            NSAccessibilitySelectedAttribute,
+            NSAccessibilityBlockQuoteLevelAttribute,
+            NSAccessibilityTopLevelUIElementAttribute,
+            NSAccessibilityLanguageAttribute,
+            NSAccessibilityDOMIdentifierAttribute,
+            NSAccessibilityDOMClassListAttribute,
+            NSAccessibilityFocusableAncestorAttribute,
+            NSAccessibilityEditableAncestorAttribute,
+            NSAccessibilityHighestEditableAncestorAttribute,
+            nil];
     }
     if (commonMenuAttrs == nil) {
         commonMenuAttrs = [[NSArray alloc] initWithObjects: NSAccessibilityRoleAttribute,
@@ -1563,6 +1578,10 @@ static id textMarkerRangeFromVisiblePositions(AXObjectCache *cache, const Visibl
         tempArray = [[NSMutableArray alloc] initWithArray:attributes];
         // WebAreas should not expose AXSubrole.
         [tempArray removeObject:NSAccessibilitySubroleAttribute];
+        // WebAreas should not expose ancestor attributes
+        [tempArray removeObject:NSAccessibilityFocusableAncestorAttribute];
+        [tempArray removeObject:NSAccessibilityEditableAncestorAttribute];
+        [tempArray removeObject:NSAccessibilityHighestEditableAncestorAttribute];
         [tempArray addObject:@"AXLinkUIElements"];
         [tempArray addObject:@"AXLoaded"];
         [tempArray addObject:@"AXLayoutCount"];
@@ -3319,7 +3338,22 @@ static NSString* roleValueToNSString(AccessibilityRole value)
         m_object->ariaControlsElements(ariaControls);
         return convertToNSArray(ariaControls);
     }
-    
+
+    if ([attributeName isEqualToString:NSAccessibilityFocusableAncestorAttribute]) {
+        AccessibilityObject* object = m_object->focusableAncestor();
+        return object ? object->wrapper() : nil;
+    }
+
+    if ([attributeName isEqualToString:NSAccessibilityEditableAncestorAttribute]) {
+        AccessibilityObject* object = m_object->editableAncestor();
+        return object ? object->wrapper() : nil;
+    }
+
+    if ([attributeName isEqualToString:NSAccessibilityHighestEditableAncestorAttribute]) {
+        AccessibilityObject* object = m_object->highestEditableAncestor();
+        return object ? object->wrapper() : nil;
+    }
+
     return nil;
 }