Mypal/accessible/xul/XULColorPickerAccessible.cpp

144 lines
3.7 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/. */
#include "XULColorPickerAccessible.h"
#include "Accessible-inl.h"
#include "nsAccUtils.h"
#include "nsCoreUtils.h"
#include "DocAccessible.h"
#include "Role.h"
#include "States.h"
#include "nsIDOMElement.h"
#include "nsMenuPopupFrame.h"
using namespace mozilla::a11y;
////////////////////////////////////////////////////////////////////////////////
// XULColorPickerTileAccessible
////////////////////////////////////////////////////////////////////////////////
XULColorPickerTileAccessible::
XULColorPickerTileAccessible(nsIContent* aContent, DocAccessible* aDoc) :
AccessibleWrap(aContent, aDoc)
{
}
////////////////////////////////////////////////////////////////////////////////
// XULColorPickerTileAccessible: Accessible
void
XULColorPickerTileAccessible::Value(nsString& aValue)
{
aValue.Truncate();
mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::color, aValue);
}
role
XULColorPickerTileAccessible::NativeRole()
{
return roles::PUSHBUTTON;
}
uint64_t
XULColorPickerTileAccessible::NativeState()
{
uint64_t state = AccessibleWrap::NativeState();
if (mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::selected))
state |= states::SELECTED;
return state;
}
uint64_t
XULColorPickerTileAccessible::NativeInteractiveState() const
{
return NativelyUnavailable() ?
states::UNAVAILABLE : states::FOCUSABLE | states::SELECTABLE;
}
////////////////////////////////////////////////////////////////////////////////
// XULColorPickerTileAccessible: Widgets
Accessible*
XULColorPickerTileAccessible::ContainerWidget() const
{
Accessible* parent = Parent();
if (parent) {
Accessible* grandParent = parent->Parent();
if (grandParent && grandParent->IsMenuButton())
return grandParent;
}
return nullptr;
}
////////////////////////////////////////////////////////////////////////////////
// XULColorPickerAccessible
////////////////////////////////////////////////////////////////////////////////
XULColorPickerAccessible::
XULColorPickerAccessible(nsIContent* aContent, DocAccessible* aDoc) :
XULColorPickerTileAccessible(aContent, aDoc)
{
mGenericTypes |= eMenuButton;
}
////////////////////////////////////////////////////////////////////////////////
// XULColorPickerAccessible: Accessible
uint64_t
XULColorPickerAccessible::NativeState()
{
uint64_t state = AccessibleWrap::NativeState();
return state | states::HASPOPUP;
}
role
XULColorPickerAccessible::NativeRole()
{
return roles::BUTTONDROPDOWNGRID;
}
////////////////////////////////////////////////////////////////////////////////
// XULColorPickerAccessible: Widgets
bool
XULColorPickerAccessible::IsWidget() const
{
return true;
}
bool
XULColorPickerAccessible::IsActiveWidget() const
{
return FocusMgr()->HasDOMFocus(mContent);
}
bool
XULColorPickerAccessible::AreItemsOperable() const
{
Accessible* menuPopup = mChildren.SafeElementAt(0, nullptr);
if (menuPopup) {
nsMenuPopupFrame* menuPopupFrame = do_QueryFrame(menuPopup->GetFrame());
return menuPopupFrame && menuPopupFrame->IsOpen();
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
// XULColorPickerAccessible: Accessible
bool
XULColorPickerAccessible::IsAcceptableChild(nsIContent* aEl) const
{
nsAutoString role;
nsCoreUtils::XBLBindingRole(aEl, role);
return role.EqualsLiteral("xul:panel") &&
aEl->AttrValueIs(kNameSpaceID_None, nsGkAtoms::noautofocus,
nsGkAtoms::_true, eCaseMatters);
}