michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "HTMLSelectAccessible.h" michael@0: michael@0: #include "Accessible-inl.h" michael@0: #include "nsAccessibilityService.h" michael@0: #include "nsAccUtils.h" michael@0: #include "DocAccessible.h" michael@0: #include "nsEventShell.h" michael@0: #include "nsIAccessibleEvent.h" michael@0: #include "nsTextEquivUtils.h" michael@0: #include "Role.h" michael@0: #include "States.h" michael@0: michael@0: #include "nsCOMPtr.h" michael@0: #include "mozilla/dom/HTMLOptionElement.h" michael@0: #include "nsIComboboxControlFrame.h" michael@0: #include "nsIFrame.h" michael@0: #include "nsIListControlFrame.h" michael@0: michael@0: using namespace mozilla::a11y; michael@0: using namespace mozilla::dom; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // HTMLSelectListAccessible michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: HTMLSelectListAccessible:: michael@0: HTMLSelectListAccessible(nsIContent* aContent, DocAccessible* aDoc) : michael@0: AccessibleWrap(aContent, aDoc) michael@0: { michael@0: mGenericTypes |= eListControl | eSelect; michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // HTMLSelectListAccessible: Accessible public michael@0: michael@0: uint64_t michael@0: HTMLSelectListAccessible::NativeState() michael@0: { michael@0: uint64_t state = AccessibleWrap::NativeState(); michael@0: if (mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::multiple)) michael@0: state |= states::MULTISELECTABLE | states::EXTSELECTABLE; michael@0: michael@0: return state; michael@0: } michael@0: michael@0: role michael@0: HTMLSelectListAccessible::NativeRole() michael@0: { michael@0: return roles::LISTBOX; michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // HTMLSelectListAccessible: SelectAccessible michael@0: michael@0: bool michael@0: HTMLSelectListAccessible::SelectAll() michael@0: { michael@0: return mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::multiple) ? michael@0: AccessibleWrap::SelectAll() : false; michael@0: } michael@0: michael@0: bool michael@0: HTMLSelectListAccessible::UnselectAll() michael@0: { michael@0: return mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::multiple) ? michael@0: AccessibleWrap::UnselectAll() : false; michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // HTMLSelectListAccessible: Widgets michael@0: michael@0: bool michael@0: HTMLSelectListAccessible::IsWidget() const michael@0: { michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: HTMLSelectListAccessible::IsActiveWidget() const michael@0: { michael@0: return FocusMgr()->HasDOMFocus(mContent); michael@0: } michael@0: michael@0: bool michael@0: HTMLSelectListAccessible::AreItemsOperable() const michael@0: { michael@0: return true; michael@0: } michael@0: michael@0: Accessible* michael@0: HTMLSelectListAccessible::CurrentItem() michael@0: { michael@0: nsIListControlFrame* listControlFrame = do_QueryFrame(GetFrame()); michael@0: if (listControlFrame) { michael@0: nsCOMPtr activeOptionNode = listControlFrame->GetCurrentOption(); michael@0: if (activeOptionNode) { michael@0: DocAccessible* document = Document(); michael@0: if (document) michael@0: return document->GetAccessible(activeOptionNode); michael@0: } michael@0: } michael@0: return nullptr; michael@0: } michael@0: michael@0: void michael@0: HTMLSelectListAccessible::SetCurrentItem(Accessible* aItem) michael@0: { michael@0: aItem->GetContent()->SetAttr(kNameSpaceID_None, michael@0: nsGkAtoms::selected, NS_LITERAL_STRING("true"), michael@0: true); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // HTMLSelectListAccessible: Accessible protected michael@0: michael@0: void michael@0: HTMLSelectListAccessible::CacheChildren() michael@0: { michael@0: // Cache accessibles for and s and