accessible/src/xul/XULTabAccessible.cpp

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "XULTabAccessible.h"
     8 #include "nsAccUtils.h"
     9 #include "Relation.h"
    10 #include "Role.h"
    11 #include "States.h"
    13 // NOTE: alphabetically ordered
    14 #include "nsIAccessibleRelation.h"
    15 #include "nsIDocument.h"
    16 #include "nsIDOMXULSelectCntrlEl.h"
    17 #include "nsIDOMXULSelectCntrlItemEl.h"
    18 #include "nsIDOMXULRelatedElement.h"
    20 using namespace mozilla::a11y;
    22 ////////////////////////////////////////////////////////////////////////////////
    23 // XULTabAccessible
    24 ////////////////////////////////////////////////////////////////////////////////
    26 XULTabAccessible::
    27   XULTabAccessible(nsIContent* aContent, DocAccessible* aDoc) :
    28   AccessibleWrap(aContent, aDoc)
    29 {
    30 }
    32 ////////////////////////////////////////////////////////////////////////////////
    33 // XULTabAccessible: nsIAccessible
    35 uint8_t
    36 XULTabAccessible::ActionCount()
    37 {
    38   return 1;
    39 }
    41 /** Return the name of our only action  */
    42 NS_IMETHODIMP
    43 XULTabAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
    44 {
    45   if (aIndex == eAction_Switch) {
    46     aName.AssignLiteral("switch"); 
    47     return NS_OK;
    48   }
    49   return NS_ERROR_INVALID_ARG;
    50 }
    52 /** Tell the tab to do its action */
    53 NS_IMETHODIMP
    54 XULTabAccessible::DoAction(uint8_t index)
    55 {
    56   if (index == eAction_Switch) {
    57     nsCOMPtr<nsIDOMXULElement> tab(do_QueryInterface(mContent));
    58     if ( tab )
    59     {
    60       tab->Click();
    61       return NS_OK;
    62     }
    63     return NS_ERROR_FAILURE;
    64   }
    65   return NS_ERROR_INVALID_ARG;
    66 }
    68 ////////////////////////////////////////////////////////////////////////////////
    69 // XULTabAccessible: Accessible
    71 role
    72 XULTabAccessible::NativeRole()
    73 {
    74   return roles::PAGETAB;
    75 }
    77 uint64_t
    78 XULTabAccessible::NativeState()
    79 {
    80   // Possible states: focused, focusable, unavailable(disabled), offscreen.
    82   // get focus and disable status from base class
    83   uint64_t state = AccessibleWrap::NativeState();
    85   // Check whether the tab is selected and/or pinned
    86   nsCOMPtr<nsIDOMXULSelectControlItemElement> tab(do_QueryInterface(mContent));
    87   if (tab) {
    88     bool selected = false;
    89     if (NS_SUCCEEDED(tab->GetSelected(&selected)) && selected)
    90       state |= states::SELECTED;
    92     if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::pinned,
    93                               nsGkAtoms::_true, eCaseMatters))
    94       state |= states::PINNED;
    96   }
    98   return state;
    99 }
   101 uint64_t
   102 XULTabAccessible::NativeInteractiveState() const
   103 {
   104   uint64_t state = Accessible::NativeInteractiveState();
   105   return (state & states::UNAVAILABLE) ? state : state | states::SELECTABLE;
   106 }
   108 // nsIAccessible
   109 Relation
   110 XULTabAccessible::RelationByType(RelationType aType)
   111 {
   112   Relation rel = AccessibleWrap::RelationByType(aType);
   113   if (aType != RelationType::LABEL_FOR)
   114     return rel;
   116   // Expose 'LABEL_FOR' relation on tab accessible for tabpanel accessible.
   117   nsCOMPtr<nsIDOMXULRelatedElement> tabsElm =
   118     do_QueryInterface(mContent->GetParent());
   119   if (!tabsElm)
   120     return rel;
   122   nsCOMPtr<nsIDOMNode> domNode(DOMNode());
   123   nsCOMPtr<nsIDOMNode> tabpanelNode;
   124   tabsElm->GetRelatedElement(domNode, getter_AddRefs(tabpanelNode));
   125   if (!tabpanelNode)
   126     return rel;
   128   nsCOMPtr<nsIContent> tabpanelContent(do_QueryInterface(tabpanelNode));
   129   rel.AppendTarget(mDoc, tabpanelContent);
   130   return rel;
   131 }
   134 ////////////////////////////////////////////////////////////////////////////////
   135 // XULTabsAccessible
   136 ////////////////////////////////////////////////////////////////////////////////
   138 XULTabsAccessible::
   139   XULTabsAccessible(nsIContent* aContent, DocAccessible* aDoc) :
   140   XULSelectControlAccessible(aContent, aDoc)
   141 {
   142 }
   144 role
   145 XULTabsAccessible::NativeRole()
   146 {
   147   return roles::PAGETABLIST;
   148 }
   150 uint8_t
   151 XULTabsAccessible::ActionCount()
   152 {
   153   return 0;
   154 }
   156 void
   157 XULTabsAccessible::Value(nsString& aValue)
   158 {
   159   aValue.Truncate();
   160 }
   162 ENameValueFlag
   163 XULTabsAccessible::NativeName(nsString& aName)
   164 {
   165   // no name
   166   return eNameOK;
   167 }
   170 ////////////////////////////////////////////////////////////////////////////////
   171 // XULTabpanelsAccessible
   172 ////////////////////////////////////////////////////////////////////////////////
   174 role
   175 XULTabpanelsAccessible::NativeRole()
   176 {
   177   return roles::PANE;
   178 }
   180 ////////////////////////////////////////////////////////////////////////////////
   181 // XULTabpanelAccessible
   182 ////////////////////////////////////////////////////////////////////////////////
   184 XULTabpanelAccessible::
   185   XULTabpanelAccessible(nsIContent* aContent, DocAccessible* aDoc) :
   186   AccessibleWrap(aContent, aDoc)
   187 {
   188 }
   190 role
   191 XULTabpanelAccessible::NativeRole()
   192 {
   193   return roles::PROPERTYPAGE;
   194 }
   196 Relation
   197 XULTabpanelAccessible::RelationByType(RelationType aType)
   198 {
   199   Relation rel = AccessibleWrap::RelationByType(aType);
   200   if (aType != RelationType::LABELLED_BY)
   201     return rel;
   203   // Expose 'LABELLED_BY' relation on tabpanel accessible for tab accessible.
   204   nsCOMPtr<nsIDOMXULRelatedElement> tabpanelsElm =
   205     do_QueryInterface(mContent->GetParent());
   206   if (!tabpanelsElm)
   207     return rel;
   209   nsCOMPtr<nsIDOMNode> domNode(DOMNode());
   210   nsCOMPtr<nsIDOMNode> tabNode;
   211   tabpanelsElm->GetRelatedElement(domNode, getter_AddRefs(tabNode));
   212   if (!tabNode)
   213     return rel;
   215   nsCOMPtr<nsIContent> tabContent(do_QueryInterface(tabNode));
   216   rel.AppendTarget(mDoc, tabContent);
   217   return rel;
   218 }

mercurial