accessible/src/xul/XULTabAccessible.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/accessible/src/xul/XULTabAccessible.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,218 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +#include "XULTabAccessible.h"
    1.10 +
    1.11 +#include "nsAccUtils.h"
    1.12 +#include "Relation.h"
    1.13 +#include "Role.h"
    1.14 +#include "States.h"
    1.15 +
    1.16 +// NOTE: alphabetically ordered
    1.17 +#include "nsIAccessibleRelation.h"
    1.18 +#include "nsIDocument.h"
    1.19 +#include "nsIDOMXULSelectCntrlEl.h"
    1.20 +#include "nsIDOMXULSelectCntrlItemEl.h"
    1.21 +#include "nsIDOMXULRelatedElement.h"
    1.22 +
    1.23 +using namespace mozilla::a11y;
    1.24 +
    1.25 +////////////////////////////////////////////////////////////////////////////////
    1.26 +// XULTabAccessible
    1.27 +////////////////////////////////////////////////////////////////////////////////
    1.28 +
    1.29 +XULTabAccessible::
    1.30 +  XULTabAccessible(nsIContent* aContent, DocAccessible* aDoc) :
    1.31 +  AccessibleWrap(aContent, aDoc)
    1.32 +{
    1.33 +}
    1.34 +
    1.35 +////////////////////////////////////////////////////////////////////////////////
    1.36 +// XULTabAccessible: nsIAccessible
    1.37 +
    1.38 +uint8_t
    1.39 +XULTabAccessible::ActionCount()
    1.40 +{
    1.41 +  return 1;
    1.42 +}
    1.43 +
    1.44 +/** Return the name of our only action  */
    1.45 +NS_IMETHODIMP
    1.46 +XULTabAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
    1.47 +{
    1.48 +  if (aIndex == eAction_Switch) {
    1.49 +    aName.AssignLiteral("switch"); 
    1.50 +    return NS_OK;
    1.51 +  }
    1.52 +  return NS_ERROR_INVALID_ARG;
    1.53 +}
    1.54 +
    1.55 +/** Tell the tab to do its action */
    1.56 +NS_IMETHODIMP
    1.57 +XULTabAccessible::DoAction(uint8_t index)
    1.58 +{
    1.59 +  if (index == eAction_Switch) {
    1.60 +    nsCOMPtr<nsIDOMXULElement> tab(do_QueryInterface(mContent));
    1.61 +    if ( tab )
    1.62 +    {
    1.63 +      tab->Click();
    1.64 +      return NS_OK;
    1.65 +    }
    1.66 +    return NS_ERROR_FAILURE;
    1.67 +  }
    1.68 +  return NS_ERROR_INVALID_ARG;
    1.69 +}
    1.70 +
    1.71 +////////////////////////////////////////////////////////////////////////////////
    1.72 +// XULTabAccessible: Accessible
    1.73 +
    1.74 +role
    1.75 +XULTabAccessible::NativeRole()
    1.76 +{
    1.77 +  return roles::PAGETAB;
    1.78 +}
    1.79 +
    1.80 +uint64_t
    1.81 +XULTabAccessible::NativeState()
    1.82 +{
    1.83 +  // Possible states: focused, focusable, unavailable(disabled), offscreen.
    1.84 +
    1.85 +  // get focus and disable status from base class
    1.86 +  uint64_t state = AccessibleWrap::NativeState();
    1.87 +
    1.88 +  // Check whether the tab is selected and/or pinned
    1.89 +  nsCOMPtr<nsIDOMXULSelectControlItemElement> tab(do_QueryInterface(mContent));
    1.90 +  if (tab) {
    1.91 +    bool selected = false;
    1.92 +    if (NS_SUCCEEDED(tab->GetSelected(&selected)) && selected)
    1.93 +      state |= states::SELECTED;
    1.94 +
    1.95 +    if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::pinned,
    1.96 +                              nsGkAtoms::_true, eCaseMatters))
    1.97 +      state |= states::PINNED;
    1.98 +
    1.99 +  }
   1.100 +
   1.101 +  return state;
   1.102 +}
   1.103 +
   1.104 +uint64_t
   1.105 +XULTabAccessible::NativeInteractiveState() const
   1.106 +{
   1.107 +  uint64_t state = Accessible::NativeInteractiveState();
   1.108 +  return (state & states::UNAVAILABLE) ? state : state | states::SELECTABLE;
   1.109 +}
   1.110 +
   1.111 +// nsIAccessible
   1.112 +Relation
   1.113 +XULTabAccessible::RelationByType(RelationType aType)
   1.114 +{
   1.115 +  Relation rel = AccessibleWrap::RelationByType(aType);
   1.116 +  if (aType != RelationType::LABEL_FOR)
   1.117 +    return rel;
   1.118 +
   1.119 +  // Expose 'LABEL_FOR' relation on tab accessible for tabpanel accessible.
   1.120 +  nsCOMPtr<nsIDOMXULRelatedElement> tabsElm =
   1.121 +    do_QueryInterface(mContent->GetParent());
   1.122 +  if (!tabsElm)
   1.123 +    return rel;
   1.124 +
   1.125 +  nsCOMPtr<nsIDOMNode> domNode(DOMNode());
   1.126 +  nsCOMPtr<nsIDOMNode> tabpanelNode;
   1.127 +  tabsElm->GetRelatedElement(domNode, getter_AddRefs(tabpanelNode));
   1.128 +  if (!tabpanelNode)
   1.129 +    return rel;
   1.130 +
   1.131 +  nsCOMPtr<nsIContent> tabpanelContent(do_QueryInterface(tabpanelNode));
   1.132 +  rel.AppendTarget(mDoc, tabpanelContent);
   1.133 +  return rel;
   1.134 +}
   1.135 +
   1.136 +
   1.137 +////////////////////////////////////////////////////////////////////////////////
   1.138 +// XULTabsAccessible
   1.139 +////////////////////////////////////////////////////////////////////////////////
   1.140 +
   1.141 +XULTabsAccessible::
   1.142 +  XULTabsAccessible(nsIContent* aContent, DocAccessible* aDoc) :
   1.143 +  XULSelectControlAccessible(aContent, aDoc)
   1.144 +{
   1.145 +}
   1.146 +
   1.147 +role
   1.148 +XULTabsAccessible::NativeRole()
   1.149 +{
   1.150 +  return roles::PAGETABLIST;
   1.151 +}
   1.152 +
   1.153 +uint8_t
   1.154 +XULTabsAccessible::ActionCount()
   1.155 +{
   1.156 +  return 0;
   1.157 +}
   1.158 +
   1.159 +void
   1.160 +XULTabsAccessible::Value(nsString& aValue)
   1.161 +{
   1.162 +  aValue.Truncate();
   1.163 +}
   1.164 +
   1.165 +ENameValueFlag
   1.166 +XULTabsAccessible::NativeName(nsString& aName)
   1.167 +{
   1.168 +  // no name
   1.169 +  return eNameOK;
   1.170 +}
   1.171 +
   1.172 +
   1.173 +////////////////////////////////////////////////////////////////////////////////
   1.174 +// XULTabpanelsAccessible
   1.175 +////////////////////////////////////////////////////////////////////////////////
   1.176 +
   1.177 +role
   1.178 +XULTabpanelsAccessible::NativeRole()
   1.179 +{
   1.180 +  return roles::PANE;
   1.181 +}
   1.182 +
   1.183 +////////////////////////////////////////////////////////////////////////////////
   1.184 +// XULTabpanelAccessible
   1.185 +////////////////////////////////////////////////////////////////////////////////
   1.186 +
   1.187 +XULTabpanelAccessible::
   1.188 +  XULTabpanelAccessible(nsIContent* aContent, DocAccessible* aDoc) :
   1.189 +  AccessibleWrap(aContent, aDoc)
   1.190 +{
   1.191 +}
   1.192 +
   1.193 +role
   1.194 +XULTabpanelAccessible::NativeRole()
   1.195 +{
   1.196 +  return roles::PROPERTYPAGE;
   1.197 +}
   1.198 +
   1.199 +Relation
   1.200 +XULTabpanelAccessible::RelationByType(RelationType aType)
   1.201 +{
   1.202 +  Relation rel = AccessibleWrap::RelationByType(aType);
   1.203 +  if (aType != RelationType::LABELLED_BY)
   1.204 +    return rel;
   1.205 +
   1.206 +  // Expose 'LABELLED_BY' relation on tabpanel accessible for tab accessible.
   1.207 +  nsCOMPtr<nsIDOMXULRelatedElement> tabpanelsElm =
   1.208 +    do_QueryInterface(mContent->GetParent());
   1.209 +  if (!tabpanelsElm)
   1.210 +    return rel;
   1.211 +
   1.212 +  nsCOMPtr<nsIDOMNode> domNode(DOMNode());
   1.213 +  nsCOMPtr<nsIDOMNode> tabNode;
   1.214 +  tabpanelsElm->GetRelatedElement(domNode, getter_AddRefs(tabNode));
   1.215 +  if (!tabNode)
   1.216 +    return rel;
   1.217 +
   1.218 +  nsCOMPtr<nsIContent> tabContent(do_QueryInterface(tabNode));
   1.219 +  rel.AppendTarget(mDoc, tabContent);
   1.220 +  return rel;
   1.221 +}

mercurial