diff -r 000000000000 -r 6474c204b198 accessible/src/html/HTMLSelectAccessible.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/accessible/src/html/HTMLSelectAccessible.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,675 @@ +/* -*- Mode: C++; tab-width: 4; 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 "HTMLSelectAccessible.h" + +#include "Accessible-inl.h" +#include "nsAccessibilityService.h" +#include "nsAccUtils.h" +#include "DocAccessible.h" +#include "nsEventShell.h" +#include "nsIAccessibleEvent.h" +#include "nsTextEquivUtils.h" +#include "Role.h" +#include "States.h" + +#include "nsCOMPtr.h" +#include "mozilla/dom/HTMLOptionElement.h" +#include "nsIComboboxControlFrame.h" +#include "nsIFrame.h" +#include "nsIListControlFrame.h" + +using namespace mozilla::a11y; +using namespace mozilla::dom; + +//////////////////////////////////////////////////////////////////////////////// +// HTMLSelectListAccessible +//////////////////////////////////////////////////////////////////////////////// + +HTMLSelectListAccessible:: + HTMLSelectListAccessible(nsIContent* aContent, DocAccessible* aDoc) : + AccessibleWrap(aContent, aDoc) +{ + mGenericTypes |= eListControl | eSelect; +} + +//////////////////////////////////////////////////////////////////////////////// +// HTMLSelectListAccessible: Accessible public + +uint64_t +HTMLSelectListAccessible::NativeState() +{ + uint64_t state = AccessibleWrap::NativeState(); + if (mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::multiple)) + state |= states::MULTISELECTABLE | states::EXTSELECTABLE; + + return state; +} + +role +HTMLSelectListAccessible::NativeRole() +{ + return roles::LISTBOX; +} + +//////////////////////////////////////////////////////////////////////////////// +// HTMLSelectListAccessible: SelectAccessible + +bool +HTMLSelectListAccessible::SelectAll() +{ + return mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::multiple) ? + AccessibleWrap::SelectAll() : false; +} + +bool +HTMLSelectListAccessible::UnselectAll() +{ + return mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::multiple) ? + AccessibleWrap::UnselectAll() : false; +} + +//////////////////////////////////////////////////////////////////////////////// +// HTMLSelectListAccessible: Widgets + +bool +HTMLSelectListAccessible::IsWidget() const +{ + return true; +} + +bool +HTMLSelectListAccessible::IsActiveWidget() const +{ + return FocusMgr()->HasDOMFocus(mContent); +} + +bool +HTMLSelectListAccessible::AreItemsOperable() const +{ + return true; +} + +Accessible* +HTMLSelectListAccessible::CurrentItem() +{ + nsIListControlFrame* listControlFrame = do_QueryFrame(GetFrame()); + if (listControlFrame) { + nsCOMPtr activeOptionNode = listControlFrame->GetCurrentOption(); + if (activeOptionNode) { + DocAccessible* document = Document(); + if (document) + return document->GetAccessible(activeOptionNode); + } + } + return nullptr; +} + +void +HTMLSelectListAccessible::SetCurrentItem(Accessible* aItem) +{ + aItem->GetContent()->SetAttr(kNameSpaceID_None, + nsGkAtoms::selected, NS_LITERAL_STRING("true"), + true); +} + +//////////////////////////////////////////////////////////////////////////////// +// HTMLSelectListAccessible: Accessible protected + +void +HTMLSelectListAccessible::CacheChildren() +{ + // Cache accessibles for and s and