accessible/src/generic/FormControlAccessible.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 // NOTE: alphabetically ordered
     8 #include "FormControlAccessible.h"
     9 #include "Role.h"
    11 #include "mozilla/FloatingPoint.h"
    12 #include "nsIDOMHTMLFormElement.h"
    13 #include "nsIDOMXULElement.h"
    14 #include "nsIDOMXULControlElement.h"
    16 using namespace mozilla::a11y;
    18 ////////////////////////////////////////////////////////////////////////////////
    19 // ProgressMeterAccessible
    20 ////////////////////////////////////////////////////////////////////////////////
    22 template class mozilla::a11y::ProgressMeterAccessible<1>;
    23 template class mozilla::a11y::ProgressMeterAccessible<100>;
    25 ////////////////////////////////////////////////////////////////////////////////
    26 // nsISupports
    28 template<int Max>
    29 NS_IMPL_ADDREF_INHERITED(ProgressMeterAccessible<Max>, LeafAccessible)
    31 template<int Max>
    32 NS_IMPL_RELEASE_INHERITED(ProgressMeterAccessible<Max>, LeafAccessible)
    34 template<int Max>
    35 NS_IMPL_QUERY_INTERFACE_INHERITED(ProgressMeterAccessible<Max>,
    36                                   LeafAccessible,
    37                                   nsIAccessibleValue)
    39 ////////////////////////////////////////////////////////////////////////////////
    40 // Accessible
    42 template<int Max>
    43 role
    44 ProgressMeterAccessible<Max>::NativeRole()
    45 {
    46   return roles::PROGRESSBAR;
    47 }
    49 template<int Max>
    50 uint64_t
    51 ProgressMeterAccessible<Max>::NativeState()
    52 {
    53   uint64_t state = LeafAccessible::NativeState();
    55   // An undetermined progressbar (i.e. without a value) has a mixed state.
    56   nsAutoString attrValue;
    57   mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue);
    59   if (attrValue.IsEmpty())
    60     state |= states::MIXED;
    62   return state;
    63 }
    65 ////////////////////////////////////////////////////////////////////////////////
    66 // ProgressMeterAccessible<Max>: Widgets
    68 template<int Max>
    69 bool
    70 ProgressMeterAccessible<Max>::IsWidget() const
    71 {
    72   return true;
    73 }
    75 ////////////////////////////////////////////////////////////////////////////////
    76 // nsIAccessibleValue
    78 template<int Max>
    79 void
    80 ProgressMeterAccessible<Max>::Value(nsString& aValue)
    81 {
    82   LeafAccessible::Value(aValue);
    83   if (!aValue.IsEmpty())
    84     return;
    86   double maxValue = MaxValue();
    87   if (IsNaN(maxValue) || maxValue == 0)
    88     return;
    90   double curValue = CurValue();
    91   if (IsNaN(curValue))
    92     return;
    94   // Treat the current value bigger than maximum as 100%.
    95   double percentValue = (curValue < maxValue) ?
    96     (curValue / maxValue) * 100 : 100;
    98   aValue.AppendFloat(percentValue);
    99   aValue.AppendLiteral("%");
   100 }
   102 template<int Max>
   103 double
   104 ProgressMeterAccessible<Max>::MaxValue() const
   105 {
   106   double value = LeafAccessible::MaxValue();
   107   if (!IsNaN(value))
   108     return value;
   110   nsAutoString strValue;
   111   if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::max, strValue)) {
   112     nsresult result = NS_OK;
   113     value = strValue.ToDouble(&result);
   114     if (NS_SUCCEEDED(result))
   115       return value;
   116   }
   118   return Max;
   119 }
   121 template<int Max>
   122 double
   123 ProgressMeterAccessible<Max>::MinValue() const
   124 {
   125   double value = LeafAccessible::MinValue();
   126   return IsNaN(value) ? 0 : value;
   127 }
   129 template<int Max>
   130 double
   131 ProgressMeterAccessible<Max>::Step() const
   132 {
   133   double value = LeafAccessible::Step();
   134   return IsNaN(value) ? 0 : value;
   135 }
   137 template<int Max>
   138 double
   139 ProgressMeterAccessible<Max>::CurValue() const
   140 {
   141   double value = LeafAccessible::CurValue();
   142   if (!IsNaN(value))
   143     return value;
   145   nsAutoString attrValue;
   146   if (!mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue))
   147     return UnspecifiedNaN<double>();
   149   nsresult error = NS_OK;
   150   value = attrValue.ToDouble(&error);
   151   return NS_FAILED(error) ? UnspecifiedNaN<double>() : value;
   152 }
   154 template<int Max>
   155 bool
   156 ProgressMeterAccessible<Max>::SetCurValue(double aValue)
   157 {
   158   return false; // progress meters are readonly.
   159 }
   161 ////////////////////////////////////////////////////////////////////////////////
   162 // RadioButtonAccessible
   163 ////////////////////////////////////////////////////////////////////////////////
   165 RadioButtonAccessible::
   166   RadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) :
   167   LeafAccessible(aContent, aDoc)
   168 {
   169 }
   171 uint8_t
   172 RadioButtonAccessible::ActionCount()
   173 {
   174   return 1;
   175 }
   177 NS_IMETHODIMP
   178 RadioButtonAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
   179 {
   180   if (aIndex == eAction_Click) {
   181     aName.AssignLiteral("select"); 
   182     return NS_OK;
   183   }
   184   return NS_ERROR_INVALID_ARG;
   185 }
   187 NS_IMETHODIMP
   188 RadioButtonAccessible::DoAction(uint8_t aIndex)
   189 {
   190   if (aIndex != eAction_Click)
   191     return NS_ERROR_INVALID_ARG;
   193   DoCommand();
   194   return NS_OK;
   195 }
   197 role
   198 RadioButtonAccessible::NativeRole()
   199 {
   200   return roles::RADIOBUTTON;
   201 }
   203 ////////////////////////////////////////////////////////////////////////////////
   204 // RadioButtonAccessible: Widgets
   206 bool
   207 RadioButtonAccessible::IsWidget() const
   208 {
   209   return true;
   210 }

mercurial