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/. */
7 #include "xpcAccessibleDocument.h"
8 #include "xpcAccessibleImage.h"
9 #include "xpcAccessibleTable.h"
10 #include "xpcAccessibleTableCell.h"
12 #include "nsAccUtils.h"
13 #include "DocAccessible-inl.h"
15 using namespace mozilla
;
16 using namespace mozilla::a11y
;
18 ////////////////////////////////////////////////////////////////////////////////
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 nsrefcnt r
= xpcAccessibleHyperText::Release();
26 NS_LOG_RELEASE(this, r
, "xpcAccessibleDocument");
28 // The only reference to the xpcAccessibleDocument is in DocManager's cache.
29 if (r
== 1 && !!mIntl
&& mCache
.Count() == 0) {
30 if (mIntl
->IsLocal()) {
31 GetAccService()->RemoveFromXPCDocumentCache(mIntl
->AsLocal()->AsDoc());
33 GetAccService()->RemoveFromRemoteXPCDocumentCache(
34 mIntl
->AsRemote()->AsDoc());
40 ////////////////////////////////////////////////////////////////////////////////
41 // nsIAccessibleDocument
44 xpcAccessibleDocument::GetURL(nsAString
& aURL
) {
45 if (!mIntl
) return NS_ERROR_FAILURE
;
47 nsAccUtils::DocumentURL(mIntl
, aURL
);
52 xpcAccessibleDocument::GetTitle(nsAString
& aTitle
) {
53 if (!Intl()) return NS_ERROR_FAILURE
;
62 xpcAccessibleDocument::GetMimeType(nsAString
& aType
) {
63 if (!mIntl
) return NS_ERROR_FAILURE
;
65 nsAccUtils::DocumentMimeType(mIntl
, aType
);
70 xpcAccessibleDocument::GetDocType(nsAString
& aType
) {
71 if (!Intl()) return NS_ERROR_FAILURE
;
73 Intl()->DocType(aType
);
78 xpcAccessibleDocument::GetDOMDocument(dom::Document
** aDOMDocument
) {
79 NS_ENSURE_ARG_POINTER(aDOMDocument
);
80 *aDOMDocument
= nullptr;
82 if (!Intl()) return NS_ERROR_FAILURE
;
84 if (Intl()->DocumentNode()) NS_ADDREF(*aDOMDocument
= Intl()->DocumentNode());
90 xpcAccessibleDocument::GetWindow(mozIDOMWindowProxy
** aDOMWindow
) {
91 NS_ENSURE_ARG_POINTER(aDOMWindow
);
92 *aDOMWindow
= nullptr;
94 if (!Intl()) return NS_ERROR_FAILURE
;
96 NS_IF_ADDREF(*aDOMWindow
= Intl()->DocumentNode()->GetWindow());
101 xpcAccessibleDocument::GetParentDocument(nsIAccessibleDocument
** aDocument
) {
102 NS_ENSURE_ARG_POINTER(aDocument
);
103 *aDocument
= nullptr;
105 if (!Intl()) return NS_ERROR_FAILURE
;
107 NS_IF_ADDREF(*aDocument
= ToXPCDocument(Intl()->ParentDocument()));
112 xpcAccessibleDocument::GetChildDocumentCount(uint32_t* aCount
) {
113 NS_ENSURE_ARG_POINTER(aCount
);
116 if (!Intl()) return NS_ERROR_FAILURE
;
118 *aCount
= Intl()->ChildDocumentCount();
123 xpcAccessibleDocument::GetChildDocumentAt(uint32_t aIndex
,
124 nsIAccessibleDocument
** aDocument
) {
125 NS_ENSURE_ARG_POINTER(aDocument
);
126 *aDocument
= nullptr;
128 if (!Intl()) return NS_ERROR_FAILURE
;
130 NS_IF_ADDREF(*aDocument
= ToXPCDocument(Intl()->GetChildDocumentAt(aIndex
)));
131 return *aDocument
? NS_OK
: NS_ERROR_INVALID_ARG
;
134 ////////////////////////////////////////////////////////////////////////////////
135 // xpcAccessibleDocument
137 xpcAccessibleGeneric
* xpcAccessibleDocument::GetAccessible(
138 Accessible
* aAccessible
) {
139 if (aAccessible
->IsLocal() &&
140 ToXPCDocument(aAccessible
->AsLocal()->Document()) != this) {
142 "This XPCOM document is not related with given internal accessible!");
146 if (aAccessible
->IsRemote() &&
147 ToXPCDocument(aAccessible
->AsRemote()->Document()) != this) {
149 "This XPCOM document is not related with given internal accessible!");
153 if (aAccessible
->IsDoc()) return this;
155 return mCache
.LookupOrInsertWith(aAccessible
, [&]() -> xpcAccessibleGeneric
* {
156 if (aAccessible
->IsImage()) {
157 return new xpcAccessibleImage(aAccessible
);
159 if (aAccessible
->IsTable()) {
160 return new xpcAccessibleTable(aAccessible
);
162 if (aAccessible
->IsTableCell()) {
163 return new xpcAccessibleTableCell(aAccessible
);
165 if (aAccessible
->IsHyperText()) {
166 return new xpcAccessibleHyperText(aAccessible
);
169 return new xpcAccessibleGeneric(aAccessible
);
173 void xpcAccessibleDocument::Shutdown() {
174 for (auto iter
= mCache
.Iter(); !iter
.Done(); iter
.Next()) {
175 iter
.Data()->Shutdown();
178 xpcAccessibleGeneric::Shutdown();