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