1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/src/generic/FormControlAccessible.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,210 @@ 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 +// NOTE: alphabetically ordered 1.10 + 1.11 +#include "FormControlAccessible.h" 1.12 +#include "Role.h" 1.13 + 1.14 +#include "mozilla/FloatingPoint.h" 1.15 +#include "nsIDOMHTMLFormElement.h" 1.16 +#include "nsIDOMXULElement.h" 1.17 +#include "nsIDOMXULControlElement.h" 1.18 + 1.19 +using namespace mozilla::a11y; 1.20 + 1.21 +//////////////////////////////////////////////////////////////////////////////// 1.22 +// ProgressMeterAccessible 1.23 +//////////////////////////////////////////////////////////////////////////////// 1.24 + 1.25 +template class mozilla::a11y::ProgressMeterAccessible<1>; 1.26 +template class mozilla::a11y::ProgressMeterAccessible<100>; 1.27 + 1.28 +//////////////////////////////////////////////////////////////////////////////// 1.29 +// nsISupports 1.30 + 1.31 +template<int Max> 1.32 +NS_IMPL_ADDREF_INHERITED(ProgressMeterAccessible<Max>, LeafAccessible) 1.33 + 1.34 +template<int Max> 1.35 +NS_IMPL_RELEASE_INHERITED(ProgressMeterAccessible<Max>, LeafAccessible) 1.36 + 1.37 +template<int Max> 1.38 +NS_IMPL_QUERY_INTERFACE_INHERITED(ProgressMeterAccessible<Max>, 1.39 + LeafAccessible, 1.40 + nsIAccessibleValue) 1.41 + 1.42 +//////////////////////////////////////////////////////////////////////////////// 1.43 +// Accessible 1.44 + 1.45 +template<int Max> 1.46 +role 1.47 +ProgressMeterAccessible<Max>::NativeRole() 1.48 +{ 1.49 + return roles::PROGRESSBAR; 1.50 +} 1.51 + 1.52 +template<int Max> 1.53 +uint64_t 1.54 +ProgressMeterAccessible<Max>::NativeState() 1.55 +{ 1.56 + uint64_t state = LeafAccessible::NativeState(); 1.57 + 1.58 + // An undetermined progressbar (i.e. without a value) has a mixed state. 1.59 + nsAutoString attrValue; 1.60 + mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue); 1.61 + 1.62 + if (attrValue.IsEmpty()) 1.63 + state |= states::MIXED; 1.64 + 1.65 + return state; 1.66 +} 1.67 + 1.68 +//////////////////////////////////////////////////////////////////////////////// 1.69 +// ProgressMeterAccessible<Max>: Widgets 1.70 + 1.71 +template<int Max> 1.72 +bool 1.73 +ProgressMeterAccessible<Max>::IsWidget() const 1.74 +{ 1.75 + return true; 1.76 +} 1.77 + 1.78 +//////////////////////////////////////////////////////////////////////////////// 1.79 +// nsIAccessibleValue 1.80 + 1.81 +template<int Max> 1.82 +void 1.83 +ProgressMeterAccessible<Max>::Value(nsString& aValue) 1.84 +{ 1.85 + LeafAccessible::Value(aValue); 1.86 + if (!aValue.IsEmpty()) 1.87 + return; 1.88 + 1.89 + double maxValue = MaxValue(); 1.90 + if (IsNaN(maxValue) || maxValue == 0) 1.91 + return; 1.92 + 1.93 + double curValue = CurValue(); 1.94 + if (IsNaN(curValue)) 1.95 + return; 1.96 + 1.97 + // Treat the current value bigger than maximum as 100%. 1.98 + double percentValue = (curValue < maxValue) ? 1.99 + (curValue / maxValue) * 100 : 100; 1.100 + 1.101 + aValue.AppendFloat(percentValue); 1.102 + aValue.AppendLiteral("%"); 1.103 +} 1.104 + 1.105 +template<int Max> 1.106 +double 1.107 +ProgressMeterAccessible<Max>::MaxValue() const 1.108 +{ 1.109 + double value = LeafAccessible::MaxValue(); 1.110 + if (!IsNaN(value)) 1.111 + return value; 1.112 + 1.113 + nsAutoString strValue; 1.114 + if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::max, strValue)) { 1.115 + nsresult result = NS_OK; 1.116 + value = strValue.ToDouble(&result); 1.117 + if (NS_SUCCEEDED(result)) 1.118 + return value; 1.119 + } 1.120 + 1.121 + return Max; 1.122 +} 1.123 + 1.124 +template<int Max> 1.125 +double 1.126 +ProgressMeterAccessible<Max>::MinValue() const 1.127 +{ 1.128 + double value = LeafAccessible::MinValue(); 1.129 + return IsNaN(value) ? 0 : value; 1.130 +} 1.131 + 1.132 +template<int Max> 1.133 +double 1.134 +ProgressMeterAccessible<Max>::Step() const 1.135 +{ 1.136 + double value = LeafAccessible::Step(); 1.137 + return IsNaN(value) ? 0 : value; 1.138 +} 1.139 + 1.140 +template<int Max> 1.141 +double 1.142 +ProgressMeterAccessible<Max>::CurValue() const 1.143 +{ 1.144 + double value = LeafAccessible::CurValue(); 1.145 + if (!IsNaN(value)) 1.146 + return value; 1.147 + 1.148 + nsAutoString attrValue; 1.149 + if (!mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue)) 1.150 + return UnspecifiedNaN<double>(); 1.151 + 1.152 + nsresult error = NS_OK; 1.153 + value = attrValue.ToDouble(&error); 1.154 + return NS_FAILED(error) ? UnspecifiedNaN<double>() : value; 1.155 +} 1.156 + 1.157 +template<int Max> 1.158 +bool 1.159 +ProgressMeterAccessible<Max>::SetCurValue(double aValue) 1.160 +{ 1.161 + return false; // progress meters are readonly. 1.162 +} 1.163 + 1.164 +//////////////////////////////////////////////////////////////////////////////// 1.165 +// RadioButtonAccessible 1.166 +//////////////////////////////////////////////////////////////////////////////// 1.167 + 1.168 +RadioButtonAccessible:: 1.169 + RadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) : 1.170 + LeafAccessible(aContent, aDoc) 1.171 +{ 1.172 +} 1.173 + 1.174 +uint8_t 1.175 +RadioButtonAccessible::ActionCount() 1.176 +{ 1.177 + return 1; 1.178 +} 1.179 + 1.180 +NS_IMETHODIMP 1.181 +RadioButtonAccessible::GetActionName(uint8_t aIndex, nsAString& aName) 1.182 +{ 1.183 + if (aIndex == eAction_Click) { 1.184 + aName.AssignLiteral("select"); 1.185 + return NS_OK; 1.186 + } 1.187 + return NS_ERROR_INVALID_ARG; 1.188 +} 1.189 + 1.190 +NS_IMETHODIMP 1.191 +RadioButtonAccessible::DoAction(uint8_t aIndex) 1.192 +{ 1.193 + if (aIndex != eAction_Click) 1.194 + return NS_ERROR_INVALID_ARG; 1.195 + 1.196 + DoCommand(); 1.197 + return NS_OK; 1.198 +} 1.199 + 1.200 +role 1.201 +RadioButtonAccessible::NativeRole() 1.202 +{ 1.203 + return roles::RADIOBUTTON; 1.204 +} 1.205 + 1.206 +//////////////////////////////////////////////////////////////////////////////// 1.207 +// RadioButtonAccessible: Widgets 1.208 + 1.209 +bool 1.210 +RadioButtonAccessible::IsWidget() const 1.211 +{ 1.212 + return true; 1.213 +}