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 +