From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- accessible/generic/FormControlAccessible.cpp | 193 +++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 accessible/generic/FormControlAccessible.cpp (limited to 'accessible/generic/FormControlAccessible.cpp') diff --git a/accessible/generic/FormControlAccessible.cpp b/accessible/generic/FormControlAccessible.cpp new file mode 100644 index 000000000..0f2750070 --- /dev/null +++ b/accessible/generic/FormControlAccessible.cpp @@ -0,0 +1,193 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// NOTE: alphabetically ordered + +#include "FormControlAccessible.h" +#include "Role.h" + +#include "mozilla/FloatingPoint.h" +#include "nsIDOMHTMLFormElement.h" +#include "nsIDOMXULElement.h" +#include "nsIDOMXULControlElement.h" + +using namespace mozilla::a11y; + +//////////////////////////////////////////////////////////////////////////////// +// ProgressMeterAccessible +//////////////////////////////////////////////////////////////////////////////// + +template class mozilla::a11y::ProgressMeterAccessible<1>; +template class mozilla::a11y::ProgressMeterAccessible<100>; + +//////////////////////////////////////////////////////////////////////////////// +// Accessible + +template +role +ProgressMeterAccessible::NativeRole() +{ + return roles::PROGRESSBAR; +} + +template +uint64_t +ProgressMeterAccessible::NativeState() +{ + uint64_t state = LeafAccessible::NativeState(); + + // An undetermined progressbar (i.e. without a value) has a mixed state. + nsAutoString attrValue; + mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue); + + if (attrValue.IsEmpty()) + state |= states::MIXED; + + return state; +} + +//////////////////////////////////////////////////////////////////////////////// +// ProgressMeterAccessible: Widgets + +template +bool +ProgressMeterAccessible::IsWidget() const +{ + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// ProgressMeterAccessible: Value + +template +void +ProgressMeterAccessible::Value(nsString& aValue) +{ + LeafAccessible::Value(aValue); + if (!aValue.IsEmpty()) + return; + + double maxValue = MaxValue(); + if (IsNaN(maxValue) || maxValue == 0) + return; + + double curValue = CurValue(); + if (IsNaN(curValue)) + return; + + // Treat the current value bigger than maximum as 100%. + double percentValue = (curValue < maxValue) ? + (curValue / maxValue) * 100 : 100; + + aValue.AppendFloat(percentValue); + aValue.Append('%'); +} + +template +double +ProgressMeterAccessible::MaxValue() const +{ + double value = LeafAccessible::MaxValue(); + if (!IsNaN(value)) + return value; + + nsAutoString strValue; + if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::max, strValue)) { + nsresult result = NS_OK; + value = strValue.ToDouble(&result); + if (NS_SUCCEEDED(result)) + return value; + } + + return Max; +} + +template +double +ProgressMeterAccessible::MinValue() const +{ + double value = LeafAccessible::MinValue(); + return IsNaN(value) ? 0 : value; +} + +template +double +ProgressMeterAccessible::Step() const +{ + double value = LeafAccessible::Step(); + return IsNaN(value) ? 0 : value; +} + +template +double +ProgressMeterAccessible::CurValue() const +{ + double value = LeafAccessible::CurValue(); + if (!IsNaN(value)) + return value; + + nsAutoString attrValue; + if (!mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue)) + return UnspecifiedNaN(); + + nsresult error = NS_OK; + value = attrValue.ToDouble(&error); + return NS_FAILED(error) ? UnspecifiedNaN() : value; +} + +template +bool +ProgressMeterAccessible::SetCurValue(double aValue) +{ + return false; // progress meters are readonly. +} + +//////////////////////////////////////////////////////////////////////////////// +// RadioButtonAccessible +//////////////////////////////////////////////////////////////////////////////// + +RadioButtonAccessible:: + RadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) : + LeafAccessible(aContent, aDoc) +{ +} + +uint8_t +RadioButtonAccessible::ActionCount() +{ + return 1; +} + +void +RadioButtonAccessible::ActionNameAt(uint8_t aIndex, nsAString& aName) +{ + if (aIndex == eAction_Click) + aName.AssignLiteral("select"); +} + +bool +RadioButtonAccessible::DoAction(uint8_t aIndex) +{ + if (aIndex != eAction_Click) + return false; + + DoCommand(); + return true; +} + +role +RadioButtonAccessible::NativeRole() +{ + return roles::RADIOBUTTON; +} + +//////////////////////////////////////////////////////////////////////////////// +// RadioButtonAccessible: Widgets + +bool +RadioButtonAccessible::IsWidget() const +{ + return true; +} -- cgit v1.2.3