Bug 1890277: part 2) Add `require-trusted-types-for` directive to CSP parser, guarded...
[gecko.git] / accessible / xpcom / xpcAccessibleDocument.cpp
blobd616e476b2149de5703077563680905e40db0459
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 ////////////////////////////////////////////////////////////////////////////////
19 // nsISupports
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());
32 } else {
33 GetAccService()->RemoveFromRemoteXPCDocumentCache(
34 mIntl->AsRemote()->AsDoc());
37 return r;
40 ////////////////////////////////////////////////////////////////////////////////
41 // nsIAccessibleDocument
43 NS_IMETHODIMP
44 xpcAccessibleDocument::GetURL(nsAString& aURL) {
45 if (!mIntl) return NS_ERROR_FAILURE;
47 nsAccUtils::DocumentURL(mIntl, aURL);
48 return NS_OK;
51 NS_IMETHODIMP
52 xpcAccessibleDocument::GetTitle(nsAString& aTitle) {
53 if (!Intl()) return NS_ERROR_FAILURE;
55 nsAutoString title;
56 Intl()->Title(title);
57 aTitle = title;
58 return NS_OK;
61 NS_IMETHODIMP
62 xpcAccessibleDocument::GetMimeType(nsAString& aType) {
63 if (!mIntl) return NS_ERROR_FAILURE;
65 nsAccUtils::DocumentMimeType(mIntl, aType);
66 return NS_OK;
69 NS_IMETHODIMP
70 xpcAccessibleDocument::GetDocType(nsAString& aType) {
71 if (!Intl()) return NS_ERROR_FAILURE;
73 Intl()->DocType(aType);
74 return NS_OK;
77 NS_IMETHODIMP
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());
86 return NS_OK;
89 NS_IMETHODIMP
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());
97 return NS_OK;
100 NS_IMETHODIMP
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()));
108 return NS_OK;
111 NS_IMETHODIMP
112 xpcAccessibleDocument::GetChildDocumentCount(uint32_t* aCount) {
113 NS_ENSURE_ARG_POINTER(aCount);
114 *aCount = 0;
116 if (!Intl()) return NS_ERROR_FAILURE;
118 *aCount = Intl()->ChildDocumentCount();
119 return NS_OK;
122 NS_IMETHODIMP
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) {
141 NS_ERROR(
142 "This XPCOM document is not related with given internal accessible!");
143 return nullptr;
146 if (aAccessible->IsRemote() &&
147 ToXPCDocument(aAccessible->AsRemote()->Document()) != this) {
148 NS_ERROR(
149 "This XPCOM document is not related with given internal accessible!");
150 return nullptr;
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();
176 iter.Remove();
178 xpcAccessibleGeneric::Shutdown();