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