diff -r 000000000000 -r 6474c204b198 accessible/src/generic/FormControlAccessible.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/accessible/src/generic/FormControlAccessible.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,210 @@ +/* -*- 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>; + +//////////////////////////////////////////////////////////////////////////////// +// nsISupports + +template +NS_IMPL_ADDREF_INHERITED(ProgressMeterAccessible, LeafAccessible) + +template +NS_IMPL_RELEASE_INHERITED(ProgressMeterAccessible, LeafAccessible) + +template +NS_IMPL_QUERY_INTERFACE_INHERITED(ProgressMeterAccessible, + LeafAccessible, + nsIAccessibleValue) + +//////////////////////////////////////////////////////////////////////////////// +// 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; +} + +//////////////////////////////////////////////////////////////////////////////// +// nsIAccessibleValue + +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.AppendLiteral("%"); +} + +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; +} + +NS_IMETHODIMP +RadioButtonAccessible::GetActionName(uint8_t aIndex, nsAString& aName) +{ + if (aIndex == eAction_Click) { + aName.AssignLiteral("select"); + return NS_OK; + } + return NS_ERROR_INVALID_ARG; +} + +NS_IMETHODIMP +RadioButtonAccessible::DoAction(uint8_t aIndex) +{ + if (aIndex != eAction_Click) + return NS_ERROR_INVALID_ARG; + + DoCommand(); + return NS_OK; +} + +role +RadioButtonAccessible::NativeRole() +{ + return roles::RADIOBUTTON; +} + +//////////////////////////////////////////////////////////////////////////////// +// RadioButtonAccessible: Widgets + +bool +RadioButtonAccessible::IsWidget() const +{ + return true; +}