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_utils.h"
23 #include "napi/native_api.h"
24 #include "napi/native_node_api.h"
25
26 struct AccessibilityElement {
27 AccessibilityElement() = default;
AccessibilityElementAccessibilityElement28 AccessibilityElement(std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo> elementInfo)
29 : elementInfo_(elementInfo), isElementInfo_(true)
30 {}
AccessibilityElementAccessibilityElement31 AccessibilityElement(std::shared_ptr<OHOS::Accessibility::AccessibilityWindowInfo> windowInfo)
32 : windowInfo_(windowInfo), isElementInfo_(false)
33 {}
34
35 std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo> elementInfo_ = nullptr;
36 std::shared_ptr<OHOS::Accessibility::AccessibilityWindowInfo> windowInfo_ = nullptr;
37 bool isElementInfo_ = true;
38 };
39
40 enum FindElementCondition {
41 FIND_ELEMENT_CONDITION_CONTENT,
42 FIND_ELEMENT_CONDITION_FOCUS_TYPE,
43 FIND_ELEMENT_CONDITION_TEXT_TYPE,
44 FIND_ELEMENT_CONDITION_FOCUS_DIRECTION,
45 FIND_ELEMENT_CONDITION_ELEMENT_ID,
46 FIND_ELEMENT_CONDITION_INVALID
47 };
48
49 struct NAccessibilityElementData {
50 napi_async_work work_ {};
51 napi_deferred deferred_ {};
52 napi_env env_ {};
53 napi_ref callback_ {};
54 AccessibilityElement accessibilityElement_ = {};
55 std::map<std::string, std::string> actionArguments_;
56 std::vector<OHOS::Accessibility::AccessibilityElementInfo> nodeInfos_ {};
57 OHOS::Accessibility::AccessibilityElementInfo nodeInfo_ {};
58 FindElementCondition conditionId_ = FIND_ELEMENT_CONDITION_INVALID;
59 std::string attribute_ = "";
60 std::string actionName_ = "";
61 std::string condition_ = "";
62 int32_t cursorPosition_ = 0;
63 bool systemApi = false;
64 OHOS::Accessibility::RetError ret_ = OHOS::Accessibility::RetError::RET_ERR_FAILED;
65 };
66
67 using ParseConditionFunc = std::function<OHOS::Accessibility::RetError(OHOS::Accessibility::NAPICbInfo&,
68 NAccessibilityElementData*)>;
69
70 using ParseElementFunc = std::function<OHOS::Accessibility::RetError(OHOS::Accessibility::NAPICbInfo&,
71 NAccessibilityElementData*)>;
72
73 using ParseCallbackFunc = std::function<void(OHOS::Accessibility::NAPICbInfo&,
74 NAccessibilityElementData*, napi_value&)>;
75
76 using TaskRunFunc = std::function<OHOS::Accessibility::RetError(OHOS::Accessibility::NAPICbInfo&,
77 NAccessibilityElementData*, napi_value&)>;
78
79 struct ElementFunctionCallbackInfo {
80 ParseElementFunc parseElement;
81 ParseConditionFunc parseCondition;
82 ParseCallbackFunc parseCallback;
83 TaskRunFunc run;
84 };
85
86 class NAccessibilityElement {
87 public:
88 static void DefineJSAccessibilityElement(napi_env env);
89 static napi_value JSConstructor(napi_env env, napi_callback_info info);
90
91 static void ConvertElementInfoToJS(napi_env env, napi_value result,
92 const OHOS::Accessibility::AccessibilityElementInfo& elementInfo);
93 static void ConvertElementInfosToJS(napi_env env, napi_value result,
94 const std::vector<OHOS::Accessibility::AccessibilityElementInfo>& elementInfos);
95 static void ConvertElementIdVecToJS(napi_env env, napi_value result,
96 const std::vector<OHOS::Accessibility::AccessibilityElementInfo>& elementInfos);
97
98 static napi_value AttributeNames(napi_env env, napi_callback_info info);
99 static napi_value AttributeValue(napi_env env, napi_callback_info info);
100 static napi_value ActionNames(napi_env env, napi_callback_info info);
101 static napi_value PerformAction(napi_env env, napi_callback_info info);
102 static napi_value EnableScreenCurtain(napi_env env, napi_callback_info info);
103 static napi_value FindElement(napi_env env, napi_callback_info info);
104 static napi_value ErrorOperation(NAccessibilityElementData *callbackInfo);
105 static napi_value GetCursorPosition(napi_env env, napi_callback_info info);
106 static napi_value ExecuteAction(napi_env env, napi_callback_info info);
107
108 // Element info
109 static void GetElementInfoComponentId(NAccessibilityElementData *callbackInfo, napi_value &value);
110 static void GetElementInfoPageId(NAccessibilityElementData *callbackInfo, napi_value &value);
111 static void GetElementInfoInspectorKey(NAccessibilityElementData *callbackInfo, napi_value &value);
112 static void GetElementInfoBundleName(NAccessibilityElementData *callbackInfo, napi_value &value);
113 static void GetElementInfoComponentType(NAccessibilityElementData *callbackInfo, napi_value &value);
114 static void GetElementInfoInputType(NAccessibilityElementData *callbackInfo, napi_value &value);
115 static void GetElementInfoText(NAccessibilityElementData *callbackInfo, napi_value &value);
116 static void GetElementInfoHintText(NAccessibilityElementData *callbackInfo, napi_value &value);
117 static void GetElementInfoDescription(NAccessibilityElementData *callbackInfo, napi_value &value);
118 static void GetElementInfoResourceName(NAccessibilityElementData *callbackInfo, napi_value &value);
119 static void GetElementInfoTextLengthLimit(NAccessibilityElementData *callbackInfo, napi_value &value);
120 static void GetElementInfoRect(NAccessibilityElementData *callbackInfo, napi_value &value);
121 static void GetElementInfoCheckable(NAccessibilityElementData *callbackInfo, napi_value &value);
122 static void GetElementInfoChecked(NAccessibilityElementData *callbackInfo, napi_value &value);
123 static void GetElementInfoFocusable(NAccessibilityElementData *callbackInfo, napi_value &value);
124 static void GetElementInfoIsVisible(NAccessibilityElementData *callbackInfo, napi_value &value);
125 static void GetElementInfoAccessibilityFocused(NAccessibilityElementData *callbackInfo, napi_value &value);
126 static void GetElementInfoSelected(NAccessibilityElementData *callbackInfo, napi_value &value);
127 static void GetElementInfoClickable(NAccessibilityElementData *callbackInfo, napi_value &value);
128 static void GetElementInfoLongClickable(NAccessibilityElementData *callbackInfo, napi_value &value);
129 static void GetElementInfoIsEnable(NAccessibilityElementData *callbackInfo, napi_value &value);
130 static void GetElementInfoIsPassword(NAccessibilityElementData *callbackInfo, napi_value &value);
131 static void GetElementInfoScrollable(NAccessibilityElementData *callbackInfo, napi_value &value);
132 static void GetElementInfoEditable(NAccessibilityElementData *callbackInfo, napi_value &value);
133 static void GetElementInfoPluralLineSupported(NAccessibilityElementData *callbackInfo, napi_value &value);
134 static void GetElementInfoIsHint(NAccessibilityElementData *callbackInfo, napi_value &value);
135 static void GetElementInfoItemCount(NAccessibilityElementData *callbackInfo, napi_value &value);
136 static void GetElementInfoCurrentIndex(NAccessibilityElementData *callbackInfo, napi_value &value);
137 static void GetElementInfoStartIndex(NAccessibilityElementData *callbackInfo, napi_value &value);
138 static void GetElementInfoEndIndex(NAccessibilityElementData *callbackInfo, napi_value &value);
139 static void GetElementInfoError(NAccessibilityElementData *callbackInfo, napi_value &value);
140 static void GetElementInfoTextMoveUnit(NAccessibilityElementData *callbackInfo, napi_value &value);
141 static void GetElementInfoParent(NAccessibilityElementData *callbackInfo, napi_value &value);
142 static void GetElementInfoChildren(NAccessibilityElementData *callbackInfo, napi_value &value);
143 static void GetElementInfoTriggerAction(NAccessibilityElementData *callbackInfo, napi_value &value);
144 static void GetElementInfoContents(NAccessibilityElementData *callbackInfo, napi_value &value);
145 static void GetElementInfoLastContent(NAccessibilityElementData *callbackInfo, napi_value &value);
146 static void GetElementInfoWindowId(NAccessibilityElementData *callbackInfo, napi_value &value);
147 static void GetElementInfoIsFocused(NAccessibilityElementData *callbackInfo, napi_value &value);
148 static void GetElementInfoValueMax(NAccessibilityElementData *callbackInfo, napi_value &value);
149 static void GetElementInfoValueMin(NAccessibilityElementData *callbackInfo, napi_value &value);
150 static void GetElementInfoValueNow(NAccessibilityElementData *callbackInfo, napi_value &value);
151 static void GetElementInfoAccessibilityText(NAccessibilityElementData *callbackInfo, napi_value &value);
152 static void GetElementInfoTextType(NAccessibilityElementData *callbackInfo, napi_value &value);
153 static void GetElementInfoOffset(NAccessibilityElementData *callbackInfo, napi_value &value);
154 static void GetElementInfoGridItem(NAccessibilityElementData *callbackInfo, napi_value &value);
155 static void GetElementInfoCheckboxGroup(NAccessibilityElementData *callbackInfo, napi_value &value);
156 static void GetElementInfoRow(NAccessibilityElementData *callbackInfo, napi_value &value);
157 static void GetElementInfoColumn(NAccessibilityElementData *callbackInfo, napi_value &value);
158 static void GetElementInfoSideBarContainer(NAccessibilityElementData *callbackInfo, napi_value &value);
159 static void GetElementInfoListItemIndex(NAccessibilityElementData *callbackInfo, napi_value &value);
160 static void GetElementInfoAllAttribute(NAccessibilityElementData *callbackInfo, napi_value &value);
161 static void GetElementInfoAccessibilityGroup(NAccessibilityElementData *callbackInfo, napi_value &value);
162 static void GetElementInfoAccessibilityLevel(NAccessibilityElementData *callbackInfo, napi_value &value);
163 static void GetElementInfoNavDestinationId(NAccessibilityElementData *callbackInfo, napi_value &value);
164 static void GetElementInfoSpan(NAccessibilityElementData *callbackInfo, napi_value &value);
165 static void GetElementInfoIsActive(NAccessibilityElementData *callbackInfo, napi_value &value);
166 static void GetElementInfoAccessibilityVisible(NAccessibilityElementData *callbackInfo, napi_value &value);
167 static void GetElementInfoClip(NAccessibilityElementData *callbackInfo, napi_value &value);
168 static void GetElementInfoMainWindowId(NAccessibilityElementData *callbackInfo, napi_value &value);
169 static void GetElementInfoCustomComponentType(NAccessibilityElementData *callbackInfo, napi_value &value);
170 static void GetElementInfoExtraInfo(NAccessibilityElementData *callbackInfo, napi_value &value);
171 static void GetElementInfoAccessibilityNextFocusId(NAccessibilityElementData *callbackInfo, napi_value &value);
172 static void GetElementInfoAccessibilityPreviousFocusId(NAccessibilityElementData *callbackInfo, napi_value &value);
173 static void GetElementInfoAccessibilityParentId(NAccessibilityElementData *callbackInfo, napi_value &value);
174 static void GetElementInfoAccessibilityChildrenIds(NAccessibilityElementData *callbackInfo, napi_value &value);
175 static void GetElementInfoAccessibilityScrollable(NAccessibilityElementData *callbackInfo, napi_value &value);
176 static void GetElementInfoSupportedActionNames(NAccessibilityElementData *callbackInfo, napi_value &value);
177
178 // Window info
179 static void GetWindowInfoIsActive(NAccessibilityElementData *callbackInfo, napi_value &value);
180 static void GetWindowInfoScreenRect(NAccessibilityElementData *callbackInfo, napi_value &value);
181 static void GetWindowInfoLayer(NAccessibilityElementData *callbackInfo, napi_value &value);
182 static void GetWindowInfoType(NAccessibilityElementData *callbackInfo, napi_value &value);
183 static void GetWindowInfoRootElement(NAccessibilityElementData *callbackInfo, napi_value &value);
184 static void GetWindowInfoIsFocused(NAccessibilityElementData *callbackInfo, napi_value &value);
185 static void GetWindowInfoWindowId(NAccessibilityElementData *callbackInfo, napi_value &value);
186 static void GetWindowInfoMainWindowId(NAccessibilityElementData *callbackInfo, napi_value &value);
187 static void GetWindowInfoHotArea(NAccessibilityElementData *callbackInfo, napi_value &value);
188
189 static OHOS::Accessibility::RetError ParseConditionInt64(OHOS::Accessibility::NAPICbInfo& cbInfo,
190 NAccessibilityElementData* elementData, size_t paramIndex, FindElementCondition conditionId);
191
192 static OHOS::Accessibility::RetError ParseConditionString(OHOS::Accessibility::NAPICbInfo& cbInfo,
193 NAccessibilityElementData* elementData, size_t paramIndex, FindElementCondition conditionId);
194
195 static napi_value QueryCommon(napi_env env, napi_callback_info info,
196 const ElementFunctionCallbackInfo& callbackInfo);
197
198 static OHOS::Accessibility::RetError RunFindElementAsync(OHOS::Accessibility::NAPICbInfo& cbInfo,
199 NAccessibilityElementData* elementData, napi_value& result);
200
201 static void ParseCallback(OHOS::Accessibility::NAPICbInfo& cbInfo,
202 NAccessibilityElementData* elementData, size_t paramIndex, napi_value& result);
203
204 static napi_value GetProperty(napi_env env, napi_callback_info info, std::string key);
205 static napi_value GetParent(napi_env env, napi_callback_info info);
206 static napi_value GetChildren(napi_env env, napi_callback_info info);
207 static napi_value GetRootElement(napi_env env, napi_callback_info info);
208 static napi_value FindElementByContent(napi_env env, napi_callback_info info);
209 static napi_value FindElementByFocusDirection(napi_env env, napi_callback_info info);
210 static napi_value FindElementsByAccessibilityHintText(napi_env env, napi_callback_info info);
211 static napi_value FindElementById(napi_env env, napi_callback_info info);
212
213 static napi_ref consRef_;
214 private:
215 static void AttributeNamesComplete(napi_env env, napi_status status, void* data);
216 static void AttributeValueExecute(napi_env env, void* data);
217 static void AttributeValueComplete(napi_env env, napi_status status, void* data);
218 static void ActionNamesComplete(napi_env env, napi_status status, void* data);
219 static void PerformActionExecute(napi_env env, void* data);
220 static void PerformActionComplete(napi_env env, napi_status status, void* data);
221 static void FindElementConstructCallbackInfo(napi_env env, size_t argc, napi_value* argv,
222 NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement);
223 static void FindElementExecute(napi_env env, void* data);
224 static void FindElementComplete(napi_env env, napi_status status, void* data);
225 static void FindElementByText(NAccessibilityElementData *callbackInfo);
226 static void GetElement(NAccessibilityElementData *callbackInfo, napi_value &value);
227 static napi_value PerformActionAsync(napi_env env, size_t argc, napi_value* argv,
228 std::string actionName, AccessibilityElement* accessibilityElement, bool checkPerm = false);
229 static napi_value PerformActionConstructPromise(napi_env env, size_t argc, napi_value* argv,
230 NAccessibilityElementData* callbackInfo, std::string actionName, bool checkPerm = false);
231 static napi_value FindElementAsync(napi_env env, size_t argc, napi_value* argv,
232 NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement);
233 static NAccessibilityErrorCode GetAttribute(napi_env env, size_t argc, napi_value* argv,
234 NAccessibilityElementData* callbackInfo);
235 static napi_value AttributeValueAsync(napi_env env, size_t argc, napi_value* argv,
236 NAccessibilityElementData* callbackInfo);
237 static FindElementCondition ConvertStringToCondition(const std::string &str);
238 static OHOS::Accessibility::FocusMoveDirection ConvertStringToDirection(const std::string &str);
239 static int32_t ConvertStringToFocusType(const std::string &str);
240 static napi_value GetCursorPositionAsync(napi_env env, size_t argc, napi_value* argv,
241 NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement);
242 static void GetCursorPositionExecute(napi_env env, void* data);
243 static void GetCursorPositionComplete(napi_env env, napi_status status, void* data);
244 static AccessibilityElement* UnrapAccessibilityElement(napi_env env, napi_value thisVar);
245 static bool CheckElementInfoParameter(NAccessibilityElementData *callbackInfo, napi_value &value);
246 static bool CheckWindowInfoParameter(NAccessibilityElementData *callbackInfo, napi_value &value);
247 static void GetElementInfoAllAttribute1(NAccessibilityElementData *callbackInfo, napi_value &value);
248 static void GetElementInfoAllAttribute2(NAccessibilityElementData *callbackInfo, napi_value &value);
249 static void GetElementInfoAllAttribute3(NAccessibilityElementData *callbackInfo, napi_value &value);
250 static void GetElementInfoAllAttribute4(NAccessibilityElementData *callbackInfo, napi_value &value);
251 static void GetElementInfoAllAttribute5(NAccessibilityElementData *callbackInfo, napi_value &value);
252 static void GetElementInfoAllAttribute6(NAccessibilityElementData *callbackInfo, napi_value &value);
253 static void GetWindowInfoAllAttribute(NAccessibilityElementData *callbackInfo, napi_value &value);
254 static void GetExtraElementInfo(NAccessibilityElementData *callbackInfo, napi_value &value, std::string keyStr);
255
256 static OHOS::Accessibility::RetError ParseAccessibilityElement(
257 OHOS::Accessibility::NAPICbInfo& cbInfo, NAccessibilityElementData* elementData);
258
259 static OHOS::Accessibility::RetError RunAttributeValueAsync(
260 OHOS::Accessibility::NAPICbInfo& cbInfo, NAccessibilityElementData* elementData, napi_value& result);
261
262 static OHOS::Accessibility::RetError RunAttributeValue(
263 OHOS::Accessibility::NAPICbInfo& cbInfo, NAccessibilityElementData* elementData, napi_value& result);
264
265 NAccessibilityElement() = default;
266 ~NAccessibilityElement() = default;
267 };
268
269 template<const char* Key>
270 struct ElementProperty {
valueElementProperty271 static constexpr const char* value() { return Key; }
272 };
273
274 template<typename T>
GetElementProperty(napi_env env,napi_callback_info info)275 static napi_value GetElementProperty(napi_env env, napi_callback_info info)
276 {
277 return NAccessibilityElement::GetProperty(env, info, T::value());
278 }
279 #endif // NAPI_ACCESSIBILITY_ELEMENT_H