1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef NAPI_ACCESSIBILITY_ELEMENT_H
17 #define NAPI_ACCESSIBILITY_ELEMENT_H
18 
19 #include "accessibility_def.h"
20 #include "accessibility_event_info.h"
21 #include "accessibility_window_info.h"
22 #include "napi/native_api.h"
23 #include "napi/native_node_api.h"
24 
25 struct AccessibilityElement {
26     AccessibilityElement() = default;
AccessibilityElementAccessibilityElement27     AccessibilityElement(std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo> elementInfo)
28         : elementInfo_(elementInfo), isElementInfo_(true)
29     {}
AccessibilityElementAccessibilityElement30     AccessibilityElement(std::shared_ptr<OHOS::Accessibility::AccessibilityWindowInfo> windowInfo)
31         : windowInfo_(windowInfo), isElementInfo_(false)
32     {}
33 
34     std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo> elementInfo_ = nullptr;
35     std::shared_ptr<OHOS::Accessibility::AccessibilityWindowInfo> windowInfo_ = nullptr;
36     bool isElementInfo_ = true;
37 };
38 
39 enum FindElementCondition {
40     FIND_ELEMENT_CONDITION_CONTENT,
41     FIND_ELEMENT_CONDITION_FOCUS_TYPE,
42     FIND_ELEMENT_CONDITION_TEXT_TYPE,
43     FIND_ELEMENT_CONDITION_FOCUS_DIRECTION,
44     FIND_ELEMENT_CONDITION_ELEMENT_ID,
45     FIND_ELEMENT_CONDITION_INVALID
46 };
47 
48 struct NAccessibilityElementData {
49     napi_async_work work_ {};
50     napi_deferred deferred_ {};
51     napi_env env_ {};
52     napi_ref callback_ {};
53     AccessibilityElement accessibilityElement_ = {};
54     std::map<std::string, std::string> actionArguments_;
55     std::vector<OHOS::Accessibility::AccessibilityElementInfo> nodeInfos_ {};
56     OHOS::Accessibility::AccessibilityElementInfo nodeInfo_ {};
57     FindElementCondition conditionId_ = FIND_ELEMENT_CONDITION_INVALID;
58     std::string attribute_ = "";
59     std::string actionName_ = "";
60     std::string condition_ = "";
61     int32_t cursorPosition_ = 0;
62     OHOS::Accessibility::RetError ret_ = OHOS::Accessibility::RetError::RET_ERR_FAILED;
63 };
64 
65 class NAccessibilityElement {
66 public:
67     static void DefineJSAccessibilityElement(napi_env env);
68     static napi_value JSConstructor(napi_env env, napi_callback_info info);
69 
70     static void ConvertElementInfoToJS(napi_env env, napi_value result,
71         const OHOS::Accessibility::AccessibilityElementInfo& elementInfo);
72     static void ConvertElementInfosToJS(napi_env env, napi_value result,
73         const std::vector<OHOS::Accessibility::AccessibilityElementInfo>& elementInfos);
74 
75     static napi_value AttributeNames(napi_env env, napi_callback_info info);
76     static napi_value AttributeValue(napi_env env, napi_callback_info info);
77     static napi_value ActionNames(napi_env env, napi_callback_info info);
78     static napi_value PerformAction(napi_env env, napi_callback_info info);
79     static napi_value EnableScreenCurtain(napi_env env, napi_callback_info info);
80     static napi_value FindElement(napi_env env, napi_callback_info info);
81     static napi_value ErrorOperation(NAccessibilityElementData *callbackInfo);
82     static napi_value GetCursorPosition(napi_env env, napi_callback_info info);
83 
84     // Element info
85     static void GetElementInfoComponentId(NAccessibilityElementData *callbackInfo, napi_value &value);
86     static void GetElementInfoPageId(NAccessibilityElementData *callbackInfo, napi_value &value);
87     static void GetElementInfoInspectorKey(NAccessibilityElementData *callbackInfo, napi_value &value);
88     static void GetElementInfoBundleName(NAccessibilityElementData *callbackInfo, napi_value &value);
89     static void GetElementInfoComponentType(NAccessibilityElementData *callbackInfo, napi_value &value);
90     static void GetElementInfoInputType(NAccessibilityElementData *callbackInfo, napi_value &value);
91     static void GetElementInfoText(NAccessibilityElementData *callbackInfo, napi_value &value);
92     static void GetElementInfoHintText(NAccessibilityElementData *callbackInfo, napi_value &value);
93     static void GetElementInfoDescription(NAccessibilityElementData *callbackInfo, napi_value &value);
94     static void GetElementInfoResourceName(NAccessibilityElementData *callbackInfo, napi_value &value);
95     static void GetElementInfoTextLengthLimit(NAccessibilityElementData *callbackInfo, napi_value &value);
96     static void GetElementInfoRect(NAccessibilityElementData *callbackInfo, napi_value &value);
97     static void GetElementInfoCheckable(NAccessibilityElementData *callbackInfo, napi_value &value);
98     static void GetElementInfoChecked(NAccessibilityElementData *callbackInfo, napi_value &value);
99     static void GetElementInfoFocusable(NAccessibilityElementData *callbackInfo, napi_value &value);
100     static void GetElementInfoIsVisible(NAccessibilityElementData *callbackInfo, napi_value &value);
101     static void GetElementInfoAccessibilityFocused(NAccessibilityElementData *callbackInfo, napi_value &value);
102     static void GetElementInfoSelected(NAccessibilityElementData *callbackInfo, napi_value &value);
103     static void GetElementInfoClickable(NAccessibilityElementData *callbackInfo, napi_value &value);
104     static void GetElementInfoLongClickable(NAccessibilityElementData *callbackInfo, napi_value &value);
105     static void GetElementInfoIsEnable(NAccessibilityElementData *callbackInfo, napi_value &value);
106     static void GetElementInfoIsPassword(NAccessibilityElementData *callbackInfo, napi_value &value);
107     static void GetElementInfoScrollable(NAccessibilityElementData *callbackInfo, napi_value &value);
108     static void GetElementInfoEditable(NAccessibilityElementData *callbackInfo, napi_value &value);
109     static void GetElementInfoPluralLineSupported(NAccessibilityElementData *callbackInfo, napi_value &value);
110     static void GetElementInfoIsHint(NAccessibilityElementData *callbackInfo, napi_value &value);
111     static void GetElementInfoItemCount(NAccessibilityElementData *callbackInfo, napi_value &value);
112     static void GetElementInfoCurrentIndex(NAccessibilityElementData *callbackInfo, napi_value &value);
113     static void GetElementInfoStartIndex(NAccessibilityElementData *callbackInfo, napi_value &value);
114     static void GetElementInfoEndIndex(NAccessibilityElementData *callbackInfo, napi_value &value);
115     static void GetElementInfoError(NAccessibilityElementData *callbackInfo, napi_value &value);
116     static void GetElementInfoTextMoveUnit(NAccessibilityElementData *callbackInfo, napi_value &value);
117     static void GetElementInfoParent(NAccessibilityElementData *callbackInfo, napi_value &value);
118     static void GetElementInfoChildren(NAccessibilityElementData *callbackInfo, napi_value &value);
119     static void GetElementInfoTriggerAction(NAccessibilityElementData *callbackInfo, napi_value &value);
120     static void GetElementInfoContents(NAccessibilityElementData *callbackInfo, napi_value &value);
121     static void GetElementInfoLastContent(NAccessibilityElementData *callbackInfo, napi_value &value);
122     static void GetElementInfoWindowId(NAccessibilityElementData *callbackInfo, napi_value &value);
123     static void GetElementInfoIsFocused(NAccessibilityElementData *callbackInfo, napi_value &value);
124     static void GetElementInfoValueMax(NAccessibilityElementData *callbackInfo, napi_value &value);
125     static void GetElementInfoValueMin(NAccessibilityElementData *callbackInfo, napi_value &value);
126     static void GetElementInfoValueNow(NAccessibilityElementData *callbackInfo, napi_value &value);
127     static void GetElementInfoAccessibilityText(NAccessibilityElementData *callbackInfo, napi_value &value);
128     static void GetElementInfoTextType(NAccessibilityElementData *callbackInfo, napi_value &value);
129     static void GetElementInfoOffset(NAccessibilityElementData *callbackInfo, napi_value &value);
130     static void GetElementInfoGridItem(NAccessibilityElementData *callbackInfo, napi_value &value);
131     static void GetElementInfoCheckboxGroup(NAccessibilityElementData *callbackInfo, napi_value &value);
132     static void GetElementInfoRow(NAccessibilityElementData *callbackInfo, napi_value &value);
133     static void GetElementInfoColumn(NAccessibilityElementData *callbackInfo, napi_value &value);
134     static void GetElementInfoSideBarContainer(NAccessibilityElementData *callbackInfo, napi_value &value);
135     static void GetElementInfoListItemIndex(NAccessibilityElementData *callbackInfo, napi_value &value);
136     static void GetElementInfoAllAttribute(NAccessibilityElementData *callbackInfo, napi_value &value);
137     static void GetElementInfoAccessibilityGroup(NAccessibilityElementData *callbackInfo, napi_value &value);
138     static void GetElementInfoAccessibilityLevel(NAccessibilityElementData *callbackInfo, napi_value &value);
139     static void GetElementInfoNavDestinationId(NAccessibilityElementData *callbackInfo, napi_value &value);
140     static void GetElementInfoSpan(NAccessibilityElementData *callbackInfo, napi_value &value);
141     static void GetElementInfoIsActive(NAccessibilityElementData *callbackInfo, napi_value &value);
142     static void GetElementInfoAccessibilityVisible(NAccessibilityElementData *callbackInfo, napi_value &value);
143     static void GetElementInfoMainWindowId(NAccessibilityElementData *callbackInfo, napi_value &value);
144 
145     // Window info
146     static void GetWindowInfoIsActive(NAccessibilityElementData *callbackInfo, napi_value &value);
147     static void GetWindowInfoScreenRect(NAccessibilityElementData *callbackInfo, napi_value &value);
148     static void GetWindowInfoLayer(NAccessibilityElementData *callbackInfo, napi_value &value);
149     static void GetWindowInfoType(NAccessibilityElementData *callbackInfo, napi_value &value);
150     static void GetWindowInfoRootElement(NAccessibilityElementData *callbackInfo, napi_value &value);
151     static void GetWindowInfoIsFocused(NAccessibilityElementData *callbackInfo, napi_value &value);
152     static void GetWindowInfoWindowId(NAccessibilityElementData *callbackInfo, napi_value &value);
153     static void GetWindowInfoMainWindowId(NAccessibilityElementData *callbackInfo, napi_value &value);
154 
155     static napi_ref consRef_;
156 private:
157     static void AttributeNamesComplete(napi_env env, napi_status status, void* data);
158     static void AttributeValueExecute(napi_env env, void* data);
159     static void AttributeValueComplete(napi_env env, napi_status status, void* data);
160     static void ActionNamesComplete(napi_env env, napi_status status, void* data);
161     static void PerformActionExecute(napi_env env, void* data);
162     static void PerformActionComplete(napi_env env, napi_status status, void* data);
163     static void FindElementConstructCallbackInfo(napi_env env, size_t argc, napi_value* argv,
164         NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement);
165     static void FindElementExecute(napi_env env, void* data);
166     static void FindElementComplete(napi_env env, napi_status status, void* data);
167     static void FindElementByText(NAccessibilityElementData *callbackInfo);
168     static void GetElement(NAccessibilityElementData *callbackInfo, napi_value &value);
169     static napi_value PerformActionAsync(napi_env env, size_t argc, napi_value* argv,
170         std::string actionName, AccessibilityElement* accessibilityElement);
171     static napi_value PerformActionConstructPromise(napi_env env, size_t argc, napi_value* argv,
172         NAccessibilityElementData* callbackInfo, std::string actionName);
173     static napi_value FindElementAsync(napi_env env, size_t argc, napi_value* argv,
174         NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement);
175     static NAccessibilityErrorCode GetAttribute(napi_env env, size_t argc, napi_value* argv,
176         NAccessibilityElementData* callbackInfo);
177     static napi_value AttributeValueAsync(napi_env env, size_t argc, napi_value* argv,
178         NAccessibilityElementData* callbackInfo);
179     static FindElementCondition ConvertStringToCondition(const std::string &str);
180     static OHOS::Accessibility::FocusMoveDirection ConvertStringToDirection(const std::string &str);
181     static int32_t ConvertStringToFocusType(const std::string &str);
182     static napi_value GetCursorPositionAsync(napi_env env, size_t argc, napi_value* argv,
183         NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement);
184     static void GetCursorPositionExecute(napi_env env, void* data);
185     static void GetCursorPositionComplete(napi_env env, napi_status status, void* data);
186     static AccessibilityElement* UnrapAccessibilityElement(napi_env env, napi_value thisVar);
187     static bool CheckElementInfoParameter(NAccessibilityElementData *callbackInfo, napi_value &value);
188     static bool CheckWindowInfoParameter(NAccessibilityElementData *callbackInfo, napi_value &value);
189     static void GetElementInfoAllAttribute1(NAccessibilityElementData *callbackInfo, napi_value &value);
190     static void GetElementInfoAllAttribute2(NAccessibilityElementData *callbackInfo, napi_value &value);
191     static void GetElementInfoAllAttribute3(NAccessibilityElementData *callbackInfo, napi_value &value);
192     static void GetElementInfoAllAttribute4(NAccessibilityElementData *callbackInfo, napi_value &value);
193     static void GetElementInfoAllAttribute5(NAccessibilityElementData *callbackInfo, napi_value &value);
194     static void GetWindowInfoAllAttribute(NAccessibilityElementData *callbackInfo, napi_value &value);
195     static void GetExtraElementInfo(NAccessibilityElementData *callbackInfo, napi_value &value, std::string keyStr);
196 
197     NAccessibilityElement() = default;
198     ~NAccessibilityElement() = default;
199 };
200 #endif // NAPI_ACCESSIBILITY_ELEMENT_H