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
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #ifndef mozilla_a11y_MsaaAccessible_h_
8 #define mozilla_a11y_MsaaAccessible_h_
9 
10 #include "ia2Accessible.h"
11 #include "ia2AccessibleComponent.h"
12 #include "ia2AccessibleHyperlink.h"
13 #include "ia2AccessibleValue.h"
14 #include "IUnknownImpl.h"
15 #include "mozilla/a11y/MsaaIdGenerator.h"
16 #include "mozilla/dom/ipc/IdType.h"
17 #include "nsXULAppAPI.h"
18 
19 namespace mozilla {
20 namespace a11y {
21 class Accessible;
22 class AccessibleWrap;
23 class LocalAccessible;
24 class sdnAccessible;
25 
26 class MsaaAccessible : public ia2Accessible,
27                        public ia2AccessibleComponent,
28                        public ia2AccessibleHyperlink,
29                        public ia2AccessibleValue {
30  public:
31   static MsaaAccessible* Create(Accessible* aAcc);
32 
Acc()33   Accessible* Acc() { return mAcc; }
34   AccessibleWrap* LocalAcc();
35 
GetExistingID()36   uint32_t GetExistingID() const { return mID; }
37   static const uint32_t kNoID = 0;
38   void SetID(uint32_t aID);
39 
40   static int32_t GetChildIDFor(Accessible* aAccessible);
41   static uint32_t GetContentProcessIdFor(dom::ContentParentId aIPCContentId);
42   static void ReleaseContentProcessIdFor(dom::ContentParentId aIPCContentId);
43   static void AssignChildIDTo(NotNull<sdnAccessible*> aSdnAcc);
44   static void ReleaseChildID(NotNull<sdnAccessible*> aSdnAcc);
45   static HWND GetHWNDFor(Accessible* aAccessible);
46   static void FireWinEvent(Accessible* aTarget, uint32_t aEventType);
47 
48   /**
49    * Find an accessible by the given child ID in cached documents.
50    */
51   [[nodiscard]] already_AddRefed<IAccessible> GetIAccessibleFor(
52       const VARIANT& aVarChild, bool* aIsDefunct);
53 
54   /**
55    * Associate a COM object with this MsaaAccessible so it will be disconnected
56    * from remote clients when this MsaaAccessible shuts down.
57    * This should only be called with separate COM objects with a different
58    * IUnknown to this MsaaAccessible; e.g. IAccessibleRelation.
59    */
AssociateCOMObjectForDisconnection(IUnknown * aObject)60   void AssociateCOMObjectForDisconnection(IUnknown* aObject) {
61     // We only need to track these for content processes because COM garbage
62     // collection is disabled there.
63     if (XRE_IsContentProcess()) {
64       mAssociatedCOMObjectsForDisconnection.AppendElement(aObject);
65     }
66   }
67 
68   void MsaaShutdown();
69 
70   static IDispatch* NativeAccessible(Accessible* aAccessible);
71 
72   static MsaaAccessible* GetFrom(Accessible* aAcc);
73 
74   DECL_IUNKNOWN
75 
76   // IAccessible
77   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accParent(
78       /* [retval][out] */ IDispatch __RPC_FAR* __RPC_FAR* ppdispParent)
79       override;
80   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accChildCount(
81       /* [retval][out] */ long __RPC_FAR* pcountChildren) override;
82   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accChild(
83       /* [in] */ VARIANT varChild,
84       /* [retval][out] */ IDispatch __RPC_FAR* __RPC_FAR* ppdispChild) override;
85   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accName(
86       /* [optional][in] */ VARIANT varChild,
87       /* [retval][out] */ BSTR __RPC_FAR* pszName) override;
88   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accValue(
89       /* [optional][in] */ VARIANT varChild,
90       /* [retval][out] */ BSTR __RPC_FAR* pszValue) override;
91   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accDescription(
92       /* [optional][in] */ VARIANT varChild,
93       /* [retval][out] */ BSTR __RPC_FAR* pszDescription) override;
94   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accRole(
95       /* [optional][in] */ VARIANT varChild,
96       /* [retval][out] */ VARIANT __RPC_FAR* pvarRole) override;
97   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accState(
98       /* [optional][in] */ VARIANT varChild,
99       /* [retval][out] */ VARIANT __RPC_FAR* pvarState) override;
100   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accHelp(
101       /* [optional][in] */ VARIANT varChild,
102       /* [retval][out] */ BSTR __RPC_FAR* pszHelp) override;
103   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accHelpTopic(
104       /* [out] */ BSTR __RPC_FAR* pszHelpFile,
105       /* [optional][in] */ VARIANT varChild,
106       /* [retval][out] */ long __RPC_FAR* pidTopic) override;
107   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accKeyboardShortcut(
108       /* [optional][in] */ VARIANT varChild,
109       /* [retval][out] */ BSTR __RPC_FAR* pszKeyboardShortcut) override;
110   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accFocus(
111       /* [retval][out] */ VARIANT __RPC_FAR* pvarChild) override;
112   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accSelection(
113       /* [retval][out] */ VARIANT __RPC_FAR* pvarChildren) override;
114   virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accDefaultAction(
115       /* [optional][in] */ VARIANT varChild,
116       /* [retval][out] */ BSTR __RPC_FAR* pszDefaultAction) override;
117   virtual /* [id] */ HRESULT STDMETHODCALLTYPE accSelect(
118       /* [in] */ long flagsSelect,
119       /* [optional][in] */ VARIANT varChild) override;
120   virtual /* [id] */ HRESULT STDMETHODCALLTYPE accLocation(
121       /* [out] */ long __RPC_FAR* pxLeft,
122       /* [out] */ long __RPC_FAR* pyTop,
123       /* [out] */ long __RPC_FAR* pcxWidth,
124       /* [out] */ long __RPC_FAR* pcyHeight,
125       /* [optional][in] */ VARIANT varChild) override;
126   virtual /* [id] */ HRESULT STDMETHODCALLTYPE accNavigate(
127       /* [in] */ long navDir,
128       /* [optional][in] */ VARIANT varStart,
129       /* [retval][out] */ VARIANT __RPC_FAR* pvarEndUpAt) override;
130   virtual /* [id] */ HRESULT STDMETHODCALLTYPE accHitTest(
131       /* [in] */ long xLeft,
132       /* [in] */ long yTop,
133       /* [retval][out] */ VARIANT __RPC_FAR* pvarChild) override;
134   virtual /* [id] */ HRESULT STDMETHODCALLTYPE accDoDefaultAction(
135       /* [optional][in] */ VARIANT varChild) override;
136   virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_accName(
137       /* [optional][in] */ VARIANT varChild,
138       /* [in] */ BSTR szName) override;
139   virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_accValue(
140       /* [optional][in] */ VARIANT varChild,
141       /* [in] */ BSTR szValue) override;
142 
143   // IDispatch (support of scripting languages like VB)
144   virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT* pctinfo) override;
145   virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid,
146                                                 ITypeInfo** ppTInfo) override;
147   virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
148                                                   LPOLESTR* rgszNames,
149                                                   UINT cNames, LCID lcid,
150                                                   DISPID* rgDispId) override;
151   virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid,
152                                            LCID lcid, WORD wFlags,
153                                            DISPPARAMS* pDispParams,
154                                            VARIANT* pVarResult,
155                                            EXCEPINFO* pExcepInfo,
156                                            UINT* puArgErr) override;
157 
158  protected:
159   explicit MsaaAccessible(Accessible* aAcc);
160   virtual ~MsaaAccessible();
161 
162   Accessible* mAcc;
163 
164   uint32_t mID;
165   static MsaaIdGenerator sIDGen;
166 
167   HRESULT
168   ResolveChild(const VARIANT& aVarChild, IAccessible** aOutInterface);
169 
170   enum navRelations {
171     NAVRELATION_CONTROLLED_BY = 0x1000,
172     NAVRELATION_CONTROLLER_FOR = 0x1001,
173     NAVRELATION_LABEL_FOR = 0x1002,
174     NAVRELATION_LABELLED_BY = 0x1003,
175     NAVRELATION_MEMBER_OF = 0x1004,
176     NAVRELATION_NODE_CHILD_OF = 0x1005,
177     NAVRELATION_FLOWS_TO = 0x1006,
178     NAVRELATION_FLOWS_FROM = 0x1007,
179     NAVRELATION_SUBWINDOW_OF = 0x1008,
180     NAVRELATION_EMBEDS = 0x1009,
181     NAVRELATION_EMBEDDED_BY = 0x100a,
182     NAVRELATION_POPUP_FOR = 0x100b,
183     NAVRELATION_PARENT_WINDOW_OF = 0x100c,
184     NAVRELATION_DEFAULT_BUTTON = 0x100d,
185     NAVRELATION_DESCRIBED_BY = 0x100e,
186     NAVRELATION_DESCRIPTION_FOR = 0x100f,
187     NAVRELATION_NODE_PARENT_OF = 0x1010,
188     NAVRELATION_CONTAINING_DOCUMENT = 0x1011,
189     NAVRELATION_CONTAINING_TAB_PANE = 0x1012,
190     NAVRELATION_CONTAINING_WINDOW = 0x1013,
191     NAVRELATION_CONTAINING_APPLICATION = 0x1014,
192     NAVRELATION_DETAILS = 0x1015,
193     NAVRELATION_DETAILS_FOR = 0x1016,
194     NAVRELATION_ERROR = 0x1017,
195     NAVRELATION_ERROR_FOR = 0x1018,
196     NAVRELATION_LINKS_TO = 0x1019
197   };
198 
199  private:
200   /**
201    * Find a remote accessible by the given child ID.
202    */
203   [[nodiscard]] already_AddRefed<IAccessible> GetRemoteIAccessibleFor(
204       const VARIANT& aVarChild);
205 
206   nsTArray<RefPtr<IUnknown>> mAssociatedCOMObjectsForDisconnection;
207 
208   /**
209    * Creates ITypeInfo for LIBID_Accessibility if it's needed and returns it.
210    */
211   static ITypeInfo* GetTI(LCID lcid);
212   static ITypeInfo* gTypeInfo;
213 };
214 
215 }  // namespace a11y
216 }  // namespace mozilla
217 
218 #ifdef XP_WIN
219 // Undo the windows.h damage
220 #  undef GetMessage
221 #  undef CreateEvent
222 #  undef GetClassName
223 #  undef GetBinaryType
224 #  undef RemoveDirectory
225 #endif
226 
227 #endif
228