From 3822df7d057254a9d229796edd6791cdb9647a2b Mon Sep 17 00:00:00 2001 From: David Bolter Date: Tue, 21 Sep 2010 11:05:31 -0400 Subject: [PATCH] Bug 558036 - make HTML accessible. r=MarcoZ,surkov a=davidb --- accessible/src/base/nsAccessibilityAtomList.h | 1 + .../src/base/nsAccessibilityService.cpp | 6 +++ accessible/src/base/nsAccessible.cpp | 11 +++- accessible/src/html/nsHTMLTextAccessible.cpp | 52 +++++++++++++++++++ accessible/src/html/nsHTMLTextAccessible.h | 19 +++++++ .../tests/mochitest/attributes/test_obj.html | 15 ++++++ .../mochitest/relations/test_general.html | 14 ++++- .../tests/mochitest/tree/test_formctrl.html | 16 ++++++ 8 files changed, 132 insertions(+), 2 deletions(-) diff --git a/accessible/src/base/nsAccessibilityAtomList.h b/accessible/src/base/nsAccessibilityAtomList.h index d57d007922bc..2753e2981877 100644 --- a/accessible/src/base/nsAccessibilityAtomList.h +++ b/accessible/src/base/nsAccessibilityAtomList.h @@ -138,6 +138,7 @@ ACCESSIBILITY_ATOM(object, "object") ACCESSIBILITY_ATOM(ol, "ol") ACCESSIBILITY_ATOM(optgroup, "optgroup") ACCESSIBILITY_ATOM(option, "option") +ACCESSIBILITY_ATOM(output, "output") ACCESSIBILITY_ATOM(panel, "panel") // XUL ACCESSIBILITY_ATOM(q, "q") ACCESSIBILITY_ATOM(select, "select") diff --git a/accessible/src/base/nsAccessibilityService.cpp b/accessible/src/base/nsAccessibilityService.cpp index 02e1ffa30f84..6c6e17d90ae2 100644 --- a/accessible/src/base/nsAccessibilityService.cpp +++ b/accessible/src/base/nsAccessibilityService.cpp @@ -1648,6 +1648,12 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame, return accessible; } + if (tag == nsAccessibilityAtoms::output) { + nsAccessible* accessible = new nsHTMLOutputAccessible(aContent, aWeakShell); + NS_IF_ADDREF(accessible); + return accessible; + } + return nsnull; } diff --git a/accessible/src/base/nsAccessible.cpp b/accessible/src/base/nsAccessible.cpp index 5f7dd1be76b5..e9f81feb5faa 100644 --- a/accessible/src/base/nsAccessible.cpp +++ b/accessible/src/base/nsAccessible.cpp @@ -2158,9 +2158,18 @@ nsAccessible::GetRelationByType(PRUint32 aRelationType, case nsIAccessibleRelation::RELATION_CONTROLLER_FOR: { - return nsRelUtils:: + nsresult rv = nsRelUtils:: AddTargetFromIDRefsAttr(aRelationType, aRelation, mContent, nsAccessibilityAtoms::aria_controls); + NS_ENSURE_SUCCESS(rv,rv); + + if (rv != NS_OK_NO_RELATION_TARGET) + return NS_OK; // XXX bug 381599, avoid performance problems + + return nsRelUtils:: + AddTargetFromNeighbour(aRelationType, aRelation, mContent, + nsAccessibilityAtoms::_for, + nsAccessibilityAtoms::output); } case nsIAccessibleRelation::RELATION_FLOWS_TO: diff --git a/accessible/src/html/nsHTMLTextAccessible.cpp b/accessible/src/html/nsHTMLTextAccessible.cpp index 309e0faa40ec..76c9426d0914 100644 --- a/accessible/src/html/nsHTMLTextAccessible.cpp +++ b/accessible/src/html/nsHTMLTextAccessible.cpp @@ -40,6 +40,8 @@ #include "nsHTMLTextAccessible.h" #include "nsDocAccessible.h" +#include "nsAccUtils.h" +#include "nsRelUtils.h" #include "nsTextEquivUtils.h" #include "nsIFrame.h" @@ -195,6 +197,56 @@ nsHTMLLabelAccessible::NativeRole() return nsIAccessibleRole::ROLE_LABEL; } +//////////////////////////////////////////////////////////////////////////////// +// nsHTMLOuputAccessible +//////////////////////////////////////////////////////////////////////////////// + +nsHTMLOutputAccessible:: + nsHTMLOutputAccessible(nsIContent* aContent, nsIWeakReference* aShell) : + nsHyperTextAccessibleWrap(aContent, aShell) +{ +} + +NS_IMPL_ISUPPORTS_INHERITED0(nsHTMLOutputAccessible, nsHyperTextAccessible) + +NS_IMETHODIMP +nsHTMLOutputAccessible::GetRelationByType(PRUint32 aRelationType, + nsIAccessibleRelation** aRelation) +{ + nsresult rv = nsAccessibleWrap::GetRelationByType(aRelationType, aRelation); + NS_ENSURE_SUCCESS(rv, rv); + + if (rv != NS_OK_NO_RELATION_TARGET) + return NS_OK; // XXX bug 381599, avoid performance problems + + if (aRelationType == nsIAccessibleRelation::RELATION_CONTROLLED_BY) { + return nsRelUtils:: + AddTargetFromIDRefsAttr(aRelationType, aRelation, mContent, + nsAccessibilityAtoms::_for); + } + + return NS_OK; +} + +PRUint32 +nsHTMLOutputAccessible::NativeRole() +{ + return nsIAccessibleRole::ROLE_SECTION; +} + +nsresult +nsHTMLOutputAccessible::GetAttributesInternal(nsIPersistentProperties* aAttributes) +{ + nsresult rv = nsAccessibleWrap::GetAttributesInternal(aAttributes); + NS_ENSURE_SUCCESS(rv, rv); + + nsAccUtils::SetAccAttr(aAttributes, nsAccessibilityAtoms::live, + NS_LITERAL_STRING("polite")); + + return NS_OK; +} + + //////////////////////////////////////////////////////////////////////////////// // nsHTMLLIAccessible //////////////////////////////////////////////////////////////////////////////// diff --git a/accessible/src/html/nsHTMLTextAccessible.h b/accessible/src/html/nsHTMLTextAccessible.h index 1635a95ce620..460c2bbc6293 100644 --- a/accessible/src/html/nsHTMLTextAccessible.h +++ b/accessible/src/html/nsHTMLTextAccessible.h @@ -105,6 +105,25 @@ public: virtual PRUint32 NativeRole(); }; +/** + * Used for HTML output element. + */ +class nsHTMLOutputAccessible : public nsHyperTextAccessibleWrap +{ +public: + nsHTMLOutputAccessible(nsIContent* aContent, nsIWeakReference* aShell); + + NS_DECL_ISUPPORTS_INHERITED + + // nsIAccessible + NS_IMETHOD GetRelationByType(PRUint32 aRelationType, + nsIAccessibleRelation** aRelation); + + // nsAccessible + virtual PRUint32 NativeRole(); + virtual nsresult GetAttributesInternal(nsIPersistentProperties* aAttributes); +}; + /** * Used for bullet of HTML list item element (for example, HTML li). */ diff --git a/accessible/tests/mochitest/attributes/test_obj.html b/accessible/tests/mochitest/attributes/test_obj.html index 2eaa07b127a0..2d3feb8a66ed 100644 --- a/accessible/tests/mochitest/attributes/test_obj.html +++ b/accessible/tests/mochitest/attributes/test_obj.html @@ -3,6 +3,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=475006 https://bugzilla.mozilla.org/show_bug.cgi?id=391829 https://bugzilla.mozilla.org/show_bug.cgi?id=581952 +https://bugzilla.mozilla.org/show_bug.cgi?id=558036 --> Group attributes tests @@ -39,6 +40,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=581952 testAttrs("sortOther", {"sort" : "other"}, true); // live object attribute + + // HTML + testAttrs("output", {"live" : "polite"}, true); + + // ARIA testAttrs("live", {"live" : "polite"}, true); testAttrs("live2", {"live" : "polite"}, true); testAbsentAttrs("live3", {"live" : ""}); @@ -108,6 +114,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=581952 title="Make explicit that aria-label is not an object attribute"> Mozilla Bug 475006 + + Mozilla Bug 558036 +

@@ -130,6 +141,10 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=581952
+ + + +
excuse
me
excuse
me
excuse
diff --git a/accessible/tests/mochitest/relations/test_general.html b/accessible/tests/mochitest/relations/test_general.html index 2ea2299ceac7..5a62fc7c8a46 100644 --- a/accessible/tests/mochitest/relations/test_general.html +++ b/accessible/tests/mochitest/relations/test_general.html @@ -85,6 +85,11 @@ // 'default button' relation testRelation("input", RELATION_DEFAULT_BUTTON, "submit"); + // output 'for' relations + testRelation("output", RELATION_CONTROLLED_BY, ["input", "input2"]); + testRelation("input", RELATION_CONTROLLER_FOR, "output"); + testRelation("input2", RELATION_CONTROLLER_FOR, "output"); + // 'described by'/'description for' relation for html:table and // html:caption testRelation("caption", RELATION_DESCRIPTION_FOR, "table"); @@ -125,6 +130,11 @@ title="mochitests for accessible relations"> Mozilla Bug 475298 + + Mozilla Bug 558036 +

@@ -189,9 +199,11 @@
   flow from
   flow from
 
-  
+ + +
diff --git a/accessible/tests/mochitest/tree/test_formctrl.html b/accessible/tests/mochitest/tree/test_formctrl.html index 7b46ce378c8e..e38c4e4eb55c 100644 --- a/accessible/tests/mochitest/tree/test_formctrl.html +++ b/accessible/tests/mochitest/tree/test_formctrl.html @@ -61,6 +61,16 @@ }; testAccessibleTree("image_submit", accTree); + accTree = { + role: ROLE_SECTION, + children: [ + { + role: ROLE_TEXT_LEAF + } + ] + }; + testAccessibleTree("output", accTree); + SimpleTest.finish(); } @@ -80,6 +90,11 @@ href="https://bugzilla.mozilla.org/show_bug.cgi?id=524521"> Mozilla Bug 524521 + + Mozilla Bug 558036 +

@@ -92,5 +107,6 @@
 
   
   
+  1337