Bug 903187: Map HTML ins/del to accessible roles. r?MarcoZ draft
authorJames Teh <jteh@mozilla.com>
Fri, 27 Jul 2018 16:40:50 +1000
changeset 823912 bdf418361083fd68f89cd255a788f466b785d224
parent 823872 0be4463d29159905dded07f1dbddc5bb7dfaa336
push id117820
push userbmo:jteh@mozilla.com
push dateSun, 29 Jul 2018 23:48:48 +0000
reviewersMarcoZ
bugs903187
milestone63.0a1
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
accessible/base/MarkupMap.h
accessible/base/Role.h
accessible/base/RoleMap.h
accessible/interfaces/nsIAccessibleRole.idl
accessible/mac/mozAccessible.mm
accessible/tests/mochitest/elm/test_HTMLSpec.html
accessible/tests/mochitest/role.js
--- 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;