Bug 903187: Map HTML ins/del to accessible roles. r?MarcoZ
IA2 now has IA2_ROLE_CONTENT_INSERTION/DELETION.
Mac has AXInsert/DeleteStyleGroup subroles.
We now create accessibles for these elements and expose the appropriate role.
For ATK, there is no specific role for these, so we just use the generic ATK_ROLE_SECTION.
MozReview-Commit-ID: 2khzRa7BQ6z
--- a/accessible/base/MarkupMap.h
+++ b/accessible/base/MarkupMap.h
@@ -29,16 +29,20 @@ MARKUPMAP(aside,
MARKUPMAP(blockquote,
New_HyperText,
roles::BLOCKQUOTE)
MARKUPMAP(dd,
New_HTMLDtOrDd<HyperTextAccessibleWrap>,
roles::DEFINITION)
+MARKUPMAP(del,
+ New_HyperText,
+ roles::CONTENT_DELETION)
+
MARKUPMAP(details,
New_HyperText,
roles::DETAILS)
MARKUPMAP(div,
nullptr,
roles::SECTION)
@@ -94,16 +98,20 @@ MARKUPMAP(h5,
MARKUPMAP(h6,
New_HyperText,
roles::HEADING)
MARKUPMAP(input,
New_HTMLInput,
0)
+MARKUPMAP(ins,
+ New_HyperText,
+ roles::CONTENT_INSERTION)
+
MARKUPMAP(label,
New_HTMLLabel,
roles::LABEL)
MARKUPMAP(legend,
New_HTMLLegend,
roles::LABEL)
--- a/accessible/base/Role.h
+++ b/accessible/base/Role.h
@@ -1020,17 +1020,29 @@ enum Role {
*/
EDITCOMBOBOX = 174,
/**
* A section of content that is quoted from another source.
*/
BLOCKQUOTE = 175,
- LAST_ROLE = BLOCKQUOTE
+ /**
+ * Content previously deleted or proposed for deletion, e.g. in revision
+ * history or a content view providing suggestions from reviewers.
+ */
+ CONTENT_DELETION = 176,
+
+ /**
+ * Content previously inserted or proposed for insertion, e.g. in revision
+ * history or a content view providing suggestions from reviewers.
+ */
+ CONTENT_INSERTION = 177,
+
+ LAST_ROLE = CONTENT_INSERTION
};
} // namespace role
typedef enum mozilla::a11y::roles::Role role;
} // namespace a11y
} // namespace mozilla
--- a/accessible/base/RoleMap.h
+++ b/accessible/base/RoleMap.h
@@ -1421,8 +1421,24 @@ ROLE(EDITCOMBOBOX,
ROLE(BLOCKQUOTE,
"blockquote",
ATK_ROLE_BLOCK_QUOTE,
NSAccessibilityGroupRole,
ROLE_SYSTEM_GROUPING,
IA2_ROLE_BLOCK_QUOTE,
eNoNameRule)
+
+ROLE(CONTENT_DELETION,
+ "content deletion",
+ ATK_ROLE_SECTION,
+ NSAccessibilityGroupRole,
+ USE_ROLE_STRING,
+ IA2_ROLE_CONTENT_DELETION,
+ eNoNameRule)
+
+ROLE(CONTENT_INSERTION,
+ "content insertion",
+ ATK_ROLE_SECTION,
+ NSAccessibilityGroupRole,
+ USE_ROLE_STRING,
+ IA2_ROLE_CONTENT_INSERTION,
+ eNoNameRule)
--- a/accessible/interfaces/nsIAccessibleRole.idl
+++ b/accessible/interfaces/nsIAccessibleRole.idl
@@ -1014,9 +1014,22 @@ interface nsIAccessibleRole : nsISupport
* choices. It is used for ARIA's combobox role. See also ROLE_COMBOBOX.
*/
const unsigned long ROLE_EDITCOMBOBOX = 174;
/**
* A section of content that is quoted from another source.
*/
const unsigned long ROLE_BLOCKQUOTE = 175;
+
+ /**
+ * Content previously deleted or proposed for deletion, e.g. in revision
+ * history or a content view providing suggestions from reviewers.
+ */
+ const unsigned long ROLE_CONTENT_DELETION = 176;
+
+ /**
+ * Content previously inserted or proposed for insertion, e.g. in revision
+ * history or a content view providing suggestions from reviewers.
+ */
+ const unsigned long ROLE_CONTENT_INSERTION = 177;
+
};
--- a/accessible/mac/mozAccessible.mm
+++ b/accessible/mac/mozAccessible.mm
@@ -924,16 +924,22 @@ ConvertToNSArray(nsTArray<ProxyAccessibl
// from those which are AXGroups as a result of an explicit ARIA role,
// such as the non-landmark, non-listitem text containers in DPub ARIA.
case roles::FOOTNOTE:
case roles::SECTION:
if (roleAtom)
return @"AXApplicationGroup";
break;
+ case roles::CONTENT_DELETION:
+ return @"AXDeleteStyleGroup";
+
+ case roles::CONTENT_INSERTION:
+ return @"AXInsertStyleGroup";
+
default:
break;
}
return nil;
}
struct RoleDescrMap
--- a/accessible/tests/mochitest/elm/test_HTMLSpec.html
+++ b/accessible/tests/mochitest/elm/test_HTMLSpec.html
@@ -354,23 +354,19 @@
};
testElm("dl", obj);
// ////////////////////////////////////////////////////////////////////////
// HTML:del contained by paragraph
obj = {
role: ROLE_PARAGRAPH,
- textAttrs: {
- 0: { },
- 6: { "text-line-through-style": "solid" }
- },
children: [
{ role: ROLE_TEXT_LEAF }, // plain text
- { role: ROLE_TEXT_LEAF } // HTML:del text
+ { role: ROLE_CONTENT_DELETION }
]
};
testElm("del_container", obj);
// ////////////////////////////////////////////////////////////////////////
// HTML:details with open state
obj = {
@@ -875,23 +871,19 @@
};
testElm("input_date", obj);
// ////////////////////////////////////////////////////////////////////////
// HTML:ins contained by paragraph
obj = {
role: ROLE_PARAGRAPH,
- textAttrs: {
- 0: { },
- 6: { "text-underline-style": "solid" }
- },
children: [
{ role: ROLE_TEXT_LEAF }, // plain text
- { role: ROLE_TEXT_LEAF } // HTML:ins text
+ { role: ROLE_CONTENT_INSERTION }
]
};
testElm("ins_container", obj);
// ////////////////////////////////////////////////////////////////////////
// HTML:kbd contained by paragraph
obj = {
--- a/accessible/tests/mochitest/role.js
+++ b/accessible/tests/mochitest/role.js
@@ -10,20 +10,22 @@ const ROLE_AUTOCOMPLETE = nsIAccessibleR
const ROLE_BLOCKQUOTE = nsIAccessibleRole.ROLE_BLOCKQUOTE;
const ROLE_BUTTONDROPDOWNGRID = nsIAccessibleRole.ROLE_BUTTONDROPDOWNGRID;
const ROLE_CANVAS = nsIAccessibleRole.ROLE_CANVAS;
const ROLE_CAPTION = nsIAccessibleRole.ROLE_CAPTION;
const ROLE_CELL = nsIAccessibleRole.ROLE_CELL;
const ROLE_CHECKBUTTON = nsIAccessibleRole.ROLE_CHECKBUTTON;
const ROLE_CHECK_MENU_ITEM = nsIAccessibleRole.ROLE_CHECK_MENU_ITEM;
const ROLE_CHROME_WINDOW = nsIAccessibleRole.ROLE_CHROME_WINDOW;
+const ROLE_COLUMNHEADER = nsIAccessibleRole.ROLE_COLUMNHEADER;
const ROLE_COMBOBOX = nsIAccessibleRole.ROLE_COMBOBOX;
const ROLE_COMBOBOX_LIST = nsIAccessibleRole.ROLE_COMBOBOX_LIST;
const ROLE_COMBOBOX_OPTION = nsIAccessibleRole.ROLE_COMBOBOX_OPTION;
-const ROLE_COLUMNHEADER = nsIAccessibleRole.ROLE_COLUMNHEADER;
+const ROLE_CONTENT_DELETION = nsIAccessibleRole.ROLE_CONTENT_DELETION;
+const ROLE_CONTENT_INSERTION = nsIAccessibleRole.ROLE_CONTENT_INSERTION;
const ROLE_DATE_EDITOR = nsIAccessibleRole.ROLE_DATE_EDITOR;
const ROLE_DEFINITION = nsIAccessibleRole.ROLE_DEFINITION;
const ROLE_DEFINITION_LIST = nsIAccessibleRole.ROLE_DEFINITION_LIST;
const ROLE_DETAILS = nsIAccessibleRole.ROLE_DETAILS;
const ROLE_DIAGRAM = nsIAccessibleRole.ROLE_DIAGRAM;
const ROLE_DIALOG = nsIAccessibleRole.ROLE_DIALOG;
const ROLE_DOCUMENT = nsIAccessibleRole.ROLE_DOCUMENT;
const ROLE_EDITCOMBOBOX = nsIAccessibleRole.ROLE_EDITCOMBOBOX;