1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=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 #if defined(MOZILLA_INTERNAL_API)
8 #error This code is NOT for internal Gecko use!
9 #endif  // defined(MOZILLA_INTERNAL_API)
10 
11 #include "HandlerTextLeaf.h"
12 #include "mozilla/Assertions.h"
13 
14 namespace mozilla {
15 namespace a11y {
16 
HandlerTextLeaf(IDispatch * aParent,long aIndexInParent,HWND aHwnd,AccChildData & aData)17 HandlerTextLeaf::HandlerTextLeaf(IDispatch *aParent, long aIndexInParent,
18                                  HWND aHwnd, AccChildData &aData)
19     : mParent(aParent),
20       mIndexInParent(aIndexInParent),
21       mHwnd(aHwnd),
22       mData(aData) {
23   MOZ_ASSERT(aParent);
24 }
25 
~HandlerTextLeaf()26 HandlerTextLeaf::~HandlerTextLeaf() {
27   if (mData.mText) {
28     ::SysFreeString(mData.mText);
29   }
30 }
31 
32 IMPL_IUNKNOWN_QUERY_HEAD(HandlerTextLeaf)
IMPL_IUNKNOWN_QUERY_IFACE(IDispatch)33 IMPL_IUNKNOWN_QUERY_IFACE(IDispatch)
34 IMPL_IUNKNOWN_QUERY_IFACE(IAccessible)
35 IMPL_IUNKNOWN_QUERY_IFACE(IAccessible2)
36 IMPL_IUNKNOWN_QUERY_IFACE(IServiceProvider)
37 IMPL_IUNKNOWN_QUERY_TAIL
38 
39 /*** IDispatch ***/
40 
41 HRESULT
42 HandlerTextLeaf::GetTypeInfoCount(UINT *pctinfo) { return E_NOTIMPL; }
43 
44 HRESULT
GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo ** ppTInfo)45 HandlerTextLeaf::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) {
46   return E_NOTIMPL;
47 }
48 
49 HRESULT
GetIDsOfNames(REFIID riid,LPOLESTR * rgszNames,UINT cNames,LCID lcid,DISPID * rgDispId)50 HandlerTextLeaf::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames,
51                                LCID lcid, DISPID *rgDispId) {
52   return E_NOTIMPL;
53 }
54 
55 HRESULT
Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO * pExcepInfo,UINT * puArgErr)56 HandlerTextLeaf::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
57                         WORD wFlags, DISPPARAMS *pDispParams,
58                         VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
59                         UINT *puArgErr) {
60   return E_NOTIMPL;
61 }
62 
63 /*** IAccessible ***/
64 
65 HRESULT
get_accParent(IDispatch ** ppdispParent)66 HandlerTextLeaf::get_accParent(IDispatch **ppdispParent) {
67   if (!ppdispParent) {
68     return E_INVALIDARG;
69   }
70 
71   RefPtr<IDispatch> parent(mParent);
72   parent.forget(ppdispParent);
73   return S_OK;
74 }
75 
76 HRESULT
get_accChildCount(long * pcountChildren)77 HandlerTextLeaf::get_accChildCount(long *pcountChildren) {
78   if (!pcountChildren) {
79     return E_INVALIDARG;
80   }
81 
82   *pcountChildren = 0;
83   return S_OK;
84 }
85 
86 HRESULT
get_accChild(VARIANT varChild,IDispatch ** ppdispChild)87 HandlerTextLeaf::get_accChild(VARIANT varChild, IDispatch **ppdispChild) {
88   return E_NOTIMPL;
89 }
90 
91 HRESULT
get_accName(VARIANT varChild,BSTR * pszName)92 HandlerTextLeaf::get_accName(VARIANT varChild, BSTR *pszName) {
93   if (varChild.lVal != CHILDID_SELF || !pszName) {
94     return E_INVALIDARG;
95   }
96 
97   *pszName = CopyBSTR(mData.mText);
98   return S_OK;
99 }
100 
101 HRESULT
get_accValue(VARIANT varChild,BSTR * pszValue)102 HandlerTextLeaf::get_accValue(VARIANT varChild, BSTR *pszValue) {
103   return E_NOTIMPL;
104 }
105 
106 HRESULT
get_accDescription(VARIANT varChild,BSTR * pszDescription)107 HandlerTextLeaf::get_accDescription(VARIANT varChild, BSTR *pszDescription) {
108   return E_NOTIMPL;
109 }
110 
111 HRESULT
get_accRole(VARIANT varChild,VARIANT * pvarRole)112 HandlerTextLeaf::get_accRole(VARIANT varChild, VARIANT *pvarRole) {
113   if (varChild.lVal != CHILDID_SELF || !pvarRole) {
114     return E_INVALIDARG;
115   }
116 
117   pvarRole->vt = VT_I4;
118   pvarRole->lVal = mData.mTextRole;
119   return S_OK;
120 }
121 
122 HRESULT
get_accState(VARIANT varChild,VARIANT * pvarState)123 HandlerTextLeaf::get_accState(VARIANT varChild, VARIANT *pvarState) {
124   if (varChild.lVal != CHILDID_SELF || !pvarState) {
125     return E_INVALIDARG;
126   }
127 
128   pvarState->vt = VT_I4;
129   pvarState->lVal = mData.mTextState;
130   return S_OK;
131 }
132 
133 HRESULT
get_accHelp(VARIANT varChild,BSTR * pszHelp)134 HandlerTextLeaf::get_accHelp(VARIANT varChild, BSTR *pszHelp) {
135   return E_NOTIMPL;
136 }
137 
138 HRESULT
get_accHelpTopic(BSTR * pszHelpFile,VARIANT varChild,long * pidTopic)139 HandlerTextLeaf::get_accHelpTopic(BSTR *pszHelpFile, VARIANT varChild,
140                                   long *pidTopic) {
141   return E_NOTIMPL;
142 }
143 
144 HRESULT
get_accKeyboardShortcut(VARIANT varChild,BSTR * pszKeyboardShortcut)145 HandlerTextLeaf::get_accKeyboardShortcut(VARIANT varChild,
146                                          BSTR *pszKeyboardShortcut) {
147   return E_NOTIMPL;
148 }
149 
150 HRESULT
get_accFocus(VARIANT * pvarChild)151 HandlerTextLeaf::get_accFocus(VARIANT *pvarChild) { return E_NOTIMPL; }
152 
153 HRESULT
get_accSelection(VARIANT * pvarChildren)154 HandlerTextLeaf::get_accSelection(VARIANT *pvarChildren) { return E_NOTIMPL; }
155 
156 HRESULT
get_accDefaultAction(VARIANT varChild,BSTR * pszDefaultAction)157 HandlerTextLeaf::get_accDefaultAction(VARIANT varChild,
158                                       BSTR *pszDefaultAction) {
159   return E_NOTIMPL;
160 }
161 
162 HRESULT
accSelect(long flagsSelect,VARIANT varChild)163 HandlerTextLeaf::accSelect(long flagsSelect, VARIANT varChild) {
164   return E_NOTIMPL;
165 }
166 
167 HRESULT
accLocation(long * pxLeft,long * pyTop,long * pcxWidth,long * pcyHeight,VARIANT varChild)168 HandlerTextLeaf::accLocation(long *pxLeft, long *pyTop, long *pcxWidth,
169                              long *pcyHeight, VARIANT varChild) {
170   if (varChild.lVal != CHILDID_SELF || !pxLeft || !pyTop || !pcxWidth ||
171       !pcyHeight) {
172     return E_INVALIDARG;
173   }
174 
175   *pxLeft = mData.mTextLeft;
176   *pyTop = mData.mTextTop;
177   *pcxWidth = mData.mTextWidth;
178   *pcyHeight = mData.mTextHeight;
179   return S_OK;
180 }
181 
182 HRESULT
accNavigate(long navDir,VARIANT varStart,VARIANT * pvarEndUpAt)183 HandlerTextLeaf::accNavigate(long navDir, VARIANT varStart,
184                              VARIANT *pvarEndUpAt) {
185   return E_NOTIMPL;
186 }
187 
188 HRESULT
accHitTest(long xLeft,long yTop,VARIANT * pvarChild)189 HandlerTextLeaf::accHitTest(long xLeft, long yTop, VARIANT *pvarChild) {
190   return E_NOTIMPL;
191 }
192 
193 HRESULT
accDoDefaultAction(VARIANT varChild)194 HandlerTextLeaf::accDoDefaultAction(VARIANT varChild) { return E_NOTIMPL; }
195 
196 HRESULT
put_accName(VARIANT varChild,BSTR szName)197 HandlerTextLeaf::put_accName(VARIANT varChild, BSTR szName) {
198   return E_NOTIMPL;
199 }
200 
201 HRESULT
put_accValue(VARIANT varChild,BSTR szValue)202 HandlerTextLeaf::put_accValue(VARIANT varChild, BSTR szValue) {
203   return E_NOTIMPL;
204 }
205 
206 /*** IAccessible2 ***/
207 
208 HRESULT
get_nRelations(long * nRelations)209 HandlerTextLeaf::get_nRelations(long *nRelations) { return E_NOTIMPL; }
210 
211 HRESULT
get_relation(long relationIndex,IAccessibleRelation ** relation)212 HandlerTextLeaf::get_relation(long relationIndex,
213                               IAccessibleRelation **relation) {
214   return E_NOTIMPL;
215 }
216 
217 HRESULT
get_relations(long maxRelations,IAccessibleRelation ** relations,long * nRelations)218 HandlerTextLeaf::get_relations(long maxRelations,
219                                IAccessibleRelation **relations,
220                                long *nRelations) {
221   return E_NOTIMPL;
222 }
223 
224 HRESULT
role(long * role)225 HandlerTextLeaf::role(long *role) {
226   if (!role) {
227     return E_INVALIDARG;
228   }
229 
230   *role = mData.mTextRole;
231   return S_OK;
232 }
233 
234 HRESULT
scrollTo(IA2ScrollType scrollType)235 HandlerTextLeaf::scrollTo(IA2ScrollType scrollType) { return E_NOTIMPL; }
236 
237 HRESULT
scrollToPoint(IA2CoordinateType coordinateType,long x,long y)238 HandlerTextLeaf::scrollToPoint(IA2CoordinateType coordinateType, long x,
239                                long y) {
240   return E_NOTIMPL;
241 }
242 
243 HRESULT
get_groupPosition(long * groupLevel,long * similarItemsInGroup,long * positionInGroup)244 HandlerTextLeaf::get_groupPosition(long *groupLevel, long *similarItemsInGroup,
245                                    long *positionInGroup) {
246   return E_NOTIMPL;
247 }
248 
249 HRESULT
get_states(AccessibleStates * states)250 HandlerTextLeaf::get_states(AccessibleStates *states) {
251   if (!states) {
252     return E_INVALIDARG;
253   }
254 
255   *states = 0;
256   return S_OK;
257 }
258 
259 HRESULT
get_extendedRole(BSTR * extendedRole)260 HandlerTextLeaf::get_extendedRole(BSTR *extendedRole) { return E_NOTIMPL; }
261 
262 HRESULT
get_localizedExtendedRole(BSTR * localizedExtendedRole)263 HandlerTextLeaf::get_localizedExtendedRole(BSTR *localizedExtendedRole) {
264   return E_NOTIMPL;
265 }
266 
267 HRESULT
get_nExtendedStates(long * nExtendedStates)268 HandlerTextLeaf::get_nExtendedStates(long *nExtendedStates) {
269   return E_NOTIMPL;
270 }
271 
272 HRESULT
get_extendedStates(long maxExtendedStates,BSTR ** extendedStates,long * nExtendedStates)273 HandlerTextLeaf::get_extendedStates(long maxExtendedStates,
274                                     BSTR **extendedStates,
275                                     long *nExtendedStates) {
276   return E_NOTIMPL;
277 }
278 
279 HRESULT
get_localizedExtendedStates(long maxLocalizedExtendedStates,BSTR ** localizedExtendedStates,long * nLocalizedExtendedStates)280 HandlerTextLeaf::get_localizedExtendedStates(long maxLocalizedExtendedStates,
281                                              BSTR **localizedExtendedStates,
282                                              long *nLocalizedExtendedStates) {
283   return E_NOTIMPL;
284 }
285 
286 HRESULT
get_uniqueID(long * uniqueID)287 HandlerTextLeaf::get_uniqueID(long *uniqueID) {
288   if (!uniqueID) {
289     return E_INVALIDARG;
290   }
291 
292   *uniqueID = mData.mTextId;
293   return S_OK;
294 }
295 
296 HRESULT
get_windowHandle(HWND * windowHandle)297 HandlerTextLeaf::get_windowHandle(HWND *windowHandle) {
298   if (!windowHandle) {
299     return E_INVALIDARG;
300   }
301 
302   *windowHandle = mHwnd;
303   return S_OK;
304 }
305 
306 HRESULT
get_indexInParent(long * indexInParent)307 HandlerTextLeaf::get_indexInParent(long *indexInParent) {
308   if (!indexInParent) {
309     return E_INVALIDARG;
310   }
311 
312   *indexInParent = mIndexInParent;
313   return S_OK;
314 }
315 
316 HRESULT
get_locale(IA2Locale * locale)317 HandlerTextLeaf::get_locale(IA2Locale *locale) { return E_NOTIMPL; }
318 
319 HRESULT
get_attributes(BSTR * attributes)320 HandlerTextLeaf::get_attributes(BSTR *attributes) { return E_NOTIMPL; }
321 
322 /*** IServiceProvider ***/
323 
324 HRESULT
QueryService(REFGUID aServiceId,REFIID aIid,void ** aOutInterface)325 HandlerTextLeaf::QueryService(REFGUID aServiceId, REFIID aIid,
326                               void **aOutInterface) {
327   if (aIid == IID_IAccessible2) {
328     RefPtr<IAccessible2> ia2(this);
329     ia2.forget(aOutInterface);
330     return S_OK;
331   }
332 
333   return E_INVALIDARG;
334 }
335 
336 }  // namespace a11y
337 }  // namespace mozilla
338