Bug 1874684 - Part 6: Limit day length calculations to safe integers. r=mgaudet
[gecko.git] / accessible / xpcom / xpcAccessibleDocument.h
blob8e9bf2b413585b5a3db9370eee5d57fb6c6716ed
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"
17 namespace mozilla {
18 namespace a11y {
20 /**
21 * XPCOM wrapper around DocAccessible class.
23 class xpcAccessibleDocument : public xpcAccessibleHyperText,
24 public nsIAccessibleDocument {
25 public:
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
32 // assert.
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;
50 /**
51 * Return XPCOM wrapper for the internal accessible.
53 xpcAccessibleGeneric* GetAccessible(Accessible* aAccessible);
55 virtual void Shutdown() override;
57 protected:
58 virtual ~xpcAccessibleDocument() {}
60 private:
61 DocAccessible* Intl() {
62 if (LocalAccessible* acc = mIntl->AsLocal()) {
63 return acc->AsDoc();
66 return nullptr;
69 void NotifyOfShutdown(Accessible* aAccessible) {
70 xpcAccessibleGeneric* xpcAcc = mCache.Get(aAccessible);
71 if (xpcAcc) {
72 xpcAcc->Shutdown();
75 mCache.Remove(aAccessible);
76 if (mCache.Count() == 0 && mRefCnt == 1) {
77 if (mIntl->IsLocal()) {
78 GetAccService()->RemoveFromXPCDocumentCache(mIntl->AsLocal()->AsDoc());
79 } else {
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;
95 bool mRemote;
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()) {
113 return nullptr;
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);
133 } // namespace a11y
134 } // namespace mozilla
136 #endif