1 /*
2  * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 /*
27  * A class to manage JNI calls into AccessBridge.java
28  */
29 
30 #include "AccessBridgePackages.h"
31 
32 #include <windows.h>
33 #include <jni.h>
34 
35 #ifndef __AccessBridgeJavaEntryPoints_H__
36 #define __AccessBridgeJavaEntryPoints_H__
37 
38 class AccessBridgeJavaEntryPoints {
39     JNIEnv *jniEnv;
40 
41     jobject accessBridgeObject;
42 
43     jclass bridgeClass;
44     jclass eventHandlerClass;
45 
46     jmethodID decrementReferenceMethod;
47     jmethodID getJavaVersionPropertyMethod;
48     jmethodID getAccessBridgeVersionMethod;
49 
50     jmethodID isJavaWindowMethod;
51     jmethodID isSameObjectMethod;
52     jmethodID getAccessibleContextFromHWNDMethod;
53     jmethodID getHWNDFromAccessibleContextMethod;
54 
55     jmethodID getAccessibleContextAtMethod;
56     jmethodID getAccessibleContextWithFocusMethod;
57 
58     jmethodID getAccessibleNameFromContextMethod;
59     jmethodID getAccessibleDescriptionFromContextMethod;
60     jmethodID getAccessibleRoleStringFromContextMethod;
61     jmethodID getAccessibleRoleStringFromContext_en_USMethod;
62     jmethodID getAccessibleStatesStringFromContextMethod;
63     jmethodID getAccessibleStatesStringFromContext_en_USMethod;
64     jmethodID getAccessibleParentFromContextMethod;
65     jmethodID getAccessibleIndexInParentFromContextMethod;
66     jmethodID getAccessibleChildrenCountFromContextMethod;
67     jmethodID getAccessibleChildFromContextMethod;
68     jmethodID getAccessibleBoundsOnScreenFromContextMethod;
69     jmethodID getAccessibleXcoordFromContextMethod;
70     jmethodID getAccessibleYcoordFromContextMethod;
71     jmethodID getAccessibleHeightFromContextMethod;
72     jmethodID getAccessibleWidthFromContextMethod;
73 
74     jmethodID getAccessibleComponentFromContextMethod;
75     jmethodID getAccessibleActionFromContextMethod;
76     jmethodID getAccessibleSelectionFromContextMethod;
77     jmethodID getAccessibleTextFromContextMethod;
78     jmethodID getAccessibleValueFromContextMethod;
79 
80     /* begin AccessibleTable */
81     jmethodID getAccessibleTableFromContextMethod;
82     jmethodID getAccessibleTableRowHeaderMethod;
83     jmethodID getAccessibleTableColumnHeaderMethod;
84     jmethodID getAccessibleTableRowCountMethod;
85     jmethodID getAccessibleTableColumnCountMethod;
86     jmethodID getAccessibleTableCaptionMethod;
87     jmethodID getAccessibleTableSummaryMethod;
88 
89     jmethodID getContextFromAccessibleTableMethod;
90     jmethodID getAccessibleTableCellAccessibleContextMethod;
91     jmethodID getAccessibleTableCellIndexMethod;
92     jmethodID getAccessibleTableCellRowExtentMethod;
93     jmethodID getAccessibleTableCellColumnExtentMethod;
94     jmethodID isAccessibleTableCellSelectedMethod;
95 
96     jmethodID getAccessibleTableRowHeaderRowCountMethod;
97     jmethodID getAccessibleTableColumnHeaderRowCountMethod;
98 
99     jmethodID getAccessibleTableRowHeaderColumnCountMethod;
100     jmethodID getAccessibleTableColumnHeaderColumnCountMethod;
101 
102     jmethodID getAccessibleTableRowDescriptionMethod;
103     jmethodID getAccessibleTableColumnDescriptionMethod;
104 
105     jmethodID getAccessibleTableRowSelectionCountMethod;
106     jmethodID isAccessibleTableRowSelectedMethod;
107     jmethodID getAccessibleTableRowSelectionsMethod;
108 
109     jmethodID getAccessibleTableColumnSelectionCountMethod;
110     jmethodID isAccessibleTableColumnSelectedMethod;
111     jmethodID getAccessibleTableColumnSelectionsMethod;
112 
113     jmethodID getAccessibleTableRowMethod;
114     jmethodID getAccessibleTableColumnMethod;
115     jmethodID getAccessibleTableIndexMethod;
116 
117     /* end AccessibleTable */
118 
119     /* begin AccessibleRelationSet */
120 
121     jmethodID getAccessibleRelationSetMethod;
122     jmethodID getAccessibleRelationCountMethod;
123     jmethodID getAccessibleRelationKeyMethod;
124     jmethodID getAccessibleRelationTargetCountMethod;
125     jmethodID getAccessibleRelationTargetMethod;
126 
127     /* end AccessibleRelationSet */
128 
129     // AccessibleHypertext methods
130     jmethodID getAccessibleHypertextMethod;
131     jmethodID getAccessibleHyperlinkCountMethod;
132     jmethodID getAccessibleHyperlinkTextMethod;
133     jmethodID getAccessibleHyperlinkURLMethod;
134     jmethodID getAccessibleHyperlinkStartIndexMethod;
135     jmethodID getAccessibleHyperlinkEndIndexMethod;
136     jmethodID getAccessibleHypertextLinkIndexMethod;
137     jmethodID getAccessibleHyperlinkMethod;
138     jmethodID activateAccessibleHyperlinkMethod;
139 
140     // AccessibleKeyBinding
141     jmethodID getAccessibleKeyBindingsCountMethod;
142     jmethodID getAccessibleKeyBindingCharMethod;
143     jmethodID getAccessibleKeyBindingModifiersMethod;
144 
145     // AccessibleIcon
146     jmethodID getAccessibleIconsCountMethod;
147     jmethodID getAccessibleIconDescriptionMethod;
148     jmethodID getAccessibleIconHeightMethod;
149     jmethodID getAccessibleIconWidthMethod;
150 
151     // AccessibleAction
152     jmethodID getAccessibleActionsCountMethod;
153     jmethodID getAccessibleActionNameMethod;
154     jmethodID doAccessibleActionsMethod;
155 
156     // AccessibleText
157     jmethodID getAccessibleCharCountFromContextMethod;
158     jmethodID getAccessibleCaretPositionFromContextMethod;
159     jmethodID getAccessibleIndexAtPointFromContextMethod;
160 
161     jmethodID getAccessibleLetterAtIndexFromContextMethod;
162     jmethodID getAccessibleWordAtIndexFromContextMethod;
163     jmethodID getAccessibleSentenceAtIndexFromContextMethod;
164 
165     jmethodID getAccessibleTextSelectionStartFromContextMethod;
166     jmethodID getAccessibleTextSelectionEndFromContextMethod;
167     jmethodID getAccessibleTextSelectedTextFromContextMethod;
168     jmethodID getAccessibleAttributesAtIndexFromContextMethod;
169     jmethodID getAccessibleAttributeSetAtIndexFromContextMethod;
170     jmethodID getAccessibleTextRectAtIndexFromContextMethod;
171     jmethodID getAccessibleXcoordTextRectAtIndexFromContextMethod;
172     jmethodID getAccessibleYcoordTextRectAtIndexFromContextMethod;
173     jmethodID getAccessibleHeightTextRectAtIndexFromContextMethod;
174     jmethodID getAccessibleWidthTextRectAtIndexFromContextMethod;
175     jmethodID getAccessibleTextLineLeftBoundsFromContextMethod;
176     jmethodID getAccessibleTextLineRightBoundsFromContextMethod;
177     jmethodID getAccessibleTextRangeFromContextMethod;
178 
179     jmethodID getCurrentAccessibleValueFromContextMethod;
180     jmethodID getMaximumAccessibleValueFromContextMethod;
181     jmethodID getMinimumAccessibleValueFromContextMethod;
182 
183     jmethodID addAccessibleSelectionFromContextMethod;
184     jmethodID clearAccessibleSelectionFromContextMethod;
185     jmethodID getAccessibleSelectionContextFromContextMethod;
186     jmethodID getAccessibleSelectionCountFromContextMethod;
187     jmethodID isAccessibleChildSelectedFromContextMethod;
188     jmethodID removeAccessibleSelectionFromContextMethod;
189     jmethodID selectAllAccessibleSelectionFromContextMethod;
190 
191     jmethodID addJavaEventNotificationMethod;
192     jmethodID removeJavaEventNotificationMethod;
193     jmethodID addAccessibilityEventNotificationMethod;
194     jmethodID removeAccessibilityEventNotificationMethod;
195 
196     jmethodID getBoldFromAttributeSetMethod;
197     jmethodID getItalicFromAttributeSetMethod;
198     jmethodID getUnderlineFromAttributeSetMethod;
199     jmethodID getStrikethroughFromAttributeSetMethod;
200     jmethodID getSuperscriptFromAttributeSetMethod;
201     jmethodID getSubscriptFromAttributeSetMethod;
202     jmethodID getBackgroundColorFromAttributeSetMethod;
203     jmethodID getForegroundColorFromAttributeSetMethod;
204     jmethodID getFontFamilyFromAttributeSetMethod;
205     jmethodID getFontSizeFromAttributeSetMethod;
206     jmethodID getAlignmentFromAttributeSetMethod;
207     jmethodID getBidiLevelFromAttributeSetMethod;
208     jmethodID getFirstLineIndentFromAttributeSetMethod;
209     jmethodID getLeftIndentFromAttributeSetMethod;
210     jmethodID getRightIndentFromAttributeSetMethod;
211     jmethodID getLineSpacingFromAttributeSetMethod;
212     jmethodID getSpaceAboveFromAttributeSetMethod;
213     jmethodID getSpaceBelowFromAttributeSetMethod;
214 
215     jmethodID setTextContentsMethod;
216     jmethodID getParentWithRoleMethod;
217     jmethodID getTopLevelObjectMethod;
218     jmethodID getParentWithRoleElseRootMethod;
219     jmethodID getObjectDepthMethod;
220     jmethodID getActiveDescendentMethod;
221 
222     /**
223      * Additional methods for Teton
224      */
225     jmethodID getVirtualAccessibleNameFromContextMethod; // Ben Key
226     jmethodID requestFocusMethod;
227     jmethodID selectTextRangeMethod;
228     jmethodID getTextAttributesInRangeMethod;
229     jmethodID getVisibleChildrenCountMethod;
230     jmethodID getVisibleChildMethod;
231     jmethodID setCaretPositionMethod;
232 
233     jmethodID getCaretLocationMethod;
234     jmethodID getCaretLocationXMethod;
235     jmethodID getCaretLocationYMethod;
236     jmethodID getCaretLocationHeightMethod;
237     jmethodID getCaretLocationWidthMethod;
238 
239 public:
240     AccessBridgeJavaEntryPoints(JNIEnv *jniEnvironment, jobject bridgeObject);
241     ~AccessBridgeJavaEntryPoints();
242     BOOL BuildJavaEntryPoints();
243 
244     // HWND management methods
245     BOOL isJavaWindow(jint window);
246     jobject getAccessibleContextFromHWND(jint window);
247     HWND getHWNDFromAccessibleContext(jobject accessibleContext);
248 
249     // version methods
250     BOOL getVersionInfo(AccessBridgeVersionInfo *info);
251 
252     // verification methods
253     BOOL verifyAccessibleText(jobject obj);
254 
255     /* ===== utility methods ===== */
256     BOOL isSameObject(jobject obj1, jobject obj2);
257     BOOL setTextContents(const jobject accessibleContext, const wchar_t *text);
258     jobject getParentWithRole (const jobject accessibleContext, const wchar_t *role);
259     jobject getTopLevelObject (const jobject accessibleContext);
260     jobject getParentWithRoleElseRoot (const jobject accessibleContext, const wchar_t *role);
261     jint getObjectDepth (const jobject accessibleContext);
262     jobject getActiveDescendent (const jobject accessibleContext);
263 
264     // Accessible Context methods
265     jobject getAccessibleContextAt(jint x, jint y, jobject AccessibleContext);
266     jobject getAccessibleContextWithFocus();
267     BOOL getAccessibleContextInfo(jobject AccessibleContext, AccessibleContextInfo *info);
268     jobject getAccessibleChildFromContext(jobject AccessibleContext, jint childIndex);
269     jobject getAccessibleParentFromContext(jobject AccessibleContext);
270 
271     /* begin AccessibleTable methods */
272 
273     BOOL getAccessibleTableInfo(jobject acParent, AccessibleTableInfo *tableInfo);
274     BOOL getAccessibleTableCellInfo(jobject accessibleTable,jint row, jint column,
275                                     AccessibleTableCellInfo *tableCellInfo);
276 
277     BOOL getAccessibleTableRowHeader(jobject acParent, AccessibleTableInfo *tableInfo);
278     BOOL getAccessibleTableColumnHeader(jobject acParent, AccessibleTableInfo *tableInfo);
279 
280     jobject getAccessibleTableRowDescription(jobject acParent, jint row);
281     jobject getAccessibleTableColumnDescription(jobject acParent, jint column);
282 
283     jint getAccessibleTableRowSelectionCount(jobject accessibleTable);
284     BOOL isAccessibleTableRowSelected(jobject accessibleTable, jint row);
285     BOOL getAccessibleTableRowSelections(jobject accessibleTable, jint count, jint *selections);
286 
287     jint getAccessibleTableColumnSelectionCount(jobject accessibleTable);
288     BOOL isAccessibleTableColumnSelected(jobject accessibleTable, jint column);
289     BOOL getAccessibleTableColumnSelections(jobject accessibleTable, jint count, jint *selections);
290 
291     jint getAccessibleTableRow(jobject accessibleTable, jint index);
292     jint getAccessibleTableColumn(jobject accessibleTable, jint index);
293     jint getAccessibleTableIndex(jobject accessibleTable, jint row, jint column);
294 
295     /* end AccessibleTable methods */
296 
297     BOOL getAccessibleRelationSet(jobject accessibleContext, AccessibleRelationSetInfo *relationSetInfo);
298 
299     // AccessibleHypertext methods
300     BOOL getAccessibleHypertext(jobject accessibleContext, AccessibleHypertextInfo *hyperlink);
301 
302     BOOL activateAccessibleHyperlink(jobject accessibleContext, jobject accessibleHyperlink);
303 
304     BOOL getAccessibleHypertextExt(const jobject accessibleContext,
305                                    const jint nStartIndex,
306                                    /* OUT */ AccessibleHypertextInfo *hypertext);
307     jint getAccessibleHyperlinkCount(const jobject accessibleContext);
308     jint getAccessibleHypertextLinkIndex(const jobject accessibleContext,
309                                          const jint nIndex);
310     BOOL getAccessibleHyperlink(const jobject accessibleContext,
311                                 const jint nIndex,
312                                 /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
313 
314     // Accessible Keybinding methods
315     BOOL getAccessibleKeyBindings(jobject accessibleContext, AccessibleKeyBindings *keyBindings);
316 
317     // AccessibleIcon methods
318     BOOL getAccessibleIcons(jobject accessibleContext, AccessibleIcons *icons);
319 
320     // AccessibleActionMethods
321     BOOL getAccessibleActions(jobject accessibleContext, AccessibleActions *actions);
322     BOOL doAccessibleActions(jobject accessibleContext, AccessibleActionsToDo *actionsToDo, jint *failure);
323 
324     // Accessible Text methods
325     BOOL getAccessibleTextInfo(jobject AccessibleContext, AccessibleTextInfo *textInfo, jint x, jint y);
326     BOOL getAccessibleTextItems(jobject AccessibleContext, AccessibleTextItemsInfo *textItems, jint index);
327     BOOL getAccessibleTextSelectionInfo(jobject AccessibleContext, AccessibleTextSelectionInfo *selectionInfo);
328     BOOL getAccessibleTextAttributes(jobject AccessibleContext, jint index, AccessibleTextAttributesInfo *attributes);
329     BOOL getAccessibleTextRect(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
330     BOOL getAccessibleCaretRect(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
331     BOOL getAccessibleTextLineBounds(jobject AccessibleContext, jint index, jint *startIndex, jint *endIndex);
332     BOOL getAccessibleTextRange(jobject AccessibleContext, jint start, jint end, wchar_t *text, short len);
333 
334     // Accessible Value methods
335     BOOL getCurrentAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len);
336     BOOL getMaximumAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len);
337     BOOL getMinimumAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len);
338 
339     // Accessible Selection methods
340     void addAccessibleSelectionFromContext(jobject AccessibleContext, int i);
341     void clearAccessibleSelectionFromContext(jobject AccessibleContext);
342     jobject getAccessibleSelectionFromContext(jobject AccessibleContext, int i);
343     int getAccessibleSelectionCountFromContext(jobject AccessibleContext);
344     BOOL isAccessibleChildSelectedFromContext(jobject AccessibleContext, int i);
345     void removeAccessibleSelectionFromContext(jobject AccessibleContext, int i);
346     void selectAllAccessibleSelectionFromContext(jobject AccessibleContext);
347 
348     // Event handling methods
349     BOOL addJavaEventNotification(jlong type);
350     BOOL removeJavaEventNotification(jlong type);
351     BOOL addAccessibilityEventNotification(jlong type);
352     BOOL removeAccessibilityEventNotification(jlong type);
353 
354     /**
355      * Additional methods for Teton
356      */
357 
358     /**
359      * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
360      * whether successful.
361      *
362      * Bug ID 4916682 - Implement JAWS AccessibleName policy
363      */
364     BOOL getVirtualAccessibleName(const jobject accessibleContext, wchar_t *name, int len);
365 
366     /**
367      * Request focus for a component. Returns whether successful;
368      *
369      * Bug ID 4944757 - requestFocus method needed
370      */
371     BOOL requestFocus(const jobject accessibleContext);
372 
373     /**
374      * Selects text between two indices.  Selection includes the text at the start index
375      * and the text at the end index. Returns whether successful;
376      *
377      * Bug ID 4944758 - selectTextRange method needed
378      */
379     BOOL selectTextRange(const jobject accessibleContext, int startIndex, int endIndex);
380 
381     /**
382      * Get text attributes between two indices.  The attribute list includes the text at the
383      * start index and the text at the end index. Returns whether successful;
384      *
385      * Bug ID 4944761 - getTextAttributes between two indices method needed
386      */
387     BOOL getTextAttributesInRange(const jobject accessibleContext, int startIndex, int endIndex,
388                                   AccessibleTextAttributesInfo *attributes, short *len);
389 
390     /**
391      * Gets the number of visible children of a component. Returns -1 on error.
392      *
393      * Bug ID 4944762- getVisibleChildren for list-like components needed
394      */
395     int getVisibleChildrenCount(const jobject accessibleContext);
396 
397     /**
398      * Gets the visible children of an AccessibleContext. Returns whether successful;
399      *
400      * Bug ID 4944762- getVisibleChildren for list-like components needed
401      */
402     BOOL getVisibleChildren(const jobject accessibleContext, const int startIndex,
403                             VisibleChildrenInfo *visibleChildrenInfo);
404 
405     /**
406      * Set the caret to a text position. Returns whether successful;
407      *
408      * Bug ID 4944770 - setCaretPosition method needed
409      */
410     BOOL setCaretPosition(const jobject accessibleContext, int position);
411 
412     /**
413      * Gets the bounding rectangle for the text caret
414      */
415     BOOL getCaretLocation(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
416 
417 };
418 
419 #endif
420