зеркало из https://github.com/mozilla/gecko-dev.git
140 строки
3.1 KiB
C++
140 строки
3.1 KiB
C++
/* -*- 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 "mozilla/dom/HTMLInputElement.h"
|
|
#include "mozilla/FloatingPoint.h"
|
|
#include "Role.h"
|
|
|
|
using namespace mozilla::a11y;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// CheckboxAccessible
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
role
|
|
CheckboxAccessible::NativeRole() const
|
|
{
|
|
return roles::CHECKBUTTON;
|
|
}
|
|
|
|
uint8_t
|
|
CheckboxAccessible::ActionCount() const
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
void
|
|
CheckboxAccessible::ActionNameAt(uint8_t aIndex, nsAString& aName)
|
|
{
|
|
if (aIndex == eAction_Click) {
|
|
uint64_t state = NativeState();
|
|
if (state & states::CHECKED) {
|
|
aName.AssignLiteral("uncheck");
|
|
} else if (state & states::MIXED) {
|
|
aName.AssignLiteral("cycle");
|
|
} else {
|
|
aName.AssignLiteral("check");
|
|
}
|
|
}
|
|
}
|
|
|
|
bool
|
|
CheckboxAccessible::DoAction(uint8_t aIndex) const
|
|
{
|
|
if (aIndex != eAction_Click) {
|
|
return false;
|
|
}
|
|
DoCommand();
|
|
return true;
|
|
}
|
|
|
|
uint64_t
|
|
CheckboxAccessible::NativeState() const
|
|
{
|
|
uint64_t state = LeafAccessible::NativeState();
|
|
|
|
state |= states::CHECKABLE;
|
|
dom::HTMLInputElement* input = dom::HTMLInputElement::FromNode(mContent);
|
|
if (input) { // HTML:input@type="checkbox"
|
|
if (input->Indeterminate()) {
|
|
return state | states::MIXED;
|
|
}
|
|
|
|
if (input->Checked()) {
|
|
return state | states::CHECKED;
|
|
}
|
|
|
|
} else if (mContent->AsElement()->AttrValueIs(kNameSpaceID_None,
|
|
nsGkAtoms::checked,
|
|
nsGkAtoms::_true,
|
|
eCaseMatters)) { // XUL checkbox
|
|
return state | states::CHECKED;
|
|
}
|
|
|
|
return state;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// CheckboxAccessible: Widgets
|
|
|
|
bool
|
|
CheckboxAccessible::IsWidget() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// RadioButtonAccessible
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
RadioButtonAccessible::
|
|
RadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
|
LeafAccessible(aContent, aDoc)
|
|
{
|
|
}
|
|
|
|
uint8_t
|
|
RadioButtonAccessible::ActionCount() const
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
void
|
|
RadioButtonAccessible::ActionNameAt(uint8_t aIndex, nsAString& aName)
|
|
{
|
|
if (aIndex == eAction_Click)
|
|
aName.AssignLiteral("select");
|
|
}
|
|
|
|
bool
|
|
RadioButtonAccessible::DoAction(uint8_t aIndex) const
|
|
{
|
|
if (aIndex != eAction_Click)
|
|
return false;
|
|
|
|
DoCommand();
|
|
return true;
|
|
}
|
|
|
|
role
|
|
RadioButtonAccessible::NativeRole() const
|
|
{
|
|
return roles::RADIOBUTTON;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// RadioButtonAccessible: Widgets
|
|
|
|
bool
|
|
RadioButtonAccessible::IsWidget() const
|
|
{
|
|
return true;
|
|
}
|