Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/accessible/xpcom/xpcAccessibleDocument.cpp
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 file,
5
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "xpcAccessibleDocument.h"
8
#include "xpcAccessibleImage.h"
9
#include "xpcAccessibleTable.h"
10
#include "xpcAccessibleTableCell.h"
11
12
#include "mozilla/a11y/DocAccessibleParent.h"
13
#include "DocAccessible-inl.h"
14
15
using namespace mozilla;
16
using namespace mozilla::a11y;
17
18
////////////////////////////////////////////////////////////////////////////////
19
// nsISupports
20
21
NS_IMPL_QUERY_INTERFACE_INHERITED(xpcAccessibleDocument, xpcAccessibleHyperText,
22
                                  nsIAccessibleDocument)
23
NS_IMPL_ADDREF_INHERITED(xpcAccessibleDocument, xpcAccessibleHyperText)
24
NS_IMETHODIMP_(MozExternalRefCountType) xpcAccessibleDocument::Release(void)
25
0
{
26
0
  nsrefcnt r = xpcAccessibleHyperText::Release();
27
0
  NS_LOG_RELEASE(this, r, "xpcAccessibleDocument");
28
0
29
0
  // The only reference to the xpcAccessibleDocument is in DocManager's cache.
30
0
  if (r == 1 && !mIntl.IsNull() && mCache.Count() == 0) {
31
0
    if (mIntl.IsAccessible()) {
32
0
      GetAccService()->RemoveFromXPCDocumentCache(
33
0
        mIntl.AsAccessible()->AsDoc());
34
0
    } else {
35
0
      GetAccService()->RemoveFromRemoteXPCDocumentCache(
36
0
        mIntl.AsProxy()->AsDoc());
37
0
    }
38
0
  }
39
0
  return r;
40
0
}
41
42
////////////////////////////////////////////////////////////////////////////////
43
// nsIAccessibleDocument
44
45
NS_IMETHODIMP
46
xpcAccessibleDocument::GetURL(nsAString& aURL)
47
0
{
48
0
  if (!Intl())
49
0
    return NS_ERROR_FAILURE;
50
0
51
0
  Intl()->URL(aURL);
52
0
  return NS_OK;
53
0
}
54
55
NS_IMETHODIMP
56
xpcAccessibleDocument::GetTitle(nsAString& aTitle)
57
0
{
58
0
  if (!Intl())
59
0
    return NS_ERROR_FAILURE;
60
0
61
0
  nsAutoString title;
62
0
  Intl()->Title(title);
63
0
  aTitle = title;
64
0
  return NS_OK;
65
0
}
66
67
NS_IMETHODIMP
68
xpcAccessibleDocument::GetMimeType(nsAString& aType)
69
0
{
70
0
  if (!Intl())
71
0
    return NS_ERROR_FAILURE;
72
0
73
0
  Intl()->MimeType(aType);
74
0
  return NS_OK;
75
0
}
76
77
NS_IMETHODIMP
78
xpcAccessibleDocument::GetDocType(nsAString& aType)
79
0
{
80
0
  if (!Intl())
81
0
    return NS_ERROR_FAILURE;
82
0
83
0
  Intl()->DocType(aType);
84
0
  return NS_OK;
85
0
}
86
87
NS_IMETHODIMP
88
xpcAccessibleDocument::GetDOMDocument(nsIDocument** aDOMDocument)
89
0
{
90
0
  NS_ENSURE_ARG_POINTER(aDOMDocument);
91
0
  *aDOMDocument = nullptr;
92
0
93
0
  if (!Intl())
94
0
    return NS_ERROR_FAILURE;
95
0
96
0
  if (Intl()->DocumentNode())
97
0
    NS_ADDREF(*aDOMDocument = Intl()->DocumentNode());
98
0
99
0
  return NS_OK;
100
0
}
101
102
NS_IMETHODIMP
103
xpcAccessibleDocument::GetWindow(mozIDOMWindowProxy** aDOMWindow)
104
0
{
105
0
  NS_ENSURE_ARG_POINTER(aDOMWindow);
106
0
  *aDOMWindow = nullptr;
107
0
108
0
  if (!Intl())
109
0
    return NS_ERROR_FAILURE;
110
0
111
0
  NS_IF_ADDREF(*aDOMWindow = Intl()->DocumentNode()->GetWindow());
112
0
  return NS_OK;
113
0
}
114
115
NS_IMETHODIMP
116
xpcAccessibleDocument::GetParentDocument(nsIAccessibleDocument** aDocument)
117
0
{
118
0
  NS_ENSURE_ARG_POINTER(aDocument);
119
0
  *aDocument = nullptr;
120
0
121
0
  if (!Intl())
122
0
    return NS_ERROR_FAILURE;
123
0
124
0
  NS_IF_ADDREF(*aDocument = ToXPCDocument(Intl()->ParentDocument()));
125
0
  return NS_OK;
126
0
}
127
128
NS_IMETHODIMP
129
xpcAccessibleDocument::GetChildDocumentCount(uint32_t* aCount)
130
0
{
131
0
  NS_ENSURE_ARG_POINTER(aCount);
132
0
  *aCount = 0;
133
0
134
0
  if (!Intl())
135
0
    return NS_ERROR_FAILURE;
136
0
137
0
  *aCount = Intl()->ChildDocumentCount();
138
0
  return NS_OK;
139
0
}
140
141
NS_IMETHODIMP
142
xpcAccessibleDocument::GetChildDocumentAt(uint32_t aIndex,
143
                                          nsIAccessibleDocument** aDocument)
144
0
{
145
0
  NS_ENSURE_ARG_POINTER(aDocument);
146
0
  *aDocument = nullptr;
147
0
148
0
  if (!Intl())
149
0
    return NS_ERROR_FAILURE;
150
0
151
0
  NS_IF_ADDREF(*aDocument = ToXPCDocument(Intl()->GetChildDocumentAt(aIndex)));
152
0
  return *aDocument ? NS_OK : NS_ERROR_INVALID_ARG;
153
0
}
154
155
NS_IMETHODIMP
156
xpcAccessibleDocument::GetVirtualCursor(nsIAccessiblePivot** aVirtualCursor)
157
0
{
158
0
  NS_ENSURE_ARG_POINTER(aVirtualCursor);
159
0
  *aVirtualCursor = nullptr;
160
0
161
0
  if (!Intl())
162
0
    return NS_ERROR_FAILURE;
163
0
164
0
  NS_ADDREF(*aVirtualCursor = Intl()->VirtualCursor());
165
0
  return NS_OK;
166
0
}
167
168
////////////////////////////////////////////////////////////////////////////////
169
// xpcAccessibleDocument
170
171
xpcAccessibleGeneric*
172
xpcAccessibleDocument::GetAccessible(Accessible* aAccessible)
173
0
{
174
0
  MOZ_ASSERT(!mRemote);
175
0
  if (ToXPCDocument(aAccessible->Document()) != this) {
176
0
    NS_ERROR("This XPCOM document is not related with given internal accessible!");
177
0
    return nullptr;
178
0
  }
179
0
180
0
  if (aAccessible->IsDoc())
181
0
    return this;
182
0
183
0
  xpcAccessibleGeneric* xpcAcc = mCache.Get(aAccessible);
184
0
  if (xpcAcc)
185
0
    return xpcAcc;
186
0
187
0
  if (aAccessible->IsImage())
188
0
    xpcAcc = new xpcAccessibleImage(aAccessible);
189
0
  else if (aAccessible->IsTable())
190
0
    xpcAcc = new xpcAccessibleTable(aAccessible);
191
0
  else if (aAccessible->IsTableCell())
192
0
    xpcAcc = new xpcAccessibleTableCell(aAccessible);
193
0
  else if (aAccessible->IsHyperText())
194
0
    xpcAcc = new xpcAccessibleHyperText(aAccessible);
195
0
  else
196
0
    xpcAcc = new xpcAccessibleGeneric(aAccessible);
197
0
198
0
  mCache.Put(aAccessible, xpcAcc);
199
0
  return xpcAcc;
200
0
}
201
202
xpcAccessibleGeneric*
203
xpcAccessibleDocument::GetXPCAccessible(ProxyAccessible* aProxy)
204
0
{
205
0
  MOZ_ASSERT(mRemote);
206
0
  MOZ_ASSERT(aProxy->Document() == mIntl.AsProxy());
207
0
  if (aProxy->IsDoc()) {
208
0
    return this;
209
0
  }
210
0
211
0
  xpcAccessibleGeneric* acc = mCache.Get(aProxy);
212
0
  if (acc) {
213
0
    return acc;
214
0
  }
215
0
216
0
  // XXX support exposing optional interfaces.
217
0
  uint8_t interfaces = 0;
218
0
  if (aProxy->mHasValue) {
219
0
    interfaces |= eValue;
220
0
  }
221
0
222
0
  if (aProxy->mIsHyperLink) {
223
0
    interfaces |= eHyperLink;
224
0
  }
225
0
226
0
  if (aProxy->mIsHyperText) {
227
0
    interfaces |= eText;
228
0
    acc = new xpcAccessibleHyperText(aProxy, interfaces);
229
0
    mCache.Put(aProxy, acc);
230
0
231
0
    return acc;
232
0
  }
233
0
234
0
  acc = new xpcAccessibleGeneric(aProxy, interfaces);
235
0
  mCache.Put(aProxy, acc);
236
0
237
0
  return acc;
238
0
}
239
240
void
241
xpcAccessibleDocument::Shutdown()
242
0
{
243
0
  for (auto iter = mCache.Iter(); !iter.Done(); iter.Next()) {
244
0
    iter.Data()->Shutdown();
245
0
    iter.Remove();
246
0
  }
247
0
  xpcAccessibleGeneric::Shutdown();
248
0
}
249
250
xpcAccessibleGeneric*
251
a11y::ToXPC(AccessibleOrProxy aAcc)
252
0
{
253
0
  if (aAcc.IsNull()) {
254
0
    return nullptr;
255
0
  }
256
0
257
0
  if (aAcc.IsAccessible()) {
258
0
    return ToXPC(aAcc.AsAccessible());
259
0
  }
260
0
261
0
 xpcAccessibleDocument* doc = ToXPCDocument(aAcc.AsProxy()->Document());
262
0
 return doc->GetXPCAccessible(aAcc.AsProxy());
263
0
}