accessible/src/xul/XULSliderAccessible.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/accessible/src/xul/XULSliderAccessible.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,225 @@
     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 "XULSliderAccessible.h"
    1.10 +
    1.11 +#include "nsAccessibilityService.h"
    1.12 +#include "Role.h"
    1.13 +#include "States.h"
    1.14 +
    1.15 +#include "nsIFrame.h"
    1.16 +#include "mozilla/dom/Element.h"
    1.17 +#include "mozilla/FloatingPoint.h"
    1.18 +
    1.19 +using namespace mozilla::a11y;
    1.20 +
    1.21 +////////////////////////////////////////////////////////////////////////////////
    1.22 +// XULSliderAccessible
    1.23 +////////////////////////////////////////////////////////////////////////////////
    1.24 +
    1.25 +XULSliderAccessible::
    1.26 +  XULSliderAccessible(nsIContent* aContent, DocAccessible* aDoc) :
    1.27 +  AccessibleWrap(aContent, aDoc)
    1.28 +{
    1.29 +  mStateFlags |= eHasNumericValue;
    1.30 +}
    1.31 +
    1.32 +// Accessible
    1.33 +
    1.34 +role
    1.35 +XULSliderAccessible::NativeRole()
    1.36 +{
    1.37 +  return roles::SLIDER;
    1.38 +}
    1.39 +
    1.40 +uint64_t
    1.41 +XULSliderAccessible::NativeInteractiveState() const
    1.42 + {
    1.43 +  if (NativelyUnavailable())
    1.44 +    return states::UNAVAILABLE;
    1.45 +
    1.46 +  nsIContent* sliderElm = GetSliderElement();
    1.47 +  if (sliderElm) {
    1.48 +    nsIFrame* frame = sliderElm->GetPrimaryFrame();
    1.49 +    if (frame && frame->IsFocusable())
    1.50 +      return states::FOCUSABLE;
    1.51 +  }
    1.52 +
    1.53 +  return 0;
    1.54 +}
    1.55 +
    1.56 +bool
    1.57 +XULSliderAccessible::NativelyUnavailable() const
    1.58 +{
    1.59 +  return mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::disabled,
    1.60 +                               nsGkAtoms::_true, eCaseMatters);
    1.61 +}
    1.62 +
    1.63 +// nsIAccessible
    1.64 +
    1.65 +void
    1.66 +XULSliderAccessible::Value(nsString& aValue)
    1.67 +{
    1.68 +  GetSliderAttr(nsGkAtoms::curpos, aValue);
    1.69 +}
    1.70 +
    1.71 +uint8_t
    1.72 +XULSliderAccessible::ActionCount()
    1.73 +{
    1.74 +  return 1;
    1.75 +}
    1.76 +
    1.77 +NS_IMETHODIMP
    1.78 +XULSliderAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
    1.79 +{
    1.80 +  aName.Truncate();
    1.81 +
    1.82 +  NS_ENSURE_ARG(aIndex == 0);
    1.83 +
    1.84 +  aName.AssignLiteral("activate");
    1.85 +  return NS_OK;
    1.86 +}
    1.87 +
    1.88 +NS_IMETHODIMP
    1.89 +XULSliderAccessible::DoAction(uint8_t aIndex)
    1.90 +{
    1.91 +  NS_ENSURE_ARG(aIndex == 0);
    1.92 +
    1.93 +  nsIContent* sliderElm = GetSliderElement();
    1.94 +  if (sliderElm)
    1.95 +    DoCommand(sliderElm);
    1.96 +
    1.97 +  return NS_OK;
    1.98 +}
    1.99 +
   1.100 +double
   1.101 +XULSliderAccessible::MaxValue() const
   1.102 +{
   1.103 +  double value = AccessibleWrap::MaxValue();
   1.104 +  return IsNaN(value) ? GetSliderAttr(nsGkAtoms::maxpos) : value;
   1.105 +}
   1.106 +
   1.107 +double
   1.108 +XULSliderAccessible::MinValue() const
   1.109 +{
   1.110 +  double value = AccessibleWrap::MinValue();
   1.111 +  return IsNaN(value) ? GetSliderAttr(nsGkAtoms::minpos) : value;
   1.112 +}
   1.113 +
   1.114 +double
   1.115 +XULSliderAccessible::Step() const
   1.116 +{
   1.117 +  double value = AccessibleWrap::Step();
   1.118 +  return IsNaN(value) ? GetSliderAttr(nsGkAtoms::increment) : value;
   1.119 +}
   1.120 +
   1.121 +double
   1.122 +XULSliderAccessible::CurValue() const
   1.123 +{
   1.124 +  double value = AccessibleWrap::CurValue();
   1.125 +  return IsNaN(value) ? GetSliderAttr(nsGkAtoms::curpos) : value;
   1.126 +}
   1.127 +
   1.128 +bool
   1.129 +XULSliderAccessible::SetCurValue(double aValue)
   1.130 +{
   1.131 +  if (AccessibleWrap::SetCurValue(aValue))
   1.132 +    return true;
   1.133 +
   1.134 +  return SetSliderAttr(nsGkAtoms::curpos, aValue);
   1.135 +}
   1.136 +
   1.137 +bool
   1.138 +XULSliderAccessible::CanHaveAnonChildren()
   1.139 +{
   1.140 +  // Do not allow anonymous xul:slider be accessible.
   1.141 +  return false;
   1.142 +}
   1.143 +
   1.144 +// Utils
   1.145 +
   1.146 +nsIContent*
   1.147 +XULSliderAccessible::GetSliderElement() const
   1.148 +{
   1.149 +  if (!mSliderNode) {
   1.150 +    // XXX: we depend on anonymous content.
   1.151 +    mSliderNode = mContent->OwnerDoc()->
   1.152 +      GetAnonymousElementByAttribute(mContent, nsGkAtoms::anonid,
   1.153 +                                     NS_LITERAL_STRING("slider"));
   1.154 +  }
   1.155 +
   1.156 +  return mSliderNode;
   1.157 +}
   1.158 +
   1.159 +nsresult
   1.160 +XULSliderAccessible::GetSliderAttr(nsIAtom* aName, nsAString& aValue) const
   1.161 +{
   1.162 +  aValue.Truncate();
   1.163 +
   1.164 +  if (IsDefunct())
   1.165 +    return NS_ERROR_FAILURE;
   1.166 +
   1.167 +  nsIContent* sliderElm = GetSliderElement();
   1.168 +  if (sliderElm)
   1.169 +    sliderElm->GetAttr(kNameSpaceID_None, aName, aValue);
   1.170 +
   1.171 +  return NS_OK;
   1.172 +}
   1.173 +
   1.174 +nsresult
   1.175 +XULSliderAccessible::SetSliderAttr(nsIAtom* aName, const nsAString& aValue)
   1.176 +{
   1.177 +  if (IsDefunct())
   1.178 +    return NS_ERROR_FAILURE;
   1.179 +
   1.180 +  nsIContent* sliderElm = GetSliderElement();
   1.181 +  if (sliderElm)
   1.182 +    sliderElm->SetAttr(kNameSpaceID_None, aName, aValue, true);
   1.183 +
   1.184 +  return NS_OK;
   1.185 +}
   1.186 +
   1.187 +double
   1.188 +XULSliderAccessible::GetSliderAttr(nsIAtom* aName) const
   1.189 +{
   1.190 +  nsAutoString attrValue;
   1.191 +  nsresult rv = GetSliderAttr(aName, attrValue);
   1.192 +  if (NS_FAILED(rv))
   1.193 +    return UnspecifiedNaN<double>();
   1.194 +
   1.195 +  nsresult error = NS_OK;
   1.196 +  double value = attrValue.ToDouble(&error);
   1.197 +  return NS_FAILED(error) ? UnspecifiedNaN<double>() : value;
   1.198 +}
   1.199 +
   1.200 +bool
   1.201 +XULSliderAccessible::SetSliderAttr(nsIAtom* aName, double aValue)
   1.202 +{
   1.203 +  nsAutoString value;
   1.204 +  value.AppendFloat(aValue);
   1.205 +
   1.206 +  return NS_SUCCEEDED(SetSliderAttr(aName, value));
   1.207 +}
   1.208 +
   1.209 +
   1.210 +////////////////////////////////////////////////////////////////////////////////
   1.211 +// XULThumbAccessible
   1.212 +////////////////////////////////////////////////////////////////////////////////
   1.213 +
   1.214 +XULThumbAccessible::
   1.215 +  XULThumbAccessible(nsIContent* aContent, DocAccessible* aDoc) :
   1.216 +  AccessibleWrap(aContent, aDoc)
   1.217 +{
   1.218 +}
   1.219 +
   1.220 +////////////////////////////////////////////////////////////////////////////////
   1.221 +// XULThumbAccessible: Accessible
   1.222 +
   1.223 +role
   1.224 +XULThumbAccessible::NativeRole()
   1.225 +{
   1.226 +  return roles::INDICATOR;
   1.227 +}
   1.228 +

mercurial