xpcAccessibleDocument.h (4404B)
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 #ifndef mozilla_a11y_xpcAccessibleDocument_h_ 8 #define mozilla_a11y_xpcAccessibleDocument_h_ 9 10 #include "nsIAccessibleDocument.h" 11 12 #include "DocAccessible.h" 13 #include "nsAccessibilityService.h" 14 #include "xpcAccessibleApplication.h" 15 #include "xpcAccessibleHyperText.h" 16 17 namespace mozilla { 18 namespace a11y { 19 20 /** 21 * XPCOM wrapper around DocAccessible class. 22 */ 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()); 34 } 35 36 NS_DECL_ISUPPORTS_INHERITED 37 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; 49 NS_IMETHOD GetBrowsingContext(dom::BrowsingContext** aBrowsingContext) final; 50 51 /** 52 * Return XPCOM wrapper for the internal accessible. 53 */ 54 xpcAccessibleGeneric* GetAccessible(Accessible* aAccessible); 55 56 virtual void Shutdown() override; 57 58 protected: 59 virtual ~xpcAccessibleDocument() {} 60 61 private: 62 DocAccessible* Intl() { 63 if (LocalAccessible* acc = mIntl->AsLocal()) { 64 return acc->AsDoc(); 65 } 66 67 return nullptr; 68 } 69 70 void NotifyOfShutdown(Accessible* aAccessible) { 71 xpcAccessibleGeneric* xpcAcc = mCache.Get(aAccessible); 72 if (xpcAcc) { 73 xpcAcc->Shutdown(); 74 } 75 76 mCache.Remove(aAccessible); 77 if (mCache.Count() == 0 && mRefCnt == 1) { 78 if (mIntl->IsLocal()) { 79 GetAccService()->RemoveFromXPCDocumentCache(mIntl->AsLocal()->AsDoc()); 80 } else { 81 GetAccService()->RemoveFromRemoteXPCDocumentCache( 82 mIntl->AsRemote()->AsDoc()); 83 } 84 } 85 } 86 87 friend class DocManager; 88 friend class DocAccessible; 89 friend class RemoteAccessible; 90 friend class xpcAccessibleGeneric; 91 92 xpcAccessibleDocument(const xpcAccessibleDocument&) = delete; 93 xpcAccessibleDocument& operator=(const xpcAccessibleDocument&) = delete; 94 95 nsTHashMap<nsPtrHashKey<const void>, xpcAccessibleGeneric*> mCache; 96 bool mRemote; 97 }; 98 99 inline xpcAccessibleGeneric* ToXPC(Accessible* aAccessible) { 100 if (!aAccessible) return nullptr; 101 102 if (aAccessible->IsApplication()) return XPCApplicationAcc(); 103 104 xpcAccessibleDocument* xpcDoc = 105 aAccessible->IsLocal() 106 ? GetAccService()->GetXPCDocument(aAccessible->AsLocal()->Document()) 107 : GetAccService()->GetXPCDocument( 108 aAccessible->AsRemote()->Document()); 109 return xpcDoc ? xpcDoc->GetAccessible(aAccessible) : nullptr; 110 } 111 112 inline xpcAccessibleHyperText* ToXPCText(Accessible* aAccessible) { 113 if (!aAccessible || !aAccessible->IsHyperText()) { 114 return nullptr; 115 } 116 117 xpcAccessibleDocument* xpcDoc = 118 aAccessible->IsLocal() 119 ? GetAccService()->GetXPCDocument(aAccessible->AsLocal()->Document()) 120 : nsAccessibilityService::GetXPCDocument( 121 aAccessible->AsRemote()->Document()); 122 return static_cast<xpcAccessibleHyperText*>( 123 xpcDoc ? xpcDoc->GetAccessible(aAccessible) : nullptr); 124 } 125 126 inline xpcAccessibleDocument* ToXPCDocument(DocAccessible* aAccessible) { 127 return GetAccService()->GetXPCDocument(aAccessible); 128 } 129 130 inline xpcAccessibleDocument* ToXPCDocument(DocAccessibleParent* aAccessible) { 131 return GetAccService()->GetXPCDocument(aAccessible); 132 } 133 134 } // namespace a11y 135 } // namespace mozilla 136 137 #endif