tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

xpcAccessibleSelectable.cpp (3482B)


      1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "nsComponentManagerUtils.h"
      8 #include "nsIAccessible.h"
      9 #include "nsIMutableArray.h"
     10 #include "xpcAccessibleDocument.h"
     11 #include "xpcAccessibleSelectable.h"
     12 
     13 using namespace mozilla::a11y;
     14 
     15 NS_IMETHODIMP
     16 xpcAccessibleSelectable::GetSelectedItems(nsIArray** aSelectedItems) {
     17  NS_ENSURE_ARG_POINTER(aSelectedItems);
     18  *aSelectedItems = nullptr;
     19 
     20  if (!Intl()) return NS_ERROR_FAILURE;
     21  MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!");
     22 
     23  AutoTArray<Accessible*, 10> items;
     24  Intl()->SelectedItems(&items);
     25 
     26  uint32_t itemCount = items.Length();
     27  if (itemCount == 0) return NS_OK;
     28 
     29  nsresult rv = NS_OK;
     30  nsCOMPtr<nsIMutableArray> xpcItems =
     31      do_CreateInstance(NS_ARRAY_CONTRACTID, &rv);
     32  NS_ENSURE_SUCCESS(rv, rv);
     33 
     34  for (uint32_t idx = 0; idx < itemCount; idx++) {
     35    xpcItems->AppendElement(static_cast<nsIAccessible*>(ToXPC(items[idx])));
     36  }
     37 
     38  NS_ADDREF(*aSelectedItems = xpcItems);
     39  return NS_OK;
     40 }
     41 
     42 NS_IMETHODIMP
     43 xpcAccessibleSelectable::GetSelectedItemCount(uint32_t* aSelectionCount) {
     44  NS_ENSURE_ARG_POINTER(aSelectionCount);
     45  *aSelectionCount = 0;
     46 
     47  if (!Intl()) return NS_ERROR_FAILURE;
     48  MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!");
     49 
     50  *aSelectionCount = Intl()->SelectedItemCount();
     51  return NS_OK;
     52 }
     53 
     54 NS_IMETHODIMP
     55 xpcAccessibleSelectable::GetSelectedItemAt(uint32_t aIndex,
     56                                           nsIAccessible** aSelected) {
     57  NS_ENSURE_ARG_POINTER(aSelected);
     58  *aSelected = nullptr;
     59 
     60  if (!Intl()) return NS_ERROR_FAILURE;
     61  MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!");
     62 
     63  *aSelected = ToXPC(Intl()->GetSelectedItem(aIndex));
     64  if (*aSelected) {
     65    NS_ADDREF(*aSelected);
     66    return NS_OK;
     67  }
     68 
     69  return NS_ERROR_INVALID_ARG;
     70 }
     71 
     72 NS_IMETHODIMP
     73 xpcAccessibleSelectable::IsItemSelected(uint32_t aIndex, bool* aIsSelected) {
     74  NS_ENSURE_ARG_POINTER(aIsSelected);
     75  *aIsSelected = false;
     76 
     77  if (!Intl()) return NS_ERROR_FAILURE;
     78  MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!");
     79 
     80  *aIsSelected = Intl()->IsItemSelected(aIndex);
     81  return NS_OK;
     82 }
     83 
     84 NS_IMETHODIMP
     85 xpcAccessibleSelectable::AddItemToSelection(uint32_t aIndex) {
     86  if (!Intl()) return NS_ERROR_FAILURE;
     87  MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!");
     88 
     89  return Intl()->AddItemToSelection(aIndex) ? NS_OK : NS_ERROR_INVALID_ARG;
     90 }
     91 
     92 NS_IMETHODIMP
     93 xpcAccessibleSelectable::RemoveItemFromSelection(uint32_t aIndex) {
     94  if (!Intl()) return NS_ERROR_FAILURE;
     95  MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!");
     96 
     97  return Intl()->RemoveItemFromSelection(aIndex) ? NS_OK : NS_ERROR_INVALID_ARG;
     98 }
     99 
    100 NS_IMETHODIMP
    101 xpcAccessibleSelectable::SelectAll(bool* aIsMultiSelect) {
    102  NS_ENSURE_ARG_POINTER(aIsMultiSelect);
    103  *aIsMultiSelect = false;
    104 
    105  if (!Intl()) return NS_ERROR_FAILURE;
    106  MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!");
    107 
    108  *aIsMultiSelect = Intl()->SelectAll();
    109  return NS_OK;
    110 }
    111 
    112 NS_IMETHODIMP
    113 xpcAccessibleSelectable::UnselectAll() {
    114  if (!Intl()) return NS_ERROR_FAILURE;
    115  MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!");
    116 
    117  Intl()->UnselectAll();
    118  return NS_OK;
    119 }