tor-browser

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

BaseAccessibles.cpp (3881B)


      1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #include "BaseAccessibles.h"
      7 
      8 #include "States.h"
      9 
     10 using namespace mozilla::a11y;
     11 
     12 ////////////////////////////////////////////////////////////////////////////////
     13 // LeafAccessible
     14 ////////////////////////////////////////////////////////////////////////////////
     15 
     16 LeafAccessible::LeafAccessible(nsIContent* aContent, DocAccessible* aDoc)
     17    : AccessibleWrap(aContent, aDoc) {
     18  mStateFlags |= eNoKidsFromDOM;
     19 }
     20 
     21 ////////////////////////////////////////////////////////////////////////////////
     22 // LeafAccessible: LocalAccessible public
     23 
     24 LocalAccessible* LeafAccessible::LocalChildAtPoint(
     25    int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild) {
     26  // Don't walk into leaf accessibles.
     27  return this;
     28 }
     29 
     30 bool LeafAccessible::InsertChildAt(uint32_t aIndex, LocalAccessible* aChild) {
     31  MOZ_ASSERT_UNREACHABLE("InsertChildAt called on leaf accessible!");
     32  return false;
     33 }
     34 
     35 bool LeafAccessible::RemoveChild(LocalAccessible* aChild) {
     36  MOZ_ASSERT_UNREACHABLE("RemoveChild called on leaf accessible!");
     37  return false;
     38 }
     39 
     40 bool LeafAccessible::IsAcceptableChild(nsIContent* aEl) const {
     41  // No children for leaf accessible.
     42  return false;
     43 }
     44 
     45 ////////////////////////////////////////////////////////////////////////////////
     46 // LinkableAccessible
     47 ////////////////////////////////////////////////////////////////////////////////
     48 
     49 ////////////////////////////////////////////////////////////////////////////////
     50 // LinkableAccessible. nsIAccessible
     51 
     52 void LinkableAccessible::TakeFocus() const {
     53  if (const LocalAccessible* actionAcc = ActionWalk()) {
     54    actionAcc->TakeFocus();
     55  } else {
     56    AccessibleWrap::TakeFocus();
     57  }
     58 }
     59 
     60 uint64_t LinkableAccessible::NativeLinkState() const {
     61  bool isLink;
     62  const LocalAccessible* actionAcc = ActionWalk(&isLink);
     63  if (isLink) {
     64    return states::LINKED | (actionAcc->LinkState() & states::TRAVERSED);
     65  }
     66 
     67  return 0;
     68 }
     69 
     70 void LinkableAccessible::Value(nsString& aValue) const {
     71  aValue.Truncate();
     72 
     73  LocalAccessible::Value(aValue);
     74  if (!aValue.IsEmpty()) {
     75    return;
     76  }
     77 
     78  bool isLink;
     79  const LocalAccessible* actionAcc = ActionWalk(&isLink);
     80  if (isLink) {
     81    actionAcc->Value(aValue);
     82  }
     83 }
     84 
     85 const LocalAccessible* LinkableAccessible::ActionWalk(bool* aIsLink,
     86                                                      bool* aIsOnclick) const {
     87  if (aIsOnclick) {
     88    *aIsOnclick = false;
     89  }
     90  if (aIsLink) {
     91    *aIsLink = false;
     92  }
     93 
     94  if (HasPrimaryAction()) {
     95    if (aIsOnclick) {
     96      *aIsOnclick = true;
     97    }
     98 
     99    return nullptr;
    100  }
    101 
    102  const Accessible* actionAcc = ActionAncestor();
    103 
    104  const LocalAccessible* localAction =
    105      actionAcc ? const_cast<Accessible*>(actionAcc)->AsLocal() : nullptr;
    106 
    107  if (!localAction) {
    108    return nullptr;
    109  }
    110 
    111  if (localAction->LinkState() & states::LINKED) {
    112    if (aIsLink) {
    113      *aIsLink = true;
    114    }
    115  } else if (aIsOnclick) {
    116    *aIsOnclick = true;
    117  }
    118 
    119  return localAction;
    120 }
    121 
    122 KeyBinding LinkableAccessible::AccessKey() const {
    123  if (const LocalAccessible* actionAcc = ActionWalk()) {
    124    return actionAcc->AccessKey();
    125  }
    126 
    127  return LocalAccessible::AccessKey();
    128 }
    129 
    130 ////////////////////////////////////////////////////////////////////////////////
    131 // DummyAccessible
    132 ////////////////////////////////////////////////////////////////////////////////
    133 
    134 uint64_t DummyAccessible::NativeState() const { return 0; }
    135 uint64_t DummyAccessible::NativeInteractiveState() const { return 0; }
    136 
    137 uint64_t DummyAccessible::NativeLinkState() const { return 0; }
    138 
    139 bool DummyAccessible::NativelyUnavailable() const { return false; }
    140 
    141 void DummyAccessible::ApplyARIAState(uint64_t* aState) const {}