• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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