Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/a11y/ProxyAccessibleBase.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: 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
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#ifndef mozilla_a11y_ProxyAccessibleBase_h
8
#define mozilla_a11y_ProxyAccessibleBase_h
9
10
#include "mozilla/a11y/Role.h"
11
#include "nsIAccessibleText.h"
12
#include "nsIAccessibleTypes.h"
13
#include "Accessible.h"
14
#include "nsString.h"
15
#include "nsTArray.h"
16
#include "nsRect.h"
17
#include "Accessible.h"
18
19
namespace mozilla {
20
namespace a11y {
21
22
class Accessible;
23
class Attribute;
24
class DocAccessibleParent;
25
class ProxyAccessible;
26
enum class RelationType;
27
28
enum Interfaces
29
{
30
  HYPERTEXT = 1,
31
  HYPERLINK = 1 << 1,
32
  IMAGE = 1 << 2,
33
  VALUE = 1 << 3,
34
  TABLE = 1 << 4,
35
  TABLECELL = 1 << 5,
36
  DOCUMENT = 1 << 6,
37
  SELECTION = 1 << 7,
38
  ACTION = 1 << 8,
39
};
40
41
template <class Derived>
42
class ProxyAccessibleBase
43
{
44
public:
45
  ~ProxyAccessibleBase()
46
0
  {
47
0
    MOZ_ASSERT(!mWrapper);
48
0
  }
49
50
  void AddChildAt(uint32_t aIdx, Derived* aChild)
51
0
  { mChildren.InsertElementAt(aIdx, aChild); }
52
53
0
  uint32_t ChildrenCount() const { return mChildren.Length(); }
54
0
  Derived* ChildAt(uint32_t aIdx) const { return mChildren[aIdx]; }
55
  Derived* FirstChild() const
56
0
    { return mChildren.Length() ? mChildren[0] : nullptr; }
57
  Derived* LastChild() const
58
0
    { return mChildren.Length() ? mChildren[mChildren.Length() - 1] : nullptr; }
59
  Derived* PrevSibling() const
60
0
  {
61
0
    size_t idx = IndexInParent();
62
0
    return idx > 0 ? Parent()->mChildren[idx - 1] : nullptr;
63
0
  }
64
  Derived* NextSibling() const
65
0
  {
66
0
    size_t idx = IndexInParent();
67
0
    return idx + 1 < Parent()->mChildren.Length() ? Parent()->mChildren[idx + 1]
68
0
    : nullptr;
69
0
  }
70
71
  // XXX evaluate if this is fast enough.
72
0
  size_t IndexInParent() const { return
73
0
    Parent()->mChildren.IndexOf(static_cast<const Derived*>(this)); }
74
  uint32_t EmbeddedChildCount() const;
75
  int32_t IndexOfEmbeddedChild(const Derived* aChild);
76
  Derived* EmbeddedChildAt(size_t aChildIdx);
77
  bool MustPruneChildren() const;
78
79
  void Shutdown();
80
81
  void SetChildDoc(DocAccessibleParent* aChildDoc);
82
  void ClearChildDoc(DocAccessibleParent* aChildDoc);
83
84
  /**
85
   * Remove The given child.
86
   */
87
  void RemoveChild(Derived* aChild)
88
0
    { mChildren.RemoveElement(aChild); }
89
90
  /**
91
   * Return the proxy for the parent of the wrapped accessible.
92
   */
93
  Derived* Parent() const;
94
95
  Accessible* OuterDocOfRemoteBrowser() const;
96
97
  /**
98
   * Get the role of the accessible we're proxying.
99
   */
100
0
  role Role() const { return mRole; }
101
102
  /**
103
   * Return true if this is an embedded object.
104
   */
105
  bool IsEmbeddedObject() const
106
0
  {
107
0
    role role = Role();
108
0
    return role != roles::TEXT_LEAF &&
109
0
           role != roles::WHITESPACE &&
110
0
           role != roles::STATICTEXT;
111
0
  }
112
113
  /**
114
   * Allow the platform to store a pointers worth of data on us.
115
   */
116
0
  uintptr_t GetWrapper() const { return mWrapper; }
117
0
  void SetWrapper(uintptr_t aWrapper) { mWrapper = aWrapper; }
118
119
  /*
120
   * Return the ID of the accessible being proxied.
121
   */
122
0
  uint64_t ID() const { return mID; }
123
124
  /**
125
   * Return the document containing this proxy, or the proxy itself if it is a
126
   * document.
127
   */
128
0
  DocAccessibleParent* Document() const { return mDoc; }
129
130
  /**
131
   * Return true if this proxy is a DocAccessibleParent.
132
   */
133
0
  bool IsDoc() const { return mIsDoc; }
134
0
  DocAccessibleParent* AsDoc() const { return IsDoc() ? mDoc : nullptr; }
135
136
  // XXX checking mRole alone may not result in same behavior as Accessibles
137
  // due to ARIA roles. See bug 1210477.
138
  inline bool IsTable() const
139
0
  {
140
0
    return mRole == roles::TABLE || mRole == roles::MATHML_TABLE;
141
0
  }
142
  inline bool IsTableRow() const
143
0
  {
144
0
    return (mRole == roles::ROW ||
145
0
        mRole == roles::MATHML_TABLE_ROW ||
146
0
        mRole == roles::MATHML_LABELED_ROW);
147
0
  }
148
  inline bool IsTableCell() const
149
0
  {
150
0
    return (mRole == roles::CELL ||
151
0
        mRole == roles::COLUMNHEADER ||
152
0
        mRole == roles::ROWHEADER ||
153
0
        mRole == roles::GRID_CELL ||
154
0
        mRole == roles::MATHML_CELL);
155
0
  }
156
157
protected:
158
  ProxyAccessibleBase(uint64_t aID, Derived* aParent,
159
                      DocAccessibleParent* aDoc, role aRole,
160
                      uint32_t aInterfaces)
161
    : mParent(aParent->ID())
162
    , mDoc(aDoc)
163
    , mWrapper(0)
164
    , mID(aID)
165
    , mRole(aRole)
166
    , mOuterDoc(false)
167
    , mIsDoc(false)
168
    , mHasValue(aInterfaces & Interfaces::VALUE)
169
    , mIsHyperLink(aInterfaces & Interfaces::HYPERLINK)
170
    , mIsHyperText(aInterfaces & Interfaces::HYPERTEXT)
171
0
  {
172
0
  }
173
174
  explicit ProxyAccessibleBase(DocAccessibleParent* aThisAsDoc) :
175
    mParent(kNoParent), mDoc(aThisAsDoc), mWrapper(0), mID(0),
176
    mRole(roles::DOCUMENT), mOuterDoc(false), mIsDoc(true), mHasValue(false),
177
    mIsHyperLink(false), mIsHyperText(false)
178
0
  {}
179
180
protected:
181
  void SetParent(Derived* aParent);
182
183
private:
184
  uintptr_t mParent;
185
  static const uintptr_t kNoParent = UINTPTR_MAX;
186
187
  friend Derived;
188
189
  nsTArray<Derived*> mChildren;
190
  DocAccessibleParent* mDoc;
191
  uintptr_t mWrapper;
192
  uint64_t mID;
193
194
protected:
195
  // XXX DocAccessibleParent gets to change this to change the role of
196
  // documents.
197
  role mRole : 27;
198
199
private:
200
  bool mOuterDoc : 1;
201
202
public:
203
  const bool mIsDoc: 1;
204
  const bool mHasValue: 1;
205
  const bool mIsHyperLink: 1;
206
  const bool mIsHyperText: 1;
207
};
208
209
extern template class ProxyAccessibleBase<ProxyAccessible>;
210
211
}
212
}
213
214
#endif