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 #ifndef mozilla_a11y_xpcAccessibleDocument_h_
8 #define mozilla_a11y_xpcAccessibleDocument_h_
10 #include "nsIAccessibleDocument.h"
12 #include "DocAccessible.h"
13 #include "nsAccessibilityService.h"
14 #include "xpcAccessibleApplication.h"
15 #include "xpcAccessibleHyperText.h"
21 * XPCOM wrapper around DocAccessible class.
23 class xpcAccessibleDocument
: public xpcAccessibleHyperText
,
24 public nsIAccessibleDocument
{
26 explicit xpcAccessibleDocument(Accessible
* aIntl
)
27 : xpcAccessibleHyperText(aIntl
),
28 mCache(kDefaultCacheLength
),
29 mRemote(aIntl
->IsRemote()) {
30 // XXX: Once there is a base doc class that both remote and local
31 // accessibles inherit, we can add the type to the prototype and remove this
33 MOZ_ASSERT(aIntl
->IsDoc());
36 NS_DECL_ISUPPORTS_INHERITED
38 // nsIAccessibleDocument
39 NS_IMETHOD
GetURL(nsAString
& aURL
) final
;
40 NS_IMETHOD
GetTitle(nsAString
& aTitle
) final
;
41 NS_IMETHOD
GetMimeType(nsAString
& aType
) final
;
42 NS_IMETHOD
GetDocType(nsAString
& aType
) final
;
43 NS_IMETHOD
GetDOMDocument(dom::Document
** aDOMDocument
) final
;
44 NS_IMETHOD
GetWindow(mozIDOMWindowProxy
** aDOMWindow
) final
;
45 NS_IMETHOD
GetParentDocument(nsIAccessibleDocument
** aDocument
) final
;
46 NS_IMETHOD
GetChildDocumentCount(uint32_t* aCount
) final
;
47 NS_IMETHOD
GetChildDocumentAt(uint32_t aIndex
,
48 nsIAccessibleDocument
** aDocument
) final
;
51 * Return XPCOM wrapper for the internal accessible.
53 xpcAccessibleGeneric
* GetAccessible(Accessible
* aAccessible
);
55 virtual void Shutdown() override
;
58 virtual ~xpcAccessibleDocument() {}
61 DocAccessible
* Intl() {
62 if (LocalAccessible
* acc
= mIntl
->AsLocal()) {
69 void NotifyOfShutdown(Accessible
* aAccessible
) {
70 xpcAccessibleGeneric
* xpcAcc
= mCache
.Get(aAccessible
);
75 mCache
.Remove(aAccessible
);
76 if (mCache
.Count() == 0 && mRefCnt
== 1) {
77 if (mIntl
->IsLocal()) {
78 GetAccService()->RemoveFromXPCDocumentCache(mIntl
->AsLocal()->AsDoc());
80 GetAccService()->RemoveFromRemoteXPCDocumentCache(
81 mIntl
->AsRemote()->AsDoc());
86 friend class DocManager
;
87 friend class DocAccessible
;
88 friend class RemoteAccessible
;
89 friend class xpcAccessibleGeneric
;
91 xpcAccessibleDocument(const xpcAccessibleDocument
&) = delete;
92 xpcAccessibleDocument
& operator=(const xpcAccessibleDocument
&) = delete;
94 nsTHashMap
<nsPtrHashKey
<const void>, xpcAccessibleGeneric
*> mCache
;
98 inline xpcAccessibleGeneric
* ToXPC(Accessible
* aAccessible
) {
99 if (!aAccessible
) return nullptr;
101 if (aAccessible
->IsApplication()) return XPCApplicationAcc();
103 xpcAccessibleDocument
* xpcDoc
=
104 aAccessible
->IsLocal()
105 ? GetAccService()->GetXPCDocument(aAccessible
->AsLocal()->Document())
106 : GetAccService()->GetXPCDocument(
107 aAccessible
->AsRemote()->Document());
108 return xpcDoc
? xpcDoc
->GetAccessible(aAccessible
) : nullptr;
111 inline xpcAccessibleHyperText
* ToXPCText(Accessible
* aAccessible
) {
112 if (!aAccessible
|| !aAccessible
->IsHyperText()) {
116 xpcAccessibleDocument
* xpcDoc
=
117 aAccessible
->IsLocal()
118 ? GetAccService()->GetXPCDocument(aAccessible
->AsLocal()->Document())
119 : nsAccessibilityService::GetXPCDocument(
120 aAccessible
->AsRemote()->Document());
121 return static_cast<xpcAccessibleHyperText
*>(
122 xpcDoc
? xpcDoc
->GetAccessible(aAccessible
) : nullptr);
125 inline xpcAccessibleDocument
* ToXPCDocument(DocAccessible
* aAccessible
) {
126 return GetAccService()->GetXPCDocument(aAccessible
);
129 inline xpcAccessibleDocument
* ToXPCDocument(DocAccessibleParent
* aAccessible
) {
130 return GetAccService()->GetXPCDocument(aAccessible
);
134 } // namespace mozilla