Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/accessible/base/nsTextEquivUtils.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim:expandtab:shiftwidth=2:tabstop=2:
3
 */
4
/* This Source Code Form is subject to the terms of the Mozilla Public
5
 * License, v. 2.0. If a copy of the MPL was not distributed with this
6
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8
#ifndef _nsTextEquivUtils_H_
9
#define _nsTextEquivUtils_H_
10
11
#include "Accessible.h"
12
#include "Role.h"
13
14
class nsIContent;
15
16
/**
17
 * Text equivalent computation rules (see nsTextEquivUtils::gRoleToNameRulesMap)
18
 */
19
enum ETextEquivRule
20
{
21
  // No rule.
22
  eNoNameRule = 0x00,
23
24
  // Walk into subtree only if the currently navigated accessible is not root
25
  // accessible (i.e. if the accessible is part of text equivalent computation).
26
  eNameFromSubtreeIfReqRule = 0x01,
27
28
  // Text equivalent computation from subtree is allowed.
29
  eNameFromSubtreeRule = 0x03,
30
31
  // The accessible allows to append its value to text equivalent.
32
  // XXX: This is temporary solution. Once we move accessible value of links
33
  // and linkable accessibles to MSAA part we can remove this.
34
  eNameFromValueRule = 0x04
35
};
36
37
/**
38
 * The class provides utils methods to compute the accessible name and
39
 * description.
40
 */
41
class nsTextEquivUtils
42
{
43
public:
44
  typedef mozilla::a11y::Accessible Accessible;
45
46
  /**
47
   * Determines if the accessible has a given name rule.
48
   *
49
   * @param aAccessible [in] the given accessible
50
   * @param aRule       [in] a given name rule
51
   * @return true if the accessible has the rule
52
   */
53
  static inline bool HasNameRule(Accessible* aAccessible, ETextEquivRule aRule)
54
0
  {
55
0
    return (GetRoleRule(aAccessible->Role()) & aRule) == aRule;
56
0
  }
57
58
  /**
59
   * Calculates the name from accessible subtree if allowed.
60
   *
61
   * @param aAccessible [in] the given accessible
62
   * @param aName       [out] accessible name
63
   */
64
  static nsresult GetNameFromSubtree(const Accessible* aAccessible,
65
                                     nsAString& aName);
66
67
  /**
68
   * Calculates text equivalent from the subtree. Similar to GetNameFromSubtree.
69
   * However it returns not empty result for things like HTML p.
70
   */
71
  static void GetTextEquivFromSubtree(const Accessible* aAccessible,
72
                                      nsString& aTextEquiv)
73
0
  {
74
0
    aTextEquiv.Truncate();
75
0
76
0
    AppendFromAccessibleChildren(aAccessible, &aTextEquiv);
77
0
    aTextEquiv.CompressWhitespace();
78
0
  }
79
80
  /**
81
   * Calculates text equivalent for the given accessible from its IDRefs
82
   * attribute (like aria-labelledby or aria-describedby).
83
   *
84
   * @param aAccessible  [in] the accessible text equivalent is computed for
85
   * @param aIDRefsAttr  [in] IDRefs attribute on DOM node of the accessible
86
   * @param aTextEquiv   [out] result text equivalent
87
   */
88
  static nsresult GetTextEquivFromIDRefs(const Accessible* aAccessible,
89
                                         nsAtom *aIDRefsAttr,
90
                                         nsAString& aTextEquiv);
91
92
  /**
93
   * Calculates the text equivalent from the given content and its subtree if
94
   * allowed and appends it to the given string.
95
   *
96
   * @param aInitiatorAcc  [in] the accessible text equivalent is computed for
97
   *                       in the end (root accessible of text equivalent
98
   *                       calculation recursion)
99
   * @param aContent       [in] the given content the text equivalent is
100
   *                       computed from
101
   * @param aString        [in, out] the string
102
   */
103
  static nsresult AppendTextEquivFromContent(const Accessible* aInitiatorAcc,
104
                                             nsIContent *aContent,
105
                                             nsAString *aString);
106
107
  /**
108
   * Calculates the text equivalent from the given text content (may be text
109
   * node or html:br) and appends it to the given string.
110
   *
111
   * @param aContent       [in] the text content
112
   * @param aString        [in, out] the string
113
   */
114
  static nsresult AppendTextEquivFromTextContent(nsIContent *aContent,
115
                                                 nsAString *aString);
116
117
private:
118
  /**
119
   * Iterates accessible children and calculates text equivalent from each
120
   * child.
121
   */
122
  static nsresult AppendFromAccessibleChildren(const Accessible* aAccessible,
123
                                               nsAString *aString);
124
125
  /**
126
   * Calculates text equivalent from the given accessible and its subtree if
127
   * allowed.
128
   */
129
  static nsresult AppendFromAccessible(Accessible* aAccessible,
130
                                       nsAString *aString);
131
132
  /**
133
   * Calculates text equivalent from the value of given accessible.
134
   */
135
  static nsresult AppendFromValue(Accessible* aAccessible,
136
                                  nsAString *aString);
137
  /**
138
   * Iterates DOM children and calculates text equivalent from each child node.
139
   */
140
  static nsresult AppendFromDOMChildren(nsIContent *aContent,
141
                                        nsAString *aString);
142
143
  /**
144
   * Calculates text equivalent from the given DOM node and its subtree if
145
   * allowed.
146
   */
147
  static nsresult AppendFromDOMNode(nsIContent *aContent, nsAString *aString);
148
149
  /**
150
   * Concatenates strings and appends space between them. Returns true if
151
   * text equivalent string was appended.
152
   */
153
  static bool AppendString(nsAString *aString,
154
                             const nsAString& aTextEquivalent);
155
156
  /**
157
   * Returns the rule (constant of ETextEquivRule) for a given role.
158
   */
159
  static uint32_t GetRoleRule(mozilla::a11y::roles::Role aRole);
160
};
161
162
#endif