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