/* -*- 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 "nsTextEquivUtils.h" #include "Role.h" #include "States.h" #include "nsCOMPtr.h" #include "mozilla/dom/HTMLOptionElement.h" #include "nsIComboboxControlFrame.h" #include "nsContainerFrame.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