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  #include "napi_accessibility_element.h"
17  #include <algorithm>
18  #include <map>
19  #include <vector>
20  #include <cinttypes>
21  #include "accessible_ability_client.h"
22  #include "hilog_wrapper.h"
23  #include "accessibility_utils.h"
24  #include "nlohmann/json.hpp"
25  
26  #include "ipc_skeleton.h"
27  #include "tokenid_kit.h"
28  #include "accesstoken_kit.h"
29  
30  using namespace OHOS;
31  using namespace OHOS::Accessibility;
32  using namespace OHOS::AccessibilityNapi;
33  using namespace Security::AccessToken;
34  namespace {
35      const std::vector<std::string> ELEMENT_INFO_ATTRIBUTE_NAMES = {"componentId", "inspectorKey",
36          "bundleName", "componentType", "inputType", "text", "hintText", "description", "triggerAction",
37          "textMoveUnit", "contents", "lastContent", "itemCount", "currentIndex", "startIndex", "endIndex",
38          "resourceName", "textLengthLimit", "rect", "checkable", "checked", "focusable", "isVisible", "mainWindowId",
39          "selected", "clickable", "longClickable", "isEnable", "isPassword", "scrollable", "navDestinationId",
40          "editable", "pluralLineSupported", "parent", "children", "isFocused", "accessibilityFocused",
41          "error", "isHint", "pageId", "valueMax", "valueMin", "valueNow", "windowId", "accessibilityText",
42          "textType", "offset", "currentItem", "accessibilityGroup", "accessibilityLevel", "checkboxGroupSelectedStatus",
43          "row", "column", "listItemIndex", "sideBarContainerStates", "span", "isActive", "accessibilityVisible",
44          "allAttribute"};
45      const std::vector<std::string> WINDOW_INFO_ATTRIBUTE_NAMES = {"isActive", "screenRect", "layer", "type",
46          "rootElement", "isFocused", "windowId", "mainWindowId"};
47  
48      using AttributeNamesFunc = void (*)(NAccessibilityElementData *callbackInfo, napi_value &value);
49      std::map<std::string, AttributeNamesFunc> elementInfoCompleteMap = {
50          {"componentId", &NAccessibilityElement::GetElementInfoComponentId},
51          {"inspectorKey", &NAccessibilityElement::GetElementInfoInspectorKey},
52          {"bundleName", &NAccessibilityElement::GetElementInfoBundleName},
53          {"componentType", &NAccessibilityElement::GetElementInfoComponentType},
54          {"inputType", &NAccessibilityElement::GetElementInfoInputType},
55          {"text", &NAccessibilityElement::GetElementInfoText},
56          {"hintText", &NAccessibilityElement::GetElementInfoHintText},
57          {"description", &NAccessibilityElement::GetElementInfoDescription},
58          {"resourceName", &NAccessibilityElement::GetElementInfoResourceName},
59          {"textLengthLimit", &NAccessibilityElement::GetElementInfoTextLengthLimit},
60          {"rect", &NAccessibilityElement::GetElementInfoRect},
61          {"checkable", &NAccessibilityElement::GetElementInfoCheckable},
62          {"checked", &NAccessibilityElement::GetElementInfoChecked},
63          {"focusable", &NAccessibilityElement::GetElementInfoFocusable},
64          {"isVisible", &NAccessibilityElement::GetElementInfoIsVisible},
65          {"selected", &NAccessibilityElement::GetElementInfoSelected},
66          {"clickable", &NAccessibilityElement::GetElementInfoClickable},
67          {"longClickable", &NAccessibilityElement::GetElementInfoLongClickable},
68          {"isEnable", &NAccessibilityElement::GetElementInfoIsEnable},
69          {"isPassword", &NAccessibilityElement::GetElementInfoIsPassword},
70          {"scrollable", &NAccessibilityElement::GetElementInfoScrollable},
71          {"editable", &NAccessibilityElement::GetElementInfoEditable},
72          {"pluralLineSupported", &NAccessibilityElement::GetElementInfoPluralLineSupported},
73          {"itemCount", &NAccessibilityElement::GetElementInfoItemCount},
74          {"currentIndex", &NAccessibilityElement::GetElementInfoCurrentIndex},
75          {"startIndex", &NAccessibilityElement::GetElementInfoStartIndex},
76          {"endIndex", &NAccessibilityElement::GetElementInfoEndIndex},
77          {"textMoveUnit", &NAccessibilityElement::GetElementInfoTextMoveUnit},
78          {"parent", &NAccessibilityElement::GetElementInfoParent},
79          {"children", &NAccessibilityElement::GetElementInfoChildren},
80          {"triggerAction", &NAccessibilityElement::GetElementInfoTriggerAction},
81          {"contents", &NAccessibilityElement::GetElementInfoContents},
82          {"lastContent", &NAccessibilityElement::GetElementInfoLastContent},
83          {"isFocused", &NAccessibilityElement::GetElementInfoIsFocused},
84          {"accessibilityFocused", &NAccessibilityElement::GetElementInfoAccessibilityFocused},
85          {"error", &NAccessibilityElement::GetElementInfoError},
86          {"isHint", &NAccessibilityElement::GetElementInfoIsHint},
87          {"pageId", &NAccessibilityElement::GetElementInfoPageId},
88          {"valueMax", &NAccessibilityElement::GetElementInfoValueMax},
89          {"valueMin", &NAccessibilityElement::GetElementInfoValueMin},
90          {"valueNow", &NAccessibilityElement::GetElementInfoValueNow},
91          {"windowId", &NAccessibilityElement::GetElementInfoWindowId},
92          {"accessibilityText", &NAccessibilityElement::GetElementInfoAccessibilityText},
93          {"textType", &NAccessibilityElement::GetElementInfoTextType},
94          {"offset", &NAccessibilityElement::GetElementInfoOffset},
95          {"accessibilityGroup", &NAccessibilityElement::GetElementInfoAccessibilityGroup},
96          {"accessibilityLevel", &NAccessibilityElement::GetElementInfoAccessibilityLevel},
97          {"navDestinationId", &NAccessibilityElement::GetElementInfoNavDestinationId},
98          {"currentItem", &NAccessibilityElement::GetElementInfoGridItem},
99          {"checkboxGroupSelectedStatus", &NAccessibilityElement::GetElementInfoCheckboxGroup},
100          {"row", &NAccessibilityElement::GetElementInfoRow},
101          {"column", &NAccessibilityElement::GetElementInfoColumn},
102          {"listItemIndex", &NAccessibilityElement::GetElementInfoListItemIndex},
103          {"sideBarContainerStates", &NAccessibilityElement::GetElementInfoSideBarContainer},
104          {"span", &NAccessibilityElement::GetElementInfoSpan},
105          {"isActive", &NAccessibilityElement::GetElementInfoIsActive},
106          {"accessibilityVisible", &NAccessibilityElement::GetElementInfoAccessibilityVisible},
107          {"mainWindowId", &NAccessibilityElement::GetElementInfoMainWindowId},
108          {"allAttribute", &NAccessibilityElement::GetElementInfoAllAttribute},
109      };
110      std::map<std::string, AttributeNamesFunc> windowInfoCompleteMap = {
111          {"isActive", &NAccessibilityElement::GetWindowInfoIsActive},
112          {"screenRect", &NAccessibilityElement::GetWindowInfoScreenRect},
113          {"layer", &NAccessibilityElement::GetWindowInfoLayer},
114          {"type", &NAccessibilityElement::GetWindowInfoType},
115          {"rootElement", &NAccessibilityElement::GetWindowInfoRootElement},
116          {"isFocused", &NAccessibilityElement::GetWindowInfoIsFocused},
117          {"windowId", &NAccessibilityElement::GetWindowInfoWindowId},
118          {"mainWindowId", &NAccessibilityElement::GetWindowInfoMainWindowId},
119      };
120  } // namespace
121  
122  napi_ref NAccessibilityElement::consRef_ = nullptr;
123  
DefineJSAccessibilityElement(napi_env env)124  void NAccessibilityElement::DefineJSAccessibilityElement(napi_env env)
125  {
126      napi_property_descriptor descForAccessibilityElement[] = {
127          DECLARE_NAPI_FUNCTION("attributeNames", NAccessibilityElement::AttributeNames),
128          DECLARE_NAPI_FUNCTION("attributeValue", NAccessibilityElement::AttributeValue),
129          DECLARE_NAPI_FUNCTION("actionNames", NAccessibilityElement::ActionNames),
130          DECLARE_NAPI_FUNCTION("enableScreenCurtain", NAccessibilityElement::EnableScreenCurtain),
131          DECLARE_NAPI_FUNCTION("performAction", NAccessibilityElement::PerformAction),
132          DECLARE_NAPI_FUNCTION("getCursorPosition", NAccessibilityElement::GetCursorPosition),
133          DECLARE_NAPI_FUNCTION("findElement", NAccessibilityElement::FindElement),
134      };
135  
136      napi_value constructor = nullptr;
137  
138      NAPI_CALL_RETURN_VOID(env,
139          napi_define_class(env,
140              "AccessibilityElement",
141              NAPI_AUTO_LENGTH,
142              NAccessibilityElement::JSConstructor,
143              nullptr,
144              sizeof(descForAccessibilityElement) / sizeof(descForAccessibilityElement[0]),
145              descForAccessibilityElement,
146              &constructor));
147      napi_create_reference(env, constructor, 1, &NAccessibilityElement::consRef_);
148  }
149  
JSConstructor(napi_env env,napi_callback_info info)150  napi_value NAccessibilityElement::JSConstructor(napi_env env, napi_callback_info info)
151  {
152      napi_value jsthis = nullptr;
153      NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &jsthis, nullptr));
154      return jsthis;
155  }
156  
ConvertElementInfoToJS(napi_env env,napi_value result,const AccessibilityElementInfo & elementInfo)157  void NAccessibilityElement::ConvertElementInfoToJS(napi_env env, napi_value result,
158      const AccessibilityElementInfo& elementInfo)
159  {
160      // Bind js object to a Native object
161      std::shared_ptr<AccessibilityElementInfo> elementInformation =
162          std::make_shared<AccessibilityElementInfo>(elementInfo);
163      AccessibilityElement* pAccessibilityElement = new(std::nothrow) AccessibilityElement(elementInformation);
164      if (pAccessibilityElement == nullptr) {
165          HILOG_ERROR("Failed to create elementInformation.");
166          return;
167      }
168      napi_status sts = napi_wrap(
169          env,
170          result,
171          pAccessibilityElement,
172          [](napi_env env, void* data, void* hint) {
173              AccessibilityElement* info = static_cast<AccessibilityElement*>(data);
174              delete info;
175              info = nullptr;
176          },
177          nullptr,
178          nullptr);
179      if (sts != napi_ok) {
180          delete pAccessibilityElement;
181          pAccessibilityElement = nullptr;
182          HILOG_ERROR("failed to wrap JS object");
183      }
184      HILOG_DEBUG("napi_wrap status: %{public}d", (int)sts);
185  }
186  
ConvertElementInfosToJS(napi_env env,napi_value result,const std::vector<OHOS::Accessibility::AccessibilityElementInfo> & elementInfos)187  void NAccessibilityElement::ConvertElementInfosToJS(
188      napi_env env, napi_value result, const std::vector<OHOS::Accessibility::AccessibilityElementInfo>& elementInfos)
189  {
190      HILOG_DEBUG("elementInfo size(%{public}zu)", elementInfos.size());
191  
192      napi_value constructor = nullptr;
193      napi_get_reference_value(env, NAccessibilityElement::consRef_, &constructor);
194  
195      size_t index = 0;
196      for (auto& elementInfo : elementInfos) {
197          napi_value obj = nullptr;
198          napi_status status = napi_new_instance(env, constructor, 0, nullptr, &obj);
199          HILOG_DEBUG("status is %{public}d", status);
200          ConvertElementInfoToJS(env, obj, elementInfo);
201          napi_set_element(env, result, index, obj);
202          index++;
203      }
204  }
205  
AttributeNames(napi_env env,napi_callback_info info)206  napi_value NAccessibilityElement::AttributeNames(napi_env env, napi_callback_info info)
207  {
208      HILOG_DEBUG();
209      size_t argc = ARGS_SIZE_ONE;
210      napi_value argv = nullptr;
211      napi_value thisVar = nullptr;
212      void* data = nullptr;
213      NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisVar, &data));
214      HILOG_DEBUG("argc = %{public}d", (int)argc);
215  
216      NAccessibilityElementData *callbackInfo = new(std::nothrow) NAccessibilityElementData();
217      if (callbackInfo == nullptr) {
218          HILOG_ERROR("Failed to create callbackInfo.");
219          return nullptr;
220      }
221      callbackInfo->env_ = env;
222  
223      napi_value promise = nullptr;
224      if (argc > ARGS_SIZE_ONE - 1) {
225          napi_valuetype valueType = napi_null;
226          napi_typeof(env, argv, &valueType);
227          if (valueType == napi_function) {
228              napi_create_reference(env, argv, 1, &callbackInfo->callback_);
229              napi_get_undefined(env, &promise);
230          } else {
231              napi_create_promise(env, &callbackInfo->deferred_, &promise);
232          }
233      } else {
234          napi_create_promise(env, &callbackInfo->deferred_, &promise);
235      }
236  
237      AccessibilityElement* accessibilityElement = nullptr;
238      napi_status status = napi_unwrap(env, thisVar, (void**)&accessibilityElement);
239      if (!accessibilityElement || status != napi_ok) {
240          HILOG_ERROR("accessibilityElement is null or status[%{public}d] is wrong", status);
241          return ErrorOperation(callbackInfo);
242      }
243      callbackInfo->accessibilityElement_ = *accessibilityElement;
244  
245      napi_value resource = nullptr;
246      napi_create_string_utf8(env, "AttributeNames", NAPI_AUTO_LENGTH, &resource);
247      if (resource == nullptr) {
248          HILOG_ERROR("resource is nullptr.");
249          return nullptr;
250      }
251      napi_create_async_work(env, nullptr, resource, [](napi_env env, void* data) {},
252          // Execute the complete function
253          AttributeNamesComplete,
254          reinterpret_cast<void*>(callbackInfo),
255          &callbackInfo->work_);
256      napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
257      return promise;
258  }
259  
AttributeNamesComplete(napi_env env,napi_status status,void * data)260  void NAccessibilityElement::AttributeNamesComplete(napi_env env, napi_status status, void* data)
261  {
262      HILOG_DEBUG("AttributeNameComplete execute back");
263      NAccessibilityElementData* callbackInfo = static_cast<NAccessibilityElementData*>(data);
264      napi_value result[ARGS_SIZE_TWO] = {0};
265      napi_value callback = 0;
266      napi_value undefined = 0;
267      napi_get_undefined(env, &undefined);
268      if (callbackInfo == nullptr) {
269          HILOG_ERROR("callbackInfo is nullptr");
270          return;
271      }
272  
273      napi_create_array(env, &result[1]);
274      if (callbackInfo->accessibilityElement_.isElementInfo_) {
275          HILOG_DEBUG("covert element info to js");
276          ConvertStringVecToJS(env, result[1], ELEMENT_INFO_ATTRIBUTE_NAMES);
277      } else {
278          HILOG_DEBUG("covert window info to js");
279          ConvertStringVecToJS(env, result[1], WINDOW_INFO_ATTRIBUTE_NAMES);
280      }
281  
282      if (callbackInfo->callback_) {
283          // Callback mode
284          result[PARAM0] = CreateBusinessError(env, OHOS::Accessibility::RetError::RET_OK);
285          napi_get_reference_value(env, callbackInfo->callback_, &callback);
286          napi_value returnVal = nullptr;
287          napi_call_function(env, undefined, callback, ARGS_SIZE_TWO, result, &returnVal);
288          napi_delete_reference(env, callbackInfo->callback_);
289      } else {
290          // Promise mode
291          napi_resolve_deferred(env, callbackInfo->deferred_, result[PARAM1]);
292      }
293      napi_delete_async_work(env, callbackInfo->work_);
294      delete callbackInfo;
295      callbackInfo = nullptr;
296  }
297  
AttributeValue(napi_env env,napi_callback_info info)298  napi_value NAccessibilityElement::AttributeValue(napi_env env, napi_callback_info info)
299  {
300      size_t argc = ARGS_SIZE_TWO;
301      napi_value argv[ARGS_SIZE_TWO] = {0};
302      napi_value thisVar = nullptr;
303      void* data = nullptr;
304      napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
305      if (status != napi_ok) {
306          HILOG_ERROR("Failed to get cb info");
307          napi_value err = CreateBusinessError(env, RetError::RET_ERR_FAILED);
308          napi_throw(env, err);
309          return nullptr;
310      }
311      HILOG_DEBUG("argc = %{public}d", (int)argc);
312  
313      // Unwrap AccessibilityElement
314      AccessibilityElement* accessibilityElement = nullptr;
315      status = napi_unwrap(env, thisVar, (void**)&accessibilityElement);
316      if (!accessibilityElement || status != napi_ok) {
317          HILOG_ERROR("accessibilityElement is null or status[%{public}d] is wrong", status);
318          napi_value err = CreateBusinessError(env, RetError::RET_ERR_NULLPTR);
319          napi_throw(env, err);
320          return nullptr;
321      }
322  
323      NAccessibilityElementData *callbackInfo = new(std::nothrow) NAccessibilityElementData();
324      if (callbackInfo == nullptr) {
325          HILOG_ERROR("Failed to create callbackInfo.");
326          napi_value err = CreateBusinessError(env, RetError::RET_ERR_NULLPTR);
327          napi_throw(env, err);
328          return nullptr;
329      }
330      callbackInfo->env_ = env;
331      callbackInfo->accessibilityElement_ = *accessibilityElement;
332  
333      NAccessibilityErrorCode errCode = GetAttribute(env, argc, argv, callbackInfo);
334      if (errCode == NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM) {
335          delete callbackInfo;
336          callbackInfo = nullptr;
337          delete accessibilityElement;
338          accessibilityElement = nullptr;
339          napi_value err = CreateBusinessError(env, RetError::RET_ERR_INVALID_PARAM);
340          HILOG_ERROR("invalid param");
341          napi_throw(env, err);
342          return nullptr;
343      }
344  
345      return AttributeValueAsync(env, argc, argv, callbackInfo);
346  }
347  
GetAttribute(napi_env env,size_t argc,napi_value * argv,NAccessibilityElementData * callbackInfo)348  NAccessibilityErrorCode NAccessibilityElement::GetAttribute(
349      napi_env env, size_t argc, napi_value* argv, NAccessibilityElementData* callbackInfo)
350  {
351      NAccessibilityErrorCode errCode = NAccessibilityErrorCode::ACCESSIBILITY_OK;
352      if (argc < ARGS_SIZE_TWO - 1) {
353          HILOG_ERROR("argc is invalid: %{public}zu", argc);
354          errCode = NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM;
355      }
356  
357      if (errCode == NAccessibilityErrorCode::ACCESSIBILITY_OK) {
358          // Parse attribute name
359          std::string attribute = "";
360          if (ParseString(env, attribute, argv[PARAM0])) {
361              HILOG_DEBUG("attribute = %{public}s", attribute.c_str());
362              callbackInfo->attribute_ = attribute;
363          } else {
364              errCode = NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM;
365          }
366      }
367      return errCode;
368  }
369  
AttributeValueAsync(napi_env env,size_t argc,napi_value * argv,NAccessibilityElementData * callbackInfo)370  napi_value NAccessibilityElement::AttributeValueAsync(
371      napi_env env, size_t argc, napi_value* argv, NAccessibilityElementData* callbackInfo)
372  {
373      napi_value promise = nullptr;
374      if (argc > ARGS_SIZE_TWO - 1) {
375          napi_valuetype valueType = napi_null;
376          napi_typeof(env, argv[PARAM1], &valueType);
377          if (valueType == napi_function) {
378              napi_create_reference(env, argv[PARAM1], 1, &callbackInfo->callback_);
379              napi_get_undefined(env, &promise);
380          } else {
381              napi_create_promise(env, &callbackInfo->deferred_, &promise);
382          }
383      } else {
384          napi_create_promise(env, &callbackInfo->deferred_, &promise);
385      }
386  
387      napi_value resource = nullptr;
388      napi_create_string_utf8(env, "AttributeValue", NAPI_AUTO_LENGTH, &resource);
389      napi_create_async_work(env, nullptr, resource, NAccessibilityElement::AttributeValueExecute,
390          NAccessibilityElement::AttributeValueComplete, reinterpret_cast<void*>(callbackInfo), &callbackInfo->work_);
391      napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
392      return promise;
393  }
394  
AttributeValueExecute(napi_env env,void * data)395  void NAccessibilityElement::AttributeValueExecute(napi_env env, void* data)
396  {
397      NAccessibilityElementData* callbackInfo = static_cast<NAccessibilityElementData*>(data);
398      if (callbackInfo == nullptr) {
399          HILOG_ERROR("callbackInfo is nullptr");
400          return;
401      }
402  
403      if (callbackInfo->attribute_ == "parent") {
404          if (callbackInfo->accessibilityElement_.elementInfo_) {
405              callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->GetParentElementInfo(
406                  *callbackInfo->accessibilityElement_.elementInfo_, callbackInfo->nodeInfo_);
407          } else {
408              HILOG_ERROR("elementInfo is nullptr");
409          }
410      } else if (callbackInfo->attribute_ == "children") {
411          if (callbackInfo->accessibilityElement_.elementInfo_) {
412              callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->GetChildren(
413                  *callbackInfo->accessibilityElement_.elementInfo_, callbackInfo->nodeInfos_);
414          } else {
415              HILOG_ERROR("elementInfo is nullptr");
416          }
417      } else if (callbackInfo->attribute_ == "rootElement") {
418          if (callbackInfo->accessibilityElement_.windowInfo_) {
419              callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->GetRootByWindow(
420                  *callbackInfo->accessibilityElement_.windowInfo_, callbackInfo->nodeInfo_);
421          } else {
422              HILOG_ERROR("windowInfo is nullptr");
423          }
424      } else {
425          callbackInfo->ret_ = RET_OK;
426      }
427      HILOG_DEBUG("attribute[%{public}s], result[%{public}d]", callbackInfo->attribute_.c_str(), callbackInfo->ret_);
428  }
429  
AttributeValueComplete(napi_env env,napi_status status,void * data)430  void NAccessibilityElement::AttributeValueComplete(napi_env env, napi_status status, void* data)
431  {
432      NAccessibilityElementData* callbackInfo = static_cast<NAccessibilityElementData*>(data);
433      if (callbackInfo == nullptr) {
434          HILOG_ERROR("callbackInfo is nullptr");
435          return;
436      }
437      napi_value result[ARGS_SIZE_TWO] = {0};
438  
439      if (callbackInfo->accessibilityElement_.isElementInfo_) {
440          HILOG_DEBUG("It is element info");
441          auto elementIter = elementInfoCompleteMap.find(callbackInfo->attribute_);
442          if (elementIter == elementInfoCompleteMap.end()) {
443              HILOG_ERROR("There is no the attribute[%{public}s] in element info", callbackInfo->attribute_.c_str());
444              napi_get_undefined(callbackInfo->env_, &result[PARAM1]);
445              callbackInfo->ret_ = RET_ERR_PROPERTY_NOT_EXIST;
446          } else {
447              (*elementIter->second)(callbackInfo, result[PARAM1]);
448          }
449      } else {
450          HILOG_DEBUG("It is window info");
451          auto windowIter = windowInfoCompleteMap.find(callbackInfo->attribute_);
452          if (windowIter == windowInfoCompleteMap.end()) {
453              HILOG_ERROR("There is no the attribute[%{public}s]", callbackInfo->attribute_.c_str());
454              napi_get_undefined(callbackInfo->env_, &result[PARAM1]);
455              callbackInfo->ret_ = RET_ERR_PROPERTY_NOT_EXIST;
456          } else {
457              (*windowIter->second)(callbackInfo, result[PARAM1]);
458          }
459      }
460  
461      HILOG_DEBUG("result is %{public}d", callbackInfo->ret_);
462      result[PARAM0] = CreateBusinessError(env, callbackInfo->ret_);
463      if (callbackInfo->callback_) {
464          napi_value callback = nullptr;
465          napi_value returnVal = nullptr;
466          napi_value undefined = nullptr;
467          napi_get_reference_value(env, callbackInfo->callback_, &callback);
468          napi_get_undefined(env, &undefined); // 是否加判断
469          napi_call_function(env, undefined, callback, ARGS_SIZE_TWO, result, &returnVal);
470          napi_delete_reference(env, callbackInfo->callback_);
471      } else {
472          if (callbackInfo->ret_ == RET_OK) {
473              napi_resolve_deferred(env, callbackInfo->deferred_, result[PARAM1]);
474          } else {
475              napi_reject_deferred(env, callbackInfo->deferred_, result[PARAM0]);
476          }
477      }
478      napi_delete_async_work(env, callbackInfo->work_);
479      delete callbackInfo;
480      callbackInfo = nullptr;
481  }
482  
CheckElementInfoParameter(NAccessibilityElementData * callbackInfo,napi_value & value)483  bool NAccessibilityElement::CheckElementInfoParameter(NAccessibilityElementData *callbackInfo, napi_value &value)
484  {
485      if (callbackInfo == nullptr) {
486          HILOG_ERROR("callbackInfo is nullptr");
487          return false;
488      }
489      if (!callbackInfo->accessibilityElement_.elementInfo_) {
490          HILOG_ERROR("element info is nullptr");
491          napi_get_undefined(callbackInfo->env_, &value);
492          callbackInfo->ret_ = RET_ERR_FAILED;
493          return false;
494      }
495      return true;
496  }
497  
GetElementInfoComponentId(NAccessibilityElementData * callbackInfo,napi_value & value)498  void NAccessibilityElement::GetElementInfoComponentId(NAccessibilityElementData *callbackInfo, napi_value &value)
499  {
500      if (!CheckElementInfoParameter(callbackInfo, value)) {
501          return;
502      }
503      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int64(callbackInfo->env_,
504          callbackInfo->accessibilityElement_.elementInfo_->GetAccessibilityId(), &value));
505  }
506  
GetElementInfoPageId(NAccessibilityElementData * callbackInfo,napi_value & value)507  void NAccessibilityElement::GetElementInfoPageId(NAccessibilityElementData *callbackInfo, napi_value &value)
508  {
509      if (!CheckElementInfoParameter(callbackInfo, value)) {
510          return;
511      }
512      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
513          callbackInfo->accessibilityElement_.elementInfo_->GetPageId(), &value));
514  }
515  
GetElementInfoInspectorKey(NAccessibilityElementData * callbackInfo,napi_value & value)516  void NAccessibilityElement::GetElementInfoInspectorKey(NAccessibilityElementData *callbackInfo, napi_value &value)
517  {
518      if (!CheckElementInfoParameter(callbackInfo, value)) {
519          return;
520      }
521      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
522          callbackInfo->accessibilityElement_.elementInfo_->GetInspectorKey().c_str(), NAPI_AUTO_LENGTH, &value));
523  }
524  
GetElementInfoBundleName(NAccessibilityElementData * callbackInfo,napi_value & value)525  void NAccessibilityElement::GetElementInfoBundleName(NAccessibilityElementData *callbackInfo, napi_value &value)
526  {
527      if (!CheckElementInfoParameter(callbackInfo, value)) {
528          return;
529      }
530      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
531          callbackInfo->accessibilityElement_.elementInfo_->GetBundleName().c_str(), NAPI_AUTO_LENGTH, &value));
532  }
533  
GetElementInfoComponentType(NAccessibilityElementData * callbackInfo,napi_value & value)534  void NAccessibilityElement::GetElementInfoComponentType(NAccessibilityElementData *callbackInfo, napi_value &value)
535  {
536      if (!CheckElementInfoParameter(callbackInfo, value)) {
537          return;
538      }
539      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
540          callbackInfo->accessibilityElement_.elementInfo_->GetComponentType().c_str(), NAPI_AUTO_LENGTH, &value));
541  }
542  
GetElementInfoInputType(NAccessibilityElementData * callbackInfo,napi_value & value)543  void NAccessibilityElement::GetElementInfoInputType(NAccessibilityElementData *callbackInfo, napi_value &value)
544  {
545      if (!CheckElementInfoParameter(callbackInfo, value)) {
546          return;
547      }
548      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
549          callbackInfo->accessibilityElement_.elementInfo_->GetInputType(), &value));
550  }
551  
GetElementInfoText(NAccessibilityElementData * callbackInfo,napi_value & value)552  void NAccessibilityElement::GetElementInfoText(NAccessibilityElementData *callbackInfo, napi_value &value)
553  {
554      if (!CheckElementInfoParameter(callbackInfo, value)) {
555          return;
556      }
557      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
558          callbackInfo->accessibilityElement_.elementInfo_->GetContent().c_str(), NAPI_AUTO_LENGTH, &value));
559  }
560  
GetElementInfoHintText(NAccessibilityElementData * callbackInfo,napi_value & value)561  void NAccessibilityElement::GetElementInfoHintText(NAccessibilityElementData *callbackInfo, napi_value &value)
562  {
563      if (!CheckElementInfoParameter(callbackInfo, value)) {
564          return;
565      }
566      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
567          callbackInfo->accessibilityElement_.elementInfo_->GetHint().c_str(), NAPI_AUTO_LENGTH, &value));
568  }
569  
GetElementInfoDescription(NAccessibilityElementData * callbackInfo,napi_value & value)570  void NAccessibilityElement::GetElementInfoDescription(NAccessibilityElementData *callbackInfo, napi_value &value)
571  {
572      if (!CheckElementInfoParameter(callbackInfo, value)) {
573          return;
574      }
575      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
576          callbackInfo->accessibilityElement_.elementInfo_->GetDescriptionInfo().c_str(), NAPI_AUTO_LENGTH, &value));
577  }
578  
GetElementInfoResourceName(NAccessibilityElementData * callbackInfo,napi_value & value)579  void NAccessibilityElement::GetElementInfoResourceName(NAccessibilityElementData *callbackInfo, napi_value &value)
580  {
581      if (!CheckElementInfoParameter(callbackInfo, value)) {
582          return;
583      }
584      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
585          callbackInfo->accessibilityElement_.elementInfo_->GetComponentResourceId().c_str(), NAPI_AUTO_LENGTH, &value));
586  }
587  
GetElementInfoTextLengthLimit(NAccessibilityElementData * callbackInfo,napi_value & value)588  void NAccessibilityElement::GetElementInfoTextLengthLimit(NAccessibilityElementData *callbackInfo, napi_value &value)
589  {
590      if (!CheckElementInfoParameter(callbackInfo, value)) {
591          return;
592      }
593      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
594          callbackInfo->accessibilityElement_.elementInfo_->GetTextLengthLimit(), &value));
595  }
596  
GetElementInfoRect(NAccessibilityElementData * callbackInfo,napi_value & value)597  void NAccessibilityElement::GetElementInfoRect(NAccessibilityElementData *callbackInfo, napi_value &value)
598  {
599      if (!CheckElementInfoParameter(callbackInfo, value)) {
600          return;
601      }
602      OHOS::Accessibility::Rect screenRect = callbackInfo->accessibilityElement_.elementInfo_->GetRectInScreen();
603      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_object(callbackInfo->env_, &value));
604      ConvertRectToJS(callbackInfo->env_, value, screenRect);
605  }
606  
GetElementInfoGridItem(NAccessibilityElementData * callbackInfo,napi_value & value)607  void NAccessibilityElement::GetElementInfoGridItem(NAccessibilityElementData *callbackInfo, napi_value &value)
608  {
609      if (!CheckElementInfoParameter(callbackInfo, value)) {
610          return;
611      }
612      OHOS::Accessibility::GridItemInfo gridItem = callbackInfo->accessibilityElement_.elementInfo_->GetGridItem();
613      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_object(callbackInfo->env_, &value));
614      ConvertGridItemToJS(callbackInfo->env_, value, gridItem);
615  }
616  
GetExtraElementInfo(NAccessibilityElementData * callbackInfo,napi_value & value,std::string keyStr)617  void NAccessibilityElement::GetExtraElementInfo(NAccessibilityElementData *callbackInfo,
618      napi_value &value, std::string keyStr)
619  {
620      if (callbackInfo == nullptr) {
621          HILOG_ERROR("callbackInfo is nullptr");
622          return;
623      }
624      std::map<std::string, std::string> mapValIsStr =
625          callbackInfo->accessibilityElement_.elementInfo_->GetExtraElement().GetExtraElementInfoValueStr();
626      std::map<std::string, int32_t> mapValIsInt =
627          callbackInfo->accessibilityElement_.elementInfo_->GetExtraElement().GetExtraElementInfoValueInt();
628      HILOG_DEBUG("GetExtraElementInfo: size is extraElementValueStr : [%{public}zu]",
629          mapValIsStr.size());
630      HILOG_DEBUG("GetExtraElementInfo: size is extraElementValueInt : [%{public}zu]",
631          mapValIsInt.size());
632  
633      auto iter = mapValIsStr.find(keyStr);
634      if (iter != mapValIsStr.end()) {
635          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
636              iter->second.c_str(), NAPI_AUTO_LENGTH, &value));
637          return;
638      }
639      auto seconditer = mapValIsInt.find(keyStr);
640      if (seconditer != mapValIsInt.end()) {
641          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_, seconditer->second, &value));
642          return;
643      }
644  
645      napi_get_undefined(callbackInfo->env_, &value);
646  }
647  
GetElementInfoCheckboxGroup(NAccessibilityElementData * callbackInfo,napi_value & value)648  void NAccessibilityElement::GetElementInfoCheckboxGroup(NAccessibilityElementData *callbackInfo, napi_value &value)
649  {
650      if (!CheckElementInfoParameter(callbackInfo, value)) {
651          return;
652      }
653      GetExtraElementInfo(callbackInfo, value, "CheckboxGroupSelectedStatus");
654  }
655  
GetElementInfoRow(NAccessibilityElementData * callbackInfo,napi_value & value)656  void NAccessibilityElement::GetElementInfoRow(NAccessibilityElementData *callbackInfo, napi_value &value)
657  {
658      if (!CheckElementInfoParameter(callbackInfo, value)) {
659          return;
660      }
661      GetExtraElementInfo(callbackInfo, value, "Row");
662  }
663  
GetElementInfoColumn(NAccessibilityElementData * callbackInfo,napi_value & value)664  void NAccessibilityElement::GetElementInfoColumn(NAccessibilityElementData *callbackInfo, napi_value &value)
665  {
666      if (!CheckElementInfoParameter(callbackInfo, value)) {
667          return;
668      }
669      GetExtraElementInfo(callbackInfo, value, "Column");
670  }
671  
GetElementInfoSideBarContainer(NAccessibilityElementData * callbackInfo,napi_value & value)672  void NAccessibilityElement::GetElementInfoSideBarContainer(NAccessibilityElementData *callbackInfo, napi_value &value)
673  {
674      if (!CheckElementInfoParameter(callbackInfo, value)) {
675          return;
676      }
677      GetExtraElementInfo(callbackInfo, value, "SideBarContainerStates");
678  }
679  
GetElementInfoListItemIndex(NAccessibilityElementData * callbackInfo,napi_value & value)680  void NAccessibilityElement::GetElementInfoListItemIndex(NAccessibilityElementData *callbackInfo, napi_value &value)
681  {
682      if (!CheckElementInfoParameter(callbackInfo, value)) {
683          return;
684      }
685      GetExtraElementInfo(callbackInfo, value, "ListItemIndex");
686  }
687  
GetElementInfoCheckable(NAccessibilityElementData * callbackInfo,napi_value & value)688  void NAccessibilityElement::GetElementInfoCheckable(NAccessibilityElementData *callbackInfo, napi_value &value)
689  {
690      if (!CheckElementInfoParameter(callbackInfo, value)) {
691          return;
692      }
693      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
694          callbackInfo->accessibilityElement_.elementInfo_->IsCheckable(), &value));
695  }
696  
GetElementInfoChecked(NAccessibilityElementData * callbackInfo,napi_value & value)697  void NAccessibilityElement::GetElementInfoChecked(NAccessibilityElementData *callbackInfo, napi_value &value)
698  {
699      if (!CheckElementInfoParameter(callbackInfo, value)) {
700          return;
701      }
702      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
703          callbackInfo->accessibilityElement_.elementInfo_->IsChecked(), &value));
704  }
705  
GetElementInfoFocusable(NAccessibilityElementData * callbackInfo,napi_value & value)706  void NAccessibilityElement::GetElementInfoFocusable(NAccessibilityElementData *callbackInfo, napi_value &value)
707  {
708      if (!CheckElementInfoParameter(callbackInfo, value)) {
709          return;
710      }
711      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
712          callbackInfo->accessibilityElement_.elementInfo_->IsFocusable(), &value));
713  }
714  
GetElementInfoIsVisible(NAccessibilityElementData * callbackInfo,napi_value & value)715  void NAccessibilityElement::GetElementInfoIsVisible(NAccessibilityElementData *callbackInfo, napi_value &value)
716  {
717      if (!CheckElementInfoParameter(callbackInfo, value)) {
718          return;
719      }
720      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
721          callbackInfo->accessibilityElement_.elementInfo_->IsVisible(), &value));
722  }
723  
GetElementInfoAccessibilityFocused(NAccessibilityElementData * callbackInfo,napi_value & value)724  void NAccessibilityElement::GetElementInfoAccessibilityFocused(
725      NAccessibilityElementData *callbackInfo, napi_value &value)
726  {
727      if (!CheckElementInfoParameter(callbackInfo, value)) {
728          return;
729      }
730      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
731          callbackInfo->accessibilityElement_.elementInfo_->HasAccessibilityFocus(), &value));
732  }
733  
GetElementInfoSelected(NAccessibilityElementData * callbackInfo,napi_value & value)734  void NAccessibilityElement::GetElementInfoSelected(NAccessibilityElementData *callbackInfo, napi_value &value)
735  {
736      if (!CheckElementInfoParameter(callbackInfo, value)) {
737          return;
738      }
739      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
740          callbackInfo->accessibilityElement_.elementInfo_->IsSelected(), &value));
741  }
742  
GetElementInfoClickable(NAccessibilityElementData * callbackInfo,napi_value & value)743  void NAccessibilityElement::GetElementInfoClickable(NAccessibilityElementData *callbackInfo, napi_value &value)
744  {
745      if (!CheckElementInfoParameter(callbackInfo, value)) {
746          return;
747      }
748      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
749          callbackInfo->accessibilityElement_.elementInfo_->IsClickable(), &value));
750  }
751  
GetElementInfoLongClickable(NAccessibilityElementData * callbackInfo,napi_value & value)752  void NAccessibilityElement::GetElementInfoLongClickable(NAccessibilityElementData *callbackInfo, napi_value &value)
753  {
754      if (!CheckElementInfoParameter(callbackInfo, value)) {
755          return;
756      }
757      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
758          callbackInfo->accessibilityElement_.elementInfo_->IsLongClickable(), &value));
759  }
760  
GetElementInfoIsEnable(NAccessibilityElementData * callbackInfo,napi_value & value)761  void NAccessibilityElement::GetElementInfoIsEnable(NAccessibilityElementData *callbackInfo, napi_value &value)
762  {
763      if (!CheckElementInfoParameter(callbackInfo, value)) {
764          return;
765      }
766      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
767          callbackInfo->accessibilityElement_.elementInfo_->IsEnabled(), &value));
768  }
769  
GetElementInfoIsPassword(NAccessibilityElementData * callbackInfo,napi_value & value)770  void NAccessibilityElement::GetElementInfoIsPassword(NAccessibilityElementData *callbackInfo, napi_value &value)
771  {
772      if (!CheckElementInfoParameter(callbackInfo, value)) {
773          return;
774      }
775      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
776          callbackInfo->accessibilityElement_.elementInfo_->IsPassword(), &value));
777  }
778  
GetElementInfoScrollable(NAccessibilityElementData * callbackInfo,napi_value & value)779  void NAccessibilityElement::GetElementInfoScrollable(NAccessibilityElementData *callbackInfo, napi_value &value)
780  {
781      if (!CheckElementInfoParameter(callbackInfo, value)) {
782          return;
783      }
784      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
785          callbackInfo->accessibilityElement_.elementInfo_->IsScrollable(), &value));
786  }
787  
GetElementInfoEditable(NAccessibilityElementData * callbackInfo,napi_value & value)788  void NAccessibilityElement::GetElementInfoEditable(NAccessibilityElementData *callbackInfo, napi_value &value)
789  {
790      if (!CheckElementInfoParameter(callbackInfo, value)) {
791          return;
792      }
793      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
794          callbackInfo->accessibilityElement_.elementInfo_->IsEditable(), &value));
795  }
796  
GetElementInfoPluralLineSupported(NAccessibilityElementData * callbackInfo,napi_value & value)797  void NAccessibilityElement::GetElementInfoPluralLineSupported(
798      NAccessibilityElementData *callbackInfo, napi_value &value)
799  {
800      if (!CheckElementInfoParameter(callbackInfo, value)) {
801          return;
802      }
803      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
804          callbackInfo->accessibilityElement_.elementInfo_->IsPluraLineSupported(), &value));
805  }
806  
GetElementInfoIsHint(NAccessibilityElementData * callbackInfo,napi_value & value)807  void NAccessibilityElement::GetElementInfoIsHint(NAccessibilityElementData *callbackInfo, napi_value &value)
808  {
809      if (!CheckElementInfoParameter(callbackInfo, value)) {
810          return;
811      }
812      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
813          callbackInfo->accessibilityElement_.elementInfo_->IsGivingHint(), &value));
814  }
815  
GetElementInfoItemCount(NAccessibilityElementData * callbackInfo,napi_value & value)816  void NAccessibilityElement::GetElementInfoItemCount(NAccessibilityElementData *callbackInfo, napi_value &value)
817  {
818      if (!CheckElementInfoParameter(callbackInfo, value)) {
819          return;
820      }
821      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
822          callbackInfo->accessibilityElement_.elementInfo_->GetItemCounts(), &value));
823  }
824  
GetElementInfoCurrentIndex(NAccessibilityElementData * callbackInfo,napi_value & value)825  void NAccessibilityElement::GetElementInfoCurrentIndex(NAccessibilityElementData *callbackInfo, napi_value &value)
826  {
827      if (!CheckElementInfoParameter(callbackInfo, value)) {
828          return;
829      }
830      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
831          callbackInfo->accessibilityElement_.elementInfo_->GetCurrentIndex(), &value));
832  }
833  
GetElementInfoStartIndex(NAccessibilityElementData * callbackInfo,napi_value & value)834  void NAccessibilityElement::GetElementInfoStartIndex(NAccessibilityElementData *callbackInfo, napi_value &value)
835  {
836      if (!CheckElementInfoParameter(callbackInfo, value)) {
837          return;
838      }
839      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
840          callbackInfo->accessibilityElement_.elementInfo_->GetBeginIndex(), &value));
841  }
842  
GetElementInfoEndIndex(NAccessibilityElementData * callbackInfo,napi_value & value)843  void NAccessibilityElement::GetElementInfoEndIndex(NAccessibilityElementData *callbackInfo, napi_value &value)
844  {
845      if (!CheckElementInfoParameter(callbackInfo, value)) {
846          return;
847      }
848      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
849          callbackInfo->accessibilityElement_.elementInfo_->GetEndIndex(), &value));
850  }
851  
GetElementInfoValueMax(NAccessibilityElementData * callbackInfo,napi_value & value)852  void NAccessibilityElement::GetElementInfoValueMax(NAccessibilityElementData *callbackInfo, napi_value &value)
853  {
854      if (!CheckElementInfoParameter(callbackInfo, value)) {
855          return;
856      }
857      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_double(callbackInfo->env_,
858          callbackInfo->accessibilityElement_.elementInfo_->GetRange().GetMax(), &value));
859  }
860  
GetElementInfoValueMin(NAccessibilityElementData * callbackInfo,napi_value & value)861  void NAccessibilityElement::GetElementInfoValueMin(NAccessibilityElementData *callbackInfo, napi_value &value)
862  {
863      if (!CheckElementInfoParameter(callbackInfo, value)) {
864          return;
865      }
866      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_double(callbackInfo->env_,
867          callbackInfo->accessibilityElement_.elementInfo_->GetRange().GetMin(), &value));
868  }
869  
GetElementInfoValueNow(NAccessibilityElementData * callbackInfo,napi_value & value)870  void NAccessibilityElement::GetElementInfoValueNow(NAccessibilityElementData *callbackInfo, napi_value &value)
871  {
872      if (!CheckElementInfoParameter(callbackInfo, value)) {
873          return;
874      }
875      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_double(callbackInfo->env_,
876          callbackInfo->accessibilityElement_.elementInfo_->GetRange().GetCurrent(), &value));
877  }
878  
GetElementInfoError(NAccessibilityElementData * callbackInfo,napi_value & value)879  void NAccessibilityElement::GetElementInfoError(NAccessibilityElementData *callbackInfo, napi_value &value)
880  {
881      if (!CheckElementInfoParameter(callbackInfo, value)) {
882          return;
883      }
884      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
885          callbackInfo->accessibilityElement_.elementInfo_->GetError().c_str(), NAPI_AUTO_LENGTH, &value));
886  }
887  
GetElementInfoTextMoveUnit(NAccessibilityElementData * callbackInfo,napi_value & value)888  void NAccessibilityElement::GetElementInfoTextMoveUnit(NAccessibilityElementData *callbackInfo, napi_value &value)
889  {
890      if (!CheckElementInfoParameter(callbackInfo, value)) {
891          return;
892      }
893      std::string textMoveUnit = ConvertTextMoveUnitToString(
894          callbackInfo->accessibilityElement_.elementInfo_->GetTextMovementStep());
895      HILOG_DEBUG("ConvertTextMoveUnitToString: [%{public}s]", textMoveUnit.c_str());
896      if (textMoveUnit == "") {
897          callbackInfo->ret_ = RET_ERR_FAILED;
898          napi_get_undefined(callbackInfo->env_, &value);
899      } else {
900          callbackInfo->ret_ = RET_OK;
901          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
902              textMoveUnit.c_str(), NAPI_AUTO_LENGTH, &value));
903      }
904  }
905  
GetElementInfoParent(NAccessibilityElementData * callbackInfo,napi_value & value)906  void NAccessibilityElement::GetElementInfoParent(NAccessibilityElementData *callbackInfo, napi_value &value)
907  {
908      if (!CheckElementInfoParameter(callbackInfo, value)) {
909          return;
910      }
911      if (callbackInfo->ret_ == RET_OK) {
912          napi_value constructor = nullptr;
913          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_reference_value(callbackInfo->env_,
914              NAccessibilityElement::consRef_, &constructor));
915          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_new_instance(callbackInfo->env_,
916              constructor, 0, nullptr, &value));
917          ConvertElementInfoToJS(callbackInfo->env_, value, callbackInfo->nodeInfo_);
918      } else {
919          HILOG_ERROR("GetElementInfoParent failed!");
920          napi_get_undefined(callbackInfo->env_, &value);
921      }
922  }
923  
GetElementInfoChildren(NAccessibilityElementData * callbackInfo,napi_value & value)924  void NAccessibilityElement::GetElementInfoChildren(NAccessibilityElementData *callbackInfo, napi_value &value)
925  {
926      if (!CheckElementInfoParameter(callbackInfo, value)) {
927          return;
928      }
929      if (callbackInfo->ret_ == RET_OK) {
930          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_array(callbackInfo->env_, &value));
931          ConvertElementInfosToJS(callbackInfo->env_, value, callbackInfo->nodeInfos_);
932      } else {
933          HILOG_ERROR("GetElementInfoChildren failed!");
934          napi_get_undefined(callbackInfo->env_, &value);
935      }
936  }
937  
GetElementInfoTriggerAction(NAccessibilityElementData * callbackInfo,napi_value & value)938  void NAccessibilityElement::GetElementInfoTriggerAction(NAccessibilityElementData *callbackInfo, napi_value &value)
939  {
940      if (!CheckElementInfoParameter(callbackInfo, value)) {
941          return;
942      }
943      std::string triggerAction = ConvertOperationTypeToString(
944          callbackInfo->accessibilityElement_.elementInfo_->GetTriggerAction());
945      HILOG_DEBUG("GetElementInfoTriggerAction: [%{public}s]", triggerAction.c_str());
946      if (triggerAction == "") {
947          callbackInfo->ret_ = RET_ERR_FAILED;
948          napi_get_undefined(callbackInfo->env_, &value);
949      } else {
950          callbackInfo->ret_ = RET_OK;
951          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
952              triggerAction.c_str(), NAPI_AUTO_LENGTH, &value));
953      }
954  }
955  
GetElementInfoContents(NAccessibilityElementData * callbackInfo,napi_value & value)956  void NAccessibilityElement::GetElementInfoContents(NAccessibilityElementData *callbackInfo, napi_value &value)
957  {
958      if (!CheckElementInfoParameter(callbackInfo, value)) {
959          return;
960      }
961      std::vector<std::string> contents {};
962      callbackInfo->accessibilityElement_.elementInfo_->GetContentList(contents);
963      HILOG_DEBUG("contents size: [%{public}zu]", contents.size());
964  
965      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_array(callbackInfo->env_, &value));
966      size_t index = 0;
967      for (auto& content : contents) {
968          napi_value nContent = nullptr;
969          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
970              content.c_str(), NAPI_AUTO_LENGTH, &nContent));
971          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_set_element(callbackInfo->env_, value, index, nContent));
972          index++;
973      }
974  }
975  
GetElementInfoLastContent(NAccessibilityElementData * callbackInfo,napi_value & value)976  void NAccessibilityElement::GetElementInfoLastContent(NAccessibilityElementData *callbackInfo, napi_value &value)
977  {
978      if (!CheckElementInfoParameter(callbackInfo, value)) {
979          return;
980      }
981      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
982          callbackInfo->accessibilityElement_.elementInfo_->GetLatestContent().c_str(), NAPI_AUTO_LENGTH, &value));
983  }
984  
GetElementInfoWindowId(NAccessibilityElementData * callbackInfo,napi_value & value)985  void NAccessibilityElement::GetElementInfoWindowId(NAccessibilityElementData *callbackInfo, napi_value &value)
986  {
987      if (!CheckElementInfoParameter(callbackInfo, value)) {
988          return;
989      }
990      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
991          callbackInfo->accessibilityElement_.elementInfo_->GetWindowId(), &value));
992  }
993  
GetElementInfoMainWindowId(NAccessibilityElementData * callbackInfo,napi_value & value)994  void NAccessibilityElement::GetElementInfoMainWindowId(NAccessibilityElementData *callbackInfo, napi_value &value)
995  {
996      if (!CheckElementInfoParameter(callbackInfo, value)) {
997          return;
998      }
999      int32_t windowId = callbackInfo->accessibilityElement_.elementInfo_->GetWindowId();
1000      int32_t mainWindowId = callbackInfo->accessibilityElement_.elementInfo_->GetMainWindowId();
1001      if (mainWindowId <= 0) {
1002          mainWindowId = windowId;
1003          HILOG_INFO("mainWindowId <= 0, use windowId");
1004      }
1005      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_, mainWindowId, &value));
1006  }
1007  
GetElementInfoIsFocused(NAccessibilityElementData * callbackInfo,napi_value & value)1008  void NAccessibilityElement::GetElementInfoIsFocused(NAccessibilityElementData *callbackInfo, napi_value &value)
1009  {
1010      if (!CheckElementInfoParameter(callbackInfo, value)) {
1011          return;
1012      }
1013      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
1014          callbackInfo->accessibilityElement_.elementInfo_->IsFocused(), &value));
1015  }
1016  
GetElementInfoAccessibilityText(NAccessibilityElementData * callbackInfo,napi_value & value)1017  void NAccessibilityElement::GetElementInfoAccessibilityText(NAccessibilityElementData *callbackInfo, napi_value &value)
1018  {
1019      if (!CheckElementInfoParameter(callbackInfo, value)) {
1020          return;
1021      }
1022      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
1023          callbackInfo->accessibilityElement_.elementInfo_->GetAccessibilityText().c_str(), NAPI_AUTO_LENGTH, &value));
1024  }
1025  
GetElementInfoTextType(NAccessibilityElementData * callbackInfo,napi_value & value)1026  void NAccessibilityElement::GetElementInfoTextType(NAccessibilityElementData *callbackInfo, napi_value &value)
1027  {
1028      if (!CheckElementInfoParameter(callbackInfo, value)) {
1029          return;
1030      }
1031      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
1032          callbackInfo->accessibilityElement_.elementInfo_->GetTextType().c_str(), NAPI_AUTO_LENGTH, &value));
1033  }
1034  
GetElementInfoOffset(NAccessibilityElementData * callbackInfo,napi_value & value)1035  void NAccessibilityElement::GetElementInfoOffset(NAccessibilityElementData *callbackInfo, napi_value &value)
1036  {
1037      if (!CheckElementInfoParameter(callbackInfo, value)) {
1038          return;
1039      }
1040      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_double(callbackInfo->env_,
1041          callbackInfo->accessibilityElement_.elementInfo_->GetOffset(), &value));
1042  }
1043  
GetElementInfoAccessibilityGroup(NAccessibilityElementData * callbackInfo,napi_value & value)1044  void NAccessibilityElement::GetElementInfoAccessibilityGroup(NAccessibilityElementData *callbackInfo, napi_value &value)
1045  {
1046      if (!CheckElementInfoParameter(callbackInfo, value)) {
1047          return;
1048      }
1049      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
1050          callbackInfo->accessibilityElement_.elementInfo_->GetAccessibilityGroup(), &value));
1051  }
1052  
GetElementInfoAccessibilityLevel(NAccessibilityElementData * callbackInfo,napi_value & value)1053  void NAccessibilityElement::GetElementInfoAccessibilityLevel(NAccessibilityElementData *callbackInfo, napi_value &value)
1054  {
1055      if (!CheckElementInfoParameter(callbackInfo, value)) {
1056          return;
1057      }
1058      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
1059          callbackInfo->accessibilityElement_.elementInfo_->GetAccessibilityLevel().c_str(), NAPI_AUTO_LENGTH, &value));
1060  }
1061  
GetElementInfoNavDestinationId(NAccessibilityElementData * callbackInfo,napi_value & value)1062  void NAccessibilityElement::GetElementInfoNavDestinationId(NAccessibilityElementData *callbackInfo, napi_value &value)
1063  {
1064      if (!CheckElementInfoParameter(callbackInfo, value)) {
1065          return;
1066      }
1067      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int64(callbackInfo->env_,
1068          callbackInfo->accessibilityElement_.elementInfo_->GetNavDestinationId(), &value));
1069  }
1070  
GetElementInfoSpan(NAccessibilityElementData * callbackInfo,napi_value & value)1071  void NAccessibilityElement::GetElementInfoSpan(NAccessibilityElementData *callbackInfo, napi_value &value)
1072  {
1073      if (!CheckElementInfoParameter(callbackInfo, value)) {
1074          return;
1075      }
1076      std::vector<SpanInfo> spanInfo {};
1077      spanInfo = callbackInfo->accessibilityElement_.elementInfo_->GetSpanList();
1078      HILOG_DEBUG("spanInfo size: [%{public}zu]", spanInfo.size());
1079  
1080      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_array(callbackInfo->env_, &value));
1081      size_t index = 0;
1082      napi_status status;
1083      for (auto& span : spanInfo) {
1084          napi_value result = nullptr;
1085          status = napi_create_object(callbackInfo->env_, &result);
1086          if (status != napi_ok) {
1087              HILOG_DEBUG("cant create napi object!");
1088              return;
1089          }
1090          ConvertSpanToJS(callbackInfo->env_, result, span);
1091          HILOG_DEBUG("ConvertSpanToJS spanInfo spanid: [%{public}d]", span.GetSpanId());
1092          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_set_element(callbackInfo->env_, value, index, result));
1093          index++;
1094      }
1095  }
1096  
GetElementInfoIsActive(NAccessibilityElementData * callbackInfo,napi_value & value)1097  void NAccessibilityElement::GetElementInfoIsActive(NAccessibilityElementData *callbackInfo, napi_value &value)
1098  {
1099      if (!CheckElementInfoParameter(callbackInfo, value)) {
1100          return;
1101      }
1102      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int64(callbackInfo->env_,
1103          callbackInfo->accessibilityElement_.elementInfo_->GetIsActive(), &value));
1104  }
1105  
GetElementInfoAccessibilityVisible(NAccessibilityElementData * callbackInfo,napi_value & value)1106  void NAccessibilityElement::GetElementInfoAccessibilityVisible(
1107      NAccessibilityElementData *callbackInfo, napi_value &value)
1108  {
1109      if (!CheckElementInfoParameter(callbackInfo, value)) {
1110          return;
1111      }
1112      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int64(callbackInfo->env_,
1113          callbackInfo->accessibilityElement_.elementInfo_->GetAccessibilityVisible(), &value));
1114  }
1115  
GetElementInfoAllAttribute(NAccessibilityElementData * callbackInfo,napi_value & value)1116  void NAccessibilityElement::GetElementInfoAllAttribute(NAccessibilityElementData *callbackInfo, napi_value &value)
1117  {
1118      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_object(callbackInfo->env_, &value));
1119      if (CheckElementInfoParameter(callbackInfo, value)) {
1120          GetElementInfoAllAttribute1(callbackInfo, value);
1121          GetElementInfoAllAttribute2(callbackInfo, value);
1122          GetElementInfoAllAttribute3(callbackInfo, value);
1123          GetElementInfoAllAttribute4(callbackInfo, value);
1124          GetElementInfoAllAttribute5(callbackInfo, value);
1125      } else if (CheckWindowInfoParameter(callbackInfo, value)) {
1126          GetWindowInfoAllAttribute(callbackInfo, value);
1127      } else {
1128          return;
1129      }
1130  }
1131  
GetElementInfoAllAttribute1(NAccessibilityElementData * callbackInfo,napi_value & value)1132  void NAccessibilityElement::GetElementInfoAllAttribute1(NAccessibilityElementData *callbackInfo, napi_value &value)
1133  {
1134      napi_env env = callbackInfo->env_;
1135      napi_value componentId = nullptr;
1136      GetElementInfoComponentId(callbackInfo, componentId);
1137      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "componentId", componentId));
1138  
1139      napi_value inspectorKey = nullptr;
1140      GetElementInfoInspectorKey(callbackInfo, inspectorKey);
1141      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "inspectorKey", inspectorKey));
1142  
1143      napi_value bundleName = nullptr;
1144      GetElementInfoBundleName(callbackInfo, bundleName);
1145      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "bundleName", bundleName));
1146  
1147      napi_value componentType = nullptr;
1148      GetElementInfoComponentType(callbackInfo, componentType);
1149      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "componentType", componentType));
1150  
1151      napi_value inputType = nullptr;
1152      GetElementInfoInputType(callbackInfo, inputType);
1153      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "inputType", inputType));
1154  
1155      napi_value text = nullptr;
1156      GetElementInfoText(callbackInfo, text);
1157      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "text", text));
1158  
1159      napi_value hintText = nullptr;
1160      GetElementInfoHintText(callbackInfo, hintText);
1161      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "hintText", hintText));
1162  
1163      napi_value description = nullptr;
1164      GetElementInfoDescription(callbackInfo, description);
1165      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "description", description));
1166  
1167      napi_value resourceName = nullptr;
1168      GetElementInfoResourceName(callbackInfo, resourceName);
1169      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "resourceName", resourceName));
1170  }
1171  
GetElementInfoAllAttribute2(NAccessibilityElementData * callbackInfo,napi_value & value)1172  void NAccessibilityElement::GetElementInfoAllAttribute2(NAccessibilityElementData *callbackInfo, napi_value &value)
1173  {
1174      napi_env env = callbackInfo->env_;
1175      napi_value textLengthLimit = nullptr;
1176      GetElementInfoTextLengthLimit(callbackInfo, textLengthLimit);
1177      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "textLengthLimit", textLengthLimit));
1178  
1179      napi_value rect = nullptr;
1180      GetElementInfoRect(callbackInfo, rect);
1181      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "rect", rect));
1182  
1183      napi_value checkable = nullptr;
1184      GetElementInfoCheckable(callbackInfo, checkable);
1185      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "checkable", checkable));
1186  
1187      napi_value checked = nullptr;
1188      GetElementInfoChecked(callbackInfo, checked);
1189      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "checked", checked));
1190  
1191      napi_value focusable = nullptr;
1192      GetElementInfoFocusable(callbackInfo, focusable);
1193      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "focusable", focusable));
1194  
1195      napi_value isVisible = nullptr;
1196      GetElementInfoIsVisible(callbackInfo, isVisible);
1197      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "isVisible", isVisible));
1198  
1199      napi_value selected = nullptr;
1200      GetElementInfoSelected(callbackInfo, selected);
1201      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "selected", selected));
1202  
1203      napi_value clickable = nullptr;
1204      GetElementInfoClickable(callbackInfo, clickable);
1205      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "clickable", clickable));
1206  
1207      napi_value longClickable = nullptr;
1208      GetElementInfoLongClickable(callbackInfo, longClickable);
1209      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "longClickable", longClickable));
1210  
1211      napi_value isEnable = nullptr;
1212      GetElementInfoIsEnable(callbackInfo, isEnable);
1213      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "isEnable", isEnable));
1214  
1215      napi_value isPassword = nullptr;
1216      GetElementInfoIsPassword(callbackInfo, isPassword);
1217      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "isPassword", isPassword));
1218  }
1219  
GetElementInfoAllAttribute3(NAccessibilityElementData * callbackInfo,napi_value & value)1220  void NAccessibilityElement::GetElementInfoAllAttribute3(NAccessibilityElementData *callbackInfo, napi_value &value)
1221  {
1222      napi_env env = callbackInfo->env_;
1223      napi_value scrollable = nullptr;
1224      GetElementInfoScrollable(callbackInfo, scrollable);
1225      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "scrollable", scrollable));
1226  
1227      napi_value editable = nullptr;
1228      GetElementInfoEditable(callbackInfo, editable);
1229      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "editable", editable));
1230  
1231      napi_value pluralLineSupported = nullptr;
1232      GetElementInfoPluralLineSupported(callbackInfo, pluralLineSupported);
1233      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "pluralLineSupported", pluralLineSupported));
1234  
1235      napi_value itemCount = nullptr;
1236      GetElementInfoItemCount(callbackInfo, itemCount);
1237      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "itemCount", itemCount));
1238  
1239      napi_value grid = nullptr;
1240      GetElementInfoGridItem(callbackInfo, grid);
1241      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "grid", grid));
1242  
1243      napi_value currentIndex = nullptr;
1244      GetElementInfoCurrentIndex(callbackInfo, currentIndex);
1245      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "currentIndex", currentIndex));
1246  
1247      napi_value startIndex = nullptr;
1248      GetElementInfoStartIndex(callbackInfo, startIndex);
1249      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "startIndex", startIndex));
1250  
1251      napi_value endIndex = nullptr;
1252      GetElementInfoEndIndex(callbackInfo, endIndex);
1253      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "endIndex", endIndex));
1254  
1255      napi_value textMoveUnit = nullptr;
1256      GetElementInfoTextMoveUnit(callbackInfo, textMoveUnit);
1257      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "textMoveUnit", textMoveUnit));
1258  
1259      napi_value triggerAction = nullptr;
1260      std::string action = ConvertOperationTypeToString(
1261          callbackInfo->accessibilityElement_.elementInfo_->GetTriggerAction());
1262      if (action == "") {
1263          napi_get_undefined(callbackInfo->env_, &triggerAction);
1264      } else {
1265          NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, action.c_str(), NAPI_AUTO_LENGTH, &triggerAction));
1266      }
1267      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "triggerAction", triggerAction));
1268  
1269      napi_value contents = nullptr;
1270      GetElementInfoContents(callbackInfo, contents);
1271      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "contents", contents));
1272  
1273      napi_value navDestinationId = nullptr;
1274      GetElementInfoNavDestinationId(callbackInfo, navDestinationId);
1275      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "navDestinationId", navDestinationId));
1276  }
1277  
GetElementInfoAllAttribute4(NAccessibilityElementData * callbackInfo,napi_value & value)1278  void NAccessibilityElement::GetElementInfoAllAttribute4(NAccessibilityElementData *callbackInfo, napi_value &value)
1279  {
1280      napi_env env = callbackInfo->env_;
1281      napi_value lastContent = nullptr;
1282      GetElementInfoLastContent(callbackInfo, lastContent);
1283      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "lastContent", lastContent));
1284  
1285      napi_value isFocused = nullptr;
1286      GetElementInfoIsFocused(callbackInfo, isFocused);
1287      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "isFocused", isFocused));
1288  
1289      napi_value accessibilityFocused = nullptr;
1290      GetElementInfoAccessibilityFocused(callbackInfo, accessibilityFocused);
1291      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "accessibilityFocused", accessibilityFocused));
1292  
1293      napi_value error = nullptr;
1294      GetElementInfoError(callbackInfo, error);
1295      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "error", error));
1296  
1297      napi_value isHint = nullptr;
1298      GetElementInfoIsHint(callbackInfo, isHint);
1299      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "isHint", isHint));
1300  
1301      napi_value pageId = nullptr;
1302      GetElementInfoPageId(callbackInfo, pageId);
1303      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "pageId", pageId));
1304  
1305      napi_value valueMax = nullptr;
1306      GetElementInfoValueMax(callbackInfo, valueMax);
1307      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "valueMax", valueMax));
1308  
1309      napi_value valueMin = nullptr;
1310      GetElementInfoValueMin(callbackInfo, valueMin);
1311      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "valueMin", valueMin));
1312  
1313      napi_value valueNow = nullptr;
1314      GetElementInfoValueNow(callbackInfo, valueNow);
1315      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "valueNow", valueNow));
1316  
1317      napi_value windowId = nullptr;
1318      GetElementInfoWindowId(callbackInfo, windowId);
1319      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "windowId", windowId));
1320  
1321      napi_value accessibilityText = nullptr;
1322      GetElementInfoAccessibilityText(callbackInfo, accessibilityText);
1323      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "accessibilityText", accessibilityText));
1324  
1325      napi_value textType = nullptr;
1326      GetElementInfoTextType(callbackInfo, textType);
1327      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "textType", textType));
1328  
1329      napi_value offset = nullptr;
1330      GetElementInfoOffset(callbackInfo, offset);
1331      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "offset", offset));
1332  
1333      napi_value accessibilityGroup = nullptr;
1334      GetElementInfoAccessibilityGroup(callbackInfo, accessibilityGroup);
1335      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "accessibilityGroup", accessibilityGroup));
1336  
1337      napi_value accessibilityLevel = nullptr;
1338      GetElementInfoAccessibilityLevel(callbackInfo, accessibilityLevel);
1339      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "accessibilityLevel", accessibilityLevel));
1340  }
1341  
GetElementInfoAllAttribute5(NAccessibilityElementData * callbackInfo,napi_value & value)1342  void NAccessibilityElement::GetElementInfoAllAttribute5(NAccessibilityElementData *callbackInfo, napi_value &value)
1343  {
1344      napi_env env = callbackInfo->env_;
1345      napi_value checkBox = nullptr;
1346      GetElementInfoCheckboxGroup(callbackInfo, checkBox);
1347      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "checkboxGroupSelectedStatus", checkBox));
1348  
1349      napi_value row = nullptr;
1350      GetElementInfoRow(callbackInfo, row);
1351      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "row", row));
1352  
1353      napi_value column = nullptr;
1354      GetElementInfoColumn(callbackInfo, column);
1355      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "column", column));
1356  
1357      napi_value sideBarContainer = nullptr;
1358      GetElementInfoSideBarContainer(callbackInfo, sideBarContainer);
1359      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "sideBarContainerStates", sideBarContainer));
1360  
1361      napi_value listItemIndex = nullptr;
1362      GetElementInfoListItemIndex(callbackInfo, listItemIndex);
1363      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "listItemIndex", listItemIndex));
1364  
1365      napi_value span = nullptr;
1366      GetElementInfoSpan(callbackInfo, span);
1367      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "span", span));
1368  
1369      napi_value isActive = nullptr;
1370      GetElementInfoIsActive(callbackInfo, isActive);
1371      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "isActive", isActive));
1372  
1373      napi_value accessibilityVisible = nullptr;
1374      GetElementInfoAccessibilityVisible(callbackInfo, accessibilityVisible);
1375      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "accessibilityVisible", accessibilityVisible));
1376  
1377      napi_value mainWindowId = nullptr;
1378      GetElementInfoMainWindowId(callbackInfo, mainWindowId);
1379      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "mainWindowId", mainWindowId));
1380  }
1381  
GetWindowInfoAllAttribute(NAccessibilityElementData * callbackInfo,napi_value & value)1382  void NAccessibilityElement::GetWindowInfoAllAttribute(NAccessibilityElementData *callbackInfo, napi_value &value)
1383  {
1384      napi_env env = callbackInfo->env_;
1385      napi_value isActive = nullptr;
1386      GetWindowInfoIsActive(callbackInfo, isActive);
1387      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "isActive", isActive));
1388  
1389      napi_value screenRect = nullptr;
1390      GetWindowInfoScreenRect(callbackInfo, screenRect);
1391      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "screenRect", screenRect));
1392  
1393      napi_value layer = nullptr;
1394      GetWindowInfoLayer(callbackInfo, layer);
1395      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "layer", layer));
1396  
1397      napi_value type = nullptr;
1398      GetWindowInfoType(callbackInfo, type);
1399      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "type", type));
1400  
1401      napi_value isFocused = nullptr;
1402      GetWindowInfoIsFocused(callbackInfo, isFocused);
1403      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "isFocused", isFocused));
1404  
1405      napi_value windowId = nullptr;
1406      GetWindowInfoWindowId(callbackInfo, windowId);
1407      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "windowId", windowId));
1408  
1409      napi_value mainWindowId = nullptr;
1410      GetWindowInfoMainWindowId(callbackInfo, mainWindowId);
1411      NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "mainWindowId", mainWindowId));
1412  }
1413  
CheckWindowInfoParameter(NAccessibilityElementData * callbackInfo,napi_value & value)1414  bool NAccessibilityElement::CheckWindowInfoParameter(NAccessibilityElementData *callbackInfo, napi_value &value)
1415  {
1416      if (callbackInfo == nullptr) {
1417          HILOG_ERROR("callbackInfo is nullptr");
1418          return false;
1419      }
1420      if (!callbackInfo->accessibilityElement_.windowInfo_) {
1421          HILOG_ERROR("window info is nullptr");
1422          napi_get_undefined(callbackInfo->env_, &value);
1423          callbackInfo->ret_ = RET_ERR_FAILED;
1424          return false;
1425      }
1426      return true;
1427  }
1428  
GetWindowInfoIsActive(NAccessibilityElementData * callbackInfo,napi_value & value)1429  void NAccessibilityElement::GetWindowInfoIsActive(NAccessibilityElementData *callbackInfo, napi_value &value)
1430  {
1431      if (!CheckWindowInfoParameter(callbackInfo, value)) {
1432          return;
1433      }
1434      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
1435          callbackInfo->accessibilityElement_.windowInfo_->IsActive(), &value));
1436  }
1437  
GetWindowInfoScreenRect(NAccessibilityElementData * callbackInfo,napi_value & value)1438  void NAccessibilityElement::GetWindowInfoScreenRect(NAccessibilityElementData *callbackInfo, napi_value &value)
1439  {
1440      if (!CheckWindowInfoParameter(callbackInfo, value)) {
1441          return;
1442      }
1443      OHOS::Accessibility::Rect screenRect = callbackInfo->accessibilityElement_.windowInfo_->GetRectInScreen();
1444      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_object(callbackInfo->env_, &value));
1445      ConvertRectToJS(callbackInfo->env_, value, screenRect);
1446  }
1447  
GetWindowInfoLayer(NAccessibilityElementData * callbackInfo,napi_value & value)1448  void NAccessibilityElement::GetWindowInfoLayer(NAccessibilityElementData *callbackInfo, napi_value &value)
1449  {
1450      if (!CheckWindowInfoParameter(callbackInfo, value)) {
1451          return;
1452      }
1453      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
1454          callbackInfo->accessibilityElement_.windowInfo_->GetWindowLayer(), &value));
1455  }
1456  
GetWindowInfoType(NAccessibilityElementData * callbackInfo,napi_value & value)1457  void NAccessibilityElement::GetWindowInfoType(NAccessibilityElementData *callbackInfo, napi_value &value)
1458  {
1459      if (!CheckWindowInfoParameter(callbackInfo, value)) {
1460          return;
1461      }
1462      std::string accessibilityWindowType = ConvertWindowTypeToString(
1463          callbackInfo->accessibilityElement_.windowInfo_->GetAccessibilityWindowType());
1464      HILOG_DEBUG("GetWindowInfoType: [%{public}s]", accessibilityWindowType.c_str());
1465      if (accessibilityWindowType == "") {
1466          callbackInfo->ret_ = RET_ERR_FAILED;
1467          napi_get_undefined(callbackInfo->env_, &value);
1468      } else {
1469          callbackInfo->ret_ = RET_OK;
1470          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_string_utf8(callbackInfo->env_,
1471              accessibilityWindowType.c_str(), NAPI_AUTO_LENGTH, &value));
1472      }
1473  }
1474  
GetWindowInfoRootElement(NAccessibilityElementData * callbackInfo,napi_value & value)1475  void NAccessibilityElement::GetWindowInfoRootElement(NAccessibilityElementData *callbackInfo, napi_value &value)
1476  {
1477      if (!CheckWindowInfoParameter(callbackInfo, value)) {
1478          return;
1479      }
1480      if (callbackInfo->ret_ == RET_OK) {
1481          napi_value constructor = nullptr;
1482          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_reference_value(callbackInfo->env_,
1483              NAccessibilityElement::consRef_, &constructor));
1484          NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_new_instance(callbackInfo->env_,
1485              constructor, 0, nullptr, &value));
1486          ConvertElementInfoToJS(callbackInfo->env_, value, callbackInfo->nodeInfo_);
1487      } else {
1488          HILOG_ERROR("GetWindowInfoRootElement failed!");
1489          napi_get_undefined(callbackInfo->env_, &value);
1490      }
1491  }
1492  
GetWindowInfoIsFocused(NAccessibilityElementData * callbackInfo,napi_value & value)1493  void NAccessibilityElement::GetWindowInfoIsFocused(NAccessibilityElementData *callbackInfo, napi_value &value)
1494  {
1495      if (!CheckWindowInfoParameter(callbackInfo, value)) {
1496          return;
1497      }
1498      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_get_boolean(callbackInfo->env_,
1499          callbackInfo->accessibilityElement_.windowInfo_->IsFocused(), &value));
1500  }
1501  
GetWindowInfoWindowId(NAccessibilityElementData * callbackInfo,napi_value & value)1502  void NAccessibilityElement::GetWindowInfoWindowId(NAccessibilityElementData *callbackInfo, napi_value &value)
1503  {
1504      if (!CheckWindowInfoParameter(callbackInfo, value)) {
1505          return;
1506      }
1507      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
1508          callbackInfo->accessibilityElement_.windowInfo_->GetWindowId(), &value));
1509  }
1510  
GetWindowInfoMainWindowId(NAccessibilityElementData * callbackInfo,napi_value & value)1511  void NAccessibilityElement::GetWindowInfoMainWindowId(NAccessibilityElementData *callbackInfo, napi_value &value)
1512  {
1513      if (!CheckWindowInfoParameter(callbackInfo, value)) {
1514          return;
1515      }
1516      NAPI_CALL_RETURN_VOID(callbackInfo->env_, napi_create_int32(callbackInfo->env_,
1517          callbackInfo->accessibilityElement_.windowInfo_->GetMainWindowId(), &value));
1518  }
1519  
ActionNames(napi_env env,napi_callback_info info)1520  napi_value NAccessibilityElement::ActionNames(napi_env env, napi_callback_info info)
1521  {
1522      size_t argc = ARGS_SIZE_ONE;
1523      napi_value argv = nullptr;
1524      napi_value thisVar = nullptr;
1525      void* data = nullptr;
1526      NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisVar, &data));
1527      HILOG_DEBUG("argc = %{public}zu", argc);
1528  
1529      NAccessibilityElementData *callbackInfo = new(std::nothrow) NAccessibilityElementData();
1530      if (callbackInfo == nullptr) {
1531          HILOG_ERROR("Failed to create callbackInfo.");
1532          return nullptr;
1533      }
1534      callbackInfo->env_ = env;
1535  
1536      napi_value promise = nullptr;
1537      if (argc > ARGS_SIZE_ONE - 1) {
1538          napi_valuetype valueType = napi_null;
1539          napi_typeof(env, argv, &valueType);
1540          if (valueType == napi_function) {
1541              napi_create_reference(env, argv, 1, &callbackInfo->callback_);
1542              napi_get_undefined(env, &promise);
1543          } else {
1544              napi_create_promise(env, &callbackInfo->deferred_, &promise);
1545          }
1546      } else {
1547          napi_create_promise(env, &callbackInfo->deferred_, &promise);
1548      }
1549  
1550      AccessibilityElement* accessibilityElement = nullptr;
1551      napi_status status = napi_unwrap(env, thisVar, (void**)&accessibilityElement);
1552      if (!accessibilityElement || status != napi_ok) {
1553          HILOG_ERROR("accessibilityElement is null or status[%{public}d] is wrong", status);
1554          return ErrorOperation(callbackInfo);
1555      }
1556      callbackInfo->accessibilityElement_ = *accessibilityElement;
1557      if (!callbackInfo->accessibilityElement_.isElementInfo_) {
1558          HILOG_ERROR("it is not element info");
1559          return ErrorOperation(callbackInfo);
1560      }
1561  
1562      napi_value resource = nullptr;
1563      napi_create_string_utf8(env, "ActionNames", NAPI_AUTO_LENGTH, &resource);
1564      if (resource == nullptr) {
1565          HILOG_ERROR("resource is nullptr.");
1566          return nullptr;
1567      }
1568  
1569      napi_create_async_work(env, nullptr, resource, [](napi_env env, void* data) {},
1570          // Execute the complete function
1571          ActionNamesComplete,
1572          reinterpret_cast<void*>(callbackInfo),
1573          &callbackInfo->work_);
1574      napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
1575      return promise;
1576  }
1577  
ActionNamesComplete(napi_env env,napi_status status,void * data)1578  void NAccessibilityElement::ActionNamesComplete(napi_env env, napi_status status, void* data)
1579  {
1580      HILOG_DEBUG("ActionNamesComplete execute back");
1581      NAccessibilityElementData* callbackInfo = static_cast<NAccessibilityElementData*>(data);
1582      napi_value result[ARGS_SIZE_TWO] = {0};
1583      napi_value callback = 0;
1584      napi_value undefined = 0;
1585      napi_get_undefined(env, &undefined);
1586      if (callbackInfo == nullptr) {
1587          HILOG_ERROR("callbackInfo is nullptr");
1588          return;
1589      }
1590  
1591      if (callbackInfo->accessibilityElement_.elementInfo_) {
1592          std::vector<std::string> actionNames {};
1593          std::vector<AccessibleAction> operations =
1594              callbackInfo->accessibilityElement_.elementInfo_->GetActionList();
1595          HILOG_DEBUG("action list size is %{public}zu", operations.size());
1596          actionNames.resize(operations.size());
1597          std::transform(operations.begin(), operations.end(), actionNames.begin(),
1598              [](const AccessibleAction operation) {
1599                  return ConvertOperationTypeToString(operation.GetActionType());
1600              });
1601          napi_create_array(env, &result[PARAM1]);
1602          ConvertStringVecToJS(env, result[PARAM1], actionNames);
1603          callbackInfo->ret_ = RET_OK;
1604      } else {
1605          HILOG_ERROR("no elementInfo_");
1606          callbackInfo->ret_ = RET_ERR_FAILED;
1607          napi_get_undefined(env, &result[PARAM1]);
1608      }
1609  
1610      result[PARAM0] = CreateBusinessError(env, callbackInfo->ret_);
1611      if (callbackInfo->callback_) {
1612          // Callback mode
1613          napi_get_reference_value(env, callbackInfo->callback_, &callback);
1614          napi_value returnVal = nullptr;
1615          napi_call_function(env, undefined, callback, ARGS_SIZE_TWO, result, &returnVal);
1616          napi_delete_reference(env, callbackInfo->callback_);
1617      } else {
1618          // Promise mode
1619          if (callbackInfo->accessibilityElement_.elementInfo_) {
1620              napi_resolve_deferred(env, callbackInfo->deferred_, result[PARAM1]);
1621          } else {
1622              napi_reject_deferred(env, callbackInfo->deferred_, result[PARAM0]);
1623          }
1624      }
1625      napi_delete_async_work(env, callbackInfo->work_);
1626      delete callbackInfo;
1627      callbackInfo = nullptr;
1628  }
1629  
EnableScreenCurtain(napi_env env,napi_callback_info info)1630  napi_value NAccessibilityElement::EnableScreenCurtain(napi_env env, napi_callback_info info)
1631  {
1632      HILOG_INFO("enter NAccessibilityElement::EnableScreenCurtain");
1633  
1634      size_t argc = ARGS_SIZE_ONE;
1635      napi_value argv[ARGS_SIZE_ONE] = { 0 };
1636      napi_value thisVar = nullptr;
1637      void* data = nullptr;
1638      napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1639      if (status != napi_ok) {
1640          HILOG_ERROR("Failed to get cb info");
1641          napi_value err = CreateBusinessError(env, RetError::RET_ERR_FAILED);
1642          napi_throw(env, err);
1643          return nullptr;
1644      }
1645  
1646      //get value from ui
1647      bool isEnable = true;
1648      napi_get_value_bool(env, argv[0], &isEnable);
1649      HILOG_INFO("ui argv[0] isEnable = %{public}d", isEnable);
1650  
1651      //pass valule to server
1652      RetError errStatus = AccessibleAbilityClient::GetInstance()->EnableScreenCurtain(isEnable);
1653      if (errStatus == RET_ERR_NOT_SYSTEM_APP) {
1654          napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NOT_SYSTEM_APP);
1655          napi_throw(env, err);
1656          HILOG_ERROR("is not system app");
1657          return nullptr;
1658      }
1659      return thisVar;
1660  }
1661  
PerformAction(napi_env env,napi_callback_info info)1662  napi_value NAccessibilityElement::PerformAction(napi_env env, napi_callback_info info)
1663  {
1664      size_t argc = ARGS_SIZE_THREE;
1665      napi_value argv[ARGS_SIZE_THREE] = {0};
1666      napi_value thisVar = nullptr;
1667      void* data = nullptr;
1668      napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1669      if (status != napi_ok) {
1670          HILOG_ERROR("Failed to get cb info");
1671          napi_value err = CreateBusinessError(env, RetError::RET_ERR_FAILED);
1672          napi_throw(env, err);
1673          return nullptr;
1674      }
1675      HILOG_DEBUG("argc = %{public}zu", argc);
1676  
1677      AccessibilityElement* accessibilityElement = UnrapAccessibilityElement(env, thisVar);
1678      if (!accessibilityElement) {
1679          return nullptr;
1680      }
1681      std::string actionName;
1682      NAccessibilityErrorCode errCode = NAccessibilityErrorCode::ACCESSIBILITY_OK;
1683      if (argc < ARGS_SIZE_ONE || !ParseString(env, actionName, argv[PARAM0])) {
1684          HILOG_ERROR("argc is invalid: %{public}zu", argc);
1685          errCode = NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM;
1686          delete accessibilityElement;
1687          accessibilityElement = nullptr;
1688          napi_value err = CreateBusinessError(env, RetError::RET_ERR_INVALID_PARAM);
1689          HILOG_ERROR("invalid param");
1690          napi_throw(env, err);
1691          return nullptr;
1692      }
1693      return PerformActionAsync(env, argc, argv, actionName, accessibilityElement);
1694  }
1695  
UnrapAccessibilityElement(napi_env env,napi_value thisVar)1696  AccessibilityElement* NAccessibilityElement::UnrapAccessibilityElement(napi_env env, napi_value thisVar)
1697  {
1698      AccessibilityElement* accessibilityElement = nullptr;
1699      napi_status status = napi_unwrap(env, thisVar, (void**)&accessibilityElement);
1700      if (!accessibilityElement || status != napi_ok) {
1701          HILOG_ERROR("accessibilityElement is null or status[%{public}d] is wrong", status);
1702          napi_value err = CreateBusinessError(env, RetError::RET_ERR_NULLPTR);
1703          napi_throw(env, err);
1704          return nullptr;
1705      }
1706      if (!(accessibilityElement->isElementInfo_ && accessibilityElement->elementInfo_)) {
1707          HILOG_ERROR("accessibilityElement is wrong. isElementInfo_[%{public}d]", accessibilityElement->isElementInfo_);
1708          napi_value err = CreateBusinessError(env, RetError::RET_ERR_FAILED);
1709          napi_throw(env, err);
1710          return nullptr;
1711      }
1712      return accessibilityElement;
1713  }
1714  
PerformActionAsync(napi_env env,size_t argc,napi_value * argv,std::string actionName,AccessibilityElement * accessibilityElement)1715  napi_value NAccessibilityElement::PerformActionAsync(napi_env env, size_t argc, napi_value* argv,
1716      std::string actionName, AccessibilityElement* accessibilityElement)
1717  {
1718      NAccessibilityElementData *callbackInfo = new(std::nothrow) NAccessibilityElementData();
1719      if (callbackInfo == nullptr) {
1720          HILOG_ERROR("Failed to create callbackInfo.");
1721          napi_value err = CreateBusinessError(env, RetError::RET_ERR_NULLPTR);
1722          napi_throw(env, err);
1723          return nullptr;
1724      }
1725      callbackInfo->env_ = env;
1726      callbackInfo->accessibilityElement_ = *accessibilityElement;
1727  
1728      return PerformActionConstructPromise(env, argc, argv, callbackInfo, actionName);
1729  }
1730  
PerformActionConstructPromise(napi_env env,size_t argc,napi_value * argv,NAccessibilityElementData * callbackInfo,std::string actionName)1731  napi_value NAccessibilityElement::PerformActionConstructPromise(napi_env env, size_t argc, napi_value* argv,
1732      NAccessibilityElementData* callbackInfo, std::string actionName)
1733  {
1734      napi_value promise = nullptr;
1735      std::map<std::string, std::string> actionArguments {};
1736      if (argc >= ARGS_SIZE_THREE) {
1737          napi_valuetype secondParamType = napi_null;
1738          napi_typeof(env, argv[PARAM1], &secondParamType);
1739          napi_valuetype thirdParamType = napi_null;
1740          napi_typeof(env, argv[PARAM2], &thirdParamType);
1741          if (thirdParamType == napi_function) {
1742              if (secondParamType == napi_object) {
1743                  ConvertActionArgsJSToNAPI(env, argv[PARAM1], actionArguments,
1744                      ConvertStringToAccessibleOperationType(actionName));
1745              }
1746              napi_create_reference(env, argv[PARAM2], 1, &callbackInfo->callback_);
1747              napi_get_undefined(env, &promise);
1748          } else if (secondParamType == napi_function) {
1749              napi_create_reference(env, argv[PARAM1], 1, &callbackInfo->callback_);
1750              napi_get_undefined(env, &promise);
1751          } else {
1752              HILOG_DEBUG("argc is three, use promise");
1753              napi_create_promise(env, &callbackInfo->deferred_, &promise);
1754          }
1755      } else if (argc == ARGS_SIZE_TWO) {
1756          napi_valuetype valueType = napi_null;
1757          napi_typeof(env, argv[PARAM1], &valueType);
1758          if (valueType == napi_function) {
1759              napi_create_reference(env, argv[PARAM1], 1, &callbackInfo->callback_);
1760              napi_get_undefined(env, &promise);
1761          } else {
1762              if (valueType == napi_object) {
1763                  ConvertActionArgsJSToNAPI(env, argv[PARAM1], actionArguments,
1764                      ConvertStringToAccessibleOperationType(actionName));
1765              }
1766              HILOG_DEBUG("argc is two, use promise");
1767              napi_create_promise(env, &callbackInfo->deferred_, &promise);
1768          }
1769      } else {
1770          HILOG_DEBUG("argc is others, use promise");
1771          napi_create_promise(env, &callbackInfo->deferred_, &promise);
1772      }
1773  
1774      callbackInfo->actionName_ = actionName;
1775      callbackInfo->actionArguments_ = actionArguments;
1776      napi_value resource = nullptr;
1777      napi_create_string_utf8(env, "PerformAction", NAPI_AUTO_LENGTH, &resource);
1778      napi_create_async_work(env, nullptr, resource, PerformActionExecute, PerformActionComplete,
1779          reinterpret_cast<void*>(callbackInfo), &callbackInfo->work_);
1780      napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
1781      return promise;
1782  }
1783  
PerformActionExecute(napi_env env,void * data)1784  void NAccessibilityElement::PerformActionExecute(napi_env env, void* data)
1785  {
1786      HILOG_DEBUG("PerformActionExecute");
1787      NAccessibilityElementData *callbackInfo = static_cast<NAccessibilityElementData*>(data);
1788      if (callbackInfo == nullptr) {
1789          HILOG_ERROR("callbackInfo is nullptr");
1790          return;
1791      }
1792  
1793      ActionType action = ConvertStringToAccessibleOperationType(callbackInfo->actionName_);
1794      if (action == ActionType::ACCESSIBILITY_ACTION_INVALID) {
1795          HILOG_ERROR("The action is not supported");
1796          callbackInfo->ret_ = OHOS::Accessibility::RetError::RET_ERR_ACTION_NOT_SUPPORT;
1797          return;
1798      }
1799      callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->ExecuteAction(
1800          *callbackInfo->accessibilityElement_.elementInfo_, action, callbackInfo->actionArguments_);
1801      HILOG_DEBUG("callbackInfo->ret_[%{public}d]", callbackInfo->ret_);
1802  }
1803  
PerformActionComplete(napi_env env,napi_status status,void * data)1804  void NAccessibilityElement::PerformActionComplete(napi_env env, napi_status status, void* data)
1805  {
1806      HILOG_DEBUG("PerformActionComplete execute back");
1807      NAccessibilityElementData* callbackInfo = static_cast<NAccessibilityElementData*>(data);
1808      if (callbackInfo == nullptr) {
1809          HILOG_ERROR("callbackInfo is nullptr");
1810          return;
1811      }
1812      napi_value result[ARGS_SIZE_TWO] = {0};
1813      napi_value callback = 0;
1814      napi_value undefined = 0;
1815      napi_get_undefined(env, &undefined);
1816      napi_get_undefined(env, &result[PARAM1]);
1817      result[PARAM0] = CreateBusinessError(env, callbackInfo->ret_);
1818      if (callbackInfo->callback_) {
1819          // Callback mode
1820          napi_get_reference_value(env, callbackInfo->callback_, &callback);
1821          napi_value returnVal = nullptr;
1822          napi_call_function(env, undefined, callback, ARGS_SIZE_TWO, result, &returnVal);
1823          napi_delete_reference(env, callbackInfo->callback_);
1824      } else {
1825          // Promise mode
1826          if (callbackInfo->ret_ == RET_OK) {
1827              napi_resolve_deferred(env, callbackInfo->deferred_, result[PARAM1]);
1828          } else {
1829              napi_reject_deferred(env, callbackInfo->deferred_, result[PARAM0]);
1830          }
1831      }
1832  
1833      napi_delete_async_work(env, callbackInfo->work_);
1834      delete callbackInfo;
1835      callbackInfo = nullptr;
1836  }
1837  
FindElement(napi_env env,napi_callback_info info)1838  napi_value NAccessibilityElement::FindElement(napi_env env, napi_callback_info info)
1839  {
1840      size_t argc = ARGS_SIZE_THREE;
1841      napi_value argv[ARGS_SIZE_THREE] = {0};
1842      napi_value thisVar = nullptr;
1843      void* data = nullptr;
1844      napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1845      if (status != napi_ok) {
1846          HILOG_ERROR("Failed to get cb info");
1847          napi_value err = CreateBusinessError(env, RetError::RET_ERR_FAILED);
1848          napi_throw(env, err);
1849          return nullptr;
1850      }
1851      HILOG_DEBUG("argc = %{public}d", (int)argc);
1852  
1853      // Unwrap AccessibilityElement
1854      AccessibilityElement* accessibilityElement = nullptr;
1855      status = napi_unwrap(env, thisVar, (void**)&accessibilityElement);
1856      if (!accessibilityElement || status != napi_ok) {
1857          HILOG_ERROR("accessibilityElement is null or status[%{public}d] is wrong", status);
1858          napi_value err = CreateBusinessError(env, RetError::RET_ERR_NULLPTR);
1859          napi_throw(env, err);
1860          return nullptr;
1861      }
1862      if (!accessibilityElement->isElementInfo_) {
1863          HILOG_ERROR("Type of AccessibilityElement is not right");
1864          napi_value err = CreateBusinessError(env, RetError::RET_ERR_FAILED);
1865          napi_throw(env, err);
1866          return nullptr;
1867      }
1868  
1869      NAccessibilityElementData *callbackInfo = new(std::nothrow) NAccessibilityElementData();
1870      if (callbackInfo == nullptr) {
1871          HILOG_ERROR("Failed to create callbackInfo.");
1872          napi_value err = CreateBusinessError(env, RetError::RET_ERR_NULLPTR);
1873          napi_throw(env, err);
1874          return nullptr;
1875      }
1876      callbackInfo->env_ = env;
1877      FindElementConstructCallbackInfo(env, argc, argv, callbackInfo, accessibilityElement);
1878      if (callbackInfo == nullptr) {
1879          return nullptr;
1880      }
1881      return FindElementAsync(env, argc, argv, callbackInfo, accessibilityElement);
1882  }
1883  
GetCursorPositionAsync(napi_env env,size_t argc,napi_value * argv,NAccessibilityElementData * callbackInfo,AccessibilityElement * accessibilityElement)1884  napi_value NAccessibilityElement::GetCursorPositionAsync(napi_env env, size_t argc, napi_value* argv,
1885      NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement)
1886  {
1887      if (callbackInfo == nullptr) {
1888          HILOG_ERROR("callbackInfo is nullptr");
1889          return nullptr;
1890      }
1891      napi_value promise = nullptr;
1892      if (argc > ARGS_SIZE_ONE - 1) {
1893          napi_valuetype valueType = napi_null;
1894          napi_typeof(env, argv[PARAM0], &valueType);
1895          if (valueType == napi_function) {
1896              napi_create_reference(env, argv[PARAM0], 1, &callbackInfo->callback_);
1897              napi_get_undefined(env, &promise);
1898          } else {
1899              napi_create_promise(env, &callbackInfo->deferred_, &promise);
1900          }
1901      } else {
1902          napi_create_promise(env, &callbackInfo->deferred_, &promise);
1903      }
1904  
1905      callbackInfo->accessibilityElement_ = *accessibilityElement;
1906  
1907      napi_value resource = nullptr;
1908      napi_create_string_utf8(callbackInfo->env_, "GetCursorPosition", NAPI_AUTO_LENGTH, &resource);
1909      napi_create_async_work(callbackInfo->env_, nullptr, resource, GetCursorPositionExecute,
1910          GetCursorPositionComplete, reinterpret_cast<void*>(callbackInfo), &callbackInfo->work_);
1911      napi_queue_async_work_with_qos(callbackInfo->env_, callbackInfo->work_, napi_qos_user_initiated);
1912      return promise;
1913  }
1914  
FindElementAsync(napi_env env,size_t argc,napi_value * argv,NAccessibilityElementData * callbackInfo,AccessibilityElement * accessibilityElement)1915  napi_value NAccessibilityElement::FindElementAsync(napi_env env, size_t argc, napi_value* argv,
1916      NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement)
1917  {
1918      napi_value promise = nullptr;
1919      if (argc > ARGS_SIZE_THREE - 1) {
1920          napi_valuetype valueType = napi_null;
1921          napi_typeof(env, argv[PARAM2], &valueType);
1922          if (valueType == napi_function) {
1923              napi_create_reference(env, argv[PARAM2], 1, &callbackInfo->callback_);
1924              napi_get_undefined(env, &promise);
1925          } else {
1926              napi_create_promise(env, &callbackInfo->deferred_, &promise);
1927          }
1928      } else {
1929          napi_create_promise(env, &callbackInfo->deferred_, &promise);
1930      }
1931  
1932      callbackInfo->accessibilityElement_ = *accessibilityElement;
1933  
1934      napi_value resource = nullptr;
1935      napi_create_string_utf8(callbackInfo->env_, "FindElement", NAPI_AUTO_LENGTH, &resource);
1936      napi_create_async_work(callbackInfo->env_, nullptr, resource, FindElementExecute,
1937          FindElementComplete, reinterpret_cast<void*>(callbackInfo), &callbackInfo->work_);
1938      napi_queue_async_work_with_qos(callbackInfo->env_, callbackInfo->work_, napi_qos_user_initiated);
1939      return promise;
1940  }
1941  
FindElementConstructCallbackInfo(napi_env env,size_t argc,napi_value * argv,NAccessibilityElementData * callbackInfo,AccessibilityElement * accessibilityElement)1942  void NAccessibilityElement::FindElementConstructCallbackInfo(napi_env env, size_t argc, napi_value* argv,
1943      NAccessibilityElementData* callbackInfo, AccessibilityElement* accessibilityElement)
1944  {
1945      NAccessibilityErrorCode errCode = NAccessibilityErrorCode::ACCESSIBILITY_OK;
1946      if (argc < ARGS_SIZE_THREE - 1) {
1947          HILOG_ERROR("argc is invalid: %{public}zu", argc);
1948          errCode = NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM;
1949      }
1950  
1951      if (errCode == NAccessibilityErrorCode::ACCESSIBILITY_OK) {
1952          // Parse conditionType name
1953          std::string conditionType = "";
1954          if (ParseString(env, conditionType, argv[PARAM0])) {
1955              HILOG_DEBUG("conditionType = %{public}s", conditionType.c_str());
1956              if (std::strcmp(conditionType.c_str(), "content") != 0 &&
1957                  std::strcmp(conditionType.c_str(), "focusType") != 0 &&
1958                  std::strcmp(conditionType.c_str(), "focusDirection") != 0 &&
1959                  std::strcmp(conditionType.c_str(), "textType") != 0 &&
1960                  std::strcmp(conditionType.c_str(), "elementId") != 0) {
1961                  HILOG_ERROR("argv[PARAM0] is wrong[%{public}s", conditionType.c_str());
1962                  errCode = NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM;
1963              } else {
1964                  callbackInfo->conditionId_ = ConvertStringToCondition(conditionType);
1965              }
1966          } else {
1967              errCode = NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM;
1968          }
1969  
1970          // Parse queryData name
1971          std::string queryData = "";
1972          int64_t elementId;
1973          if (ParseString(env, queryData, argv[PARAM1])) {
1974              HILOG_DEBUG("queryData = %{public}s", queryData.c_str());
1975              callbackInfo->condition_ = queryData;
1976          } else if (ParseInt64(env, elementId, argv[PARAM1])) {
1977              queryData = std::to_string(elementId);
1978              HILOG_DEBUG("queryData = %{public}s", queryData.c_str());
1979              callbackInfo->condition_ = queryData;
1980          } else {
1981              errCode = NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM;
1982          }
1983      }
1984  
1985      if (errCode == NAccessibilityErrorCode::ACCESSIBILITY_ERROR_INVALID_PARAM) {
1986          delete callbackInfo;
1987          callbackInfo = nullptr;
1988          delete accessibilityElement;
1989          accessibilityElement = nullptr;
1990          napi_value err = CreateBusinessError(env, RetError::RET_ERR_INVALID_PARAM);
1991          HILOG_ERROR("invalid param");
1992          napi_throw(env, err);
1993      }
1994  }
1995  
FindElementByText(NAccessibilityElementData * callbackInfo)1996  void NAccessibilityElement::FindElementByText(NAccessibilityElementData *callbackInfo)
1997  {
1998      nlohmann::json jsonStr;
1999      jsonStr["type"] = (callbackInfo->conditionId_ ==
2000          FindElementCondition::FIND_ELEMENT_CONDITION_CONTENT) ? "content" : "textType";
2001      jsonStr["value"] = callbackInfo->condition_;
2002      callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->GetByContent(
2003          *(callbackInfo->accessibilityElement_.elementInfo_),
2004          jsonStr.dump().c_str(), callbackInfo->nodeInfos_);
2005      return;
2006  }
2007  
GetCursorPositionExecute(napi_env env,void * data)2008  void NAccessibilityElement::GetCursorPositionExecute(napi_env env, void* data)
2009  {
2010      HILOG_DEBUG("GetCursorPositionExecute");
2011      NAccessibilityElementData *callbackInfo = static_cast<NAccessibilityElementData*>(data);
2012      if (callbackInfo == nullptr) {
2013          HILOG_ERROR("callbackInfo is nullptr");
2014          return;
2015      }
2016  
2017      callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->GetCursorPosition(
2018          *callbackInfo->accessibilityElement_.elementInfo_, callbackInfo->cursorPosition_);
2019  }
2020  
FindElementExecute(napi_env env,void * data)2021  void NAccessibilityElement::FindElementExecute(napi_env env, void* data)
2022  {
2023      NAccessibilityElementData *callbackInfo = static_cast<NAccessibilityElementData*>(data);
2024      if (callbackInfo == nullptr) {
2025          HILOG_ERROR("callbackInfo is nullptr");
2026          return;
2027      }
2028  
2029      switch (callbackInfo->conditionId_) {
2030          case FindElementCondition::FIND_ELEMENT_CONDITION_INVALID:
2031              HILOG_ERROR("condition id is invalid");
2032              callbackInfo->ret_ = RET_ERR_INVALID_PARAM;
2033              return;
2034          case FindElementCondition::FIND_ELEMENT_CONDITION_CONTENT:
2035          case FindElementCondition::FIND_ELEMENT_CONDITION_TEXT_TYPE:
2036              FindElementByText(callbackInfo);
2037              break;
2038          case FindElementCondition::FIND_ELEMENT_CONDITION_FOCUS_TYPE:
2039              {
2040                  int32_t focusType = ConvertStringToFocusType(callbackInfo->condition_);
2041                  HILOG_DEBUG("focusType is %{public}d", focusType);
2042                  callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->GetFocusByElementInfo(
2043                      *(callbackInfo->accessibilityElement_.elementInfo_),
2044                      focusType, callbackInfo->nodeInfo_);
2045              }
2046              break;
2047          case FindElementCondition::FIND_ELEMENT_CONDITION_FOCUS_DIRECTION:
2048              {
2049                  FocusMoveDirection direction = ConvertStringToDirection(callbackInfo->condition_);
2050                  HILOG_DEBUG("direction is %{public}d", direction);
2051                  callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->GetNext(
2052                      *(callbackInfo->accessibilityElement_.elementInfo_), direction,
2053                      callbackInfo->nodeInfo_);
2054              }
2055              break;
2056          case FindElementCondition::FIND_ELEMENT_CONDITION_ELEMENT_ID:
2057              {
2058                  int64_t elementId = std::stoll(callbackInfo->condition_);
2059                  int32_t windowId = callbackInfo->accessibilityElement_.elementInfo_->GetWindowId();
2060                  HILOG_DEBUG("elementId is %{public}" PRId64 " windowId: %{public}d", elementId, windowId);
2061                  callbackInfo->ret_ = AccessibleAbilityClient::GetInstance()->GetByElementId(
2062                      elementId, windowId, callbackInfo->nodeInfo_);
2063              }
2064              break;
2065          default:
2066              break;
2067      }
2068      HILOG_DEBUG("condition id[%{public}d], result[%{public}d]", callbackInfo->conditionId_, callbackInfo->ret_);
2069  }
2070  
2071  
GetCursorPositionComplete(napi_env env,napi_status status,void * data)2072  void NAccessibilityElement::GetCursorPositionComplete(napi_env env, napi_status status, void* data)
2073  {
2074      HILOG_DEBUG("GetCursorPositionComplete execute back");
2075      NAccessibilityElementData* callbackInfo = static_cast<NAccessibilityElementData*>(data);
2076      if (callbackInfo == nullptr) {
2077          HILOG_ERROR("callbackInfo is nullptr");
2078          return;
2079      }
2080      napi_value result[ARGS_SIZE_TWO] = {0};
2081      napi_value callback = 0;
2082      napi_value undefined = 0;
2083      napi_get_undefined(env, &undefined);
2084      napi_create_int32(env, callbackInfo->cursorPosition_, &result[PARAM1]);
2085      HILOG_INFO("Response [callback cursorPosition:%{public}d]", callbackInfo->cursorPosition_);
2086      result[PARAM0] = CreateBusinessError(env, callbackInfo->ret_);
2087      if (callbackInfo->callback_) {
2088          // Callback mode
2089          napi_get_reference_value(env, callbackInfo->callback_, &callback);
2090          napi_value returnVal = nullptr;
2091          napi_call_function(env, undefined, callback, ARGS_SIZE_TWO, result, &returnVal);
2092          HILOG_INFO("NAccessibilityElement::GetCursorPositionComplete in CallbackMode");
2093          napi_delete_reference(env, callbackInfo->callback_);
2094      } else {
2095          // Promise mode
2096          if (callbackInfo->ret_ == RET_OK) {
2097              napi_resolve_deferred(env, callbackInfo->deferred_, result[PARAM1]);
2098          } else {
2099              napi_reject_deferred(env, callbackInfo->deferred_, result[PARAM0]);
2100          }
2101      }
2102  
2103      napi_delete_async_work(env, callbackInfo->work_);
2104      delete callbackInfo;
2105      callbackInfo = nullptr;
2106  }
2107  
FindElementComplete(napi_env env,napi_status status,void * data)2108  void NAccessibilityElement::FindElementComplete(napi_env env, napi_status status, void* data)
2109  {
2110      NAccessibilityElementData* callbackInfo = static_cast<NAccessibilityElementData*>(data);
2111      if (callbackInfo == nullptr) {
2112          HILOG_ERROR("callbackInfo is nullptr");
2113          return;
2114      }
2115  
2116      napi_value result[ARGS_SIZE_TWO] = {0};
2117      // set reslult mainWindowId = param mainWidnowId
2118      int32_t mainWindowId = -1;
2119      if (callbackInfo->accessibilityElement_.elementInfo_ != nullptr) {
2120          mainWindowId = callbackInfo->accessibilityElement_.elementInfo_->GetMainWindowId();
2121      } else if (callbackInfo->accessibilityElement_.windowInfo_ != nullptr) {
2122          mainWindowId = callbackInfo->accessibilityElement_.windowInfo_->GetMainWindowId();
2123      }
2124  
2125      if (mainWindowId > 0) {
2126          HILOG_INFO("callbackInfo node set mainWindowId: %{public}d", mainWindowId);
2127          callbackInfo->nodeInfo_.SetMainWindowId(mainWindowId);
2128          for (auto &node : callbackInfo->nodeInfos_) {
2129              node.SetMainWindowId(mainWindowId);
2130          }
2131      }
2132  
2133      GetElement(callbackInfo, result[PARAM1]);
2134      result[PARAM0] = CreateBusinessError(env, callbackInfo->ret_);
2135      if (callbackInfo->callback_) {
2136          HILOG_DEBUG("callback mode. result is %{public}d", callbackInfo->ret_);
2137          napi_value callback = 0;
2138          napi_get_reference_value(env, callbackInfo->callback_, &callback);
2139          napi_value returnVal = nullptr;
2140          napi_value undefined = 0;
2141          napi_get_undefined(env, &undefined);
2142          napi_call_function(env, undefined, callback, ARGS_SIZE_TWO, result, &returnVal);
2143          napi_delete_reference(env, callbackInfo->callback_);
2144      } else {
2145          HILOG_DEBUG("promise mode. result is %{public}d", callbackInfo->ret_);
2146          if (callbackInfo->ret_ == RET_OK) {
2147              napi_resolve_deferred(env, callbackInfo->deferred_, result[PARAM1]);
2148          } else {
2149              napi_reject_deferred(env, callbackInfo->deferred_, result[PARAM0]);
2150          }
2151      }
2152      napi_delete_async_work(env, callbackInfo->work_);
2153      delete callbackInfo;
2154      callbackInfo = nullptr;
2155  }
2156  
GetElement(NAccessibilityElementData * callbackInfo,napi_value & value)2157  void NAccessibilityElement::GetElement(NAccessibilityElementData *callbackInfo, napi_value &value)
2158  {
2159      HILOG_DEBUG("condition id[%{public}d]", callbackInfo->conditionId_);
2160      napi_env env = callbackInfo->env_;
2161      if (callbackInfo->ret_ != RET_OK) {
2162          HILOG_ERROR("GetElementInfo failed!");
2163          napi_get_undefined(env, &value);
2164          return;
2165      }
2166  
2167      switch (callbackInfo->conditionId_) {
2168          case FindElementCondition::FIND_ELEMENT_CONDITION_INVALID:
2169              HILOG_ERROR("condition id is invalid");
2170              callbackInfo->ret_ = RET_ERR_INVALID_PARAM;
2171              return;
2172          case FindElementCondition::FIND_ELEMENT_CONDITION_CONTENT:
2173              napi_create_array(env, &value);
2174              ConvertElementInfosToJS(env, value, callbackInfo->nodeInfos_);
2175              break;
2176          case FindElementCondition::FIND_ELEMENT_CONDITION_TEXT_TYPE:
2177              napi_create_array(env, &value);
2178              ConvertElementInfosToJS(env, value, callbackInfo->nodeInfos_);
2179              break;
2180          case FindElementCondition::FIND_ELEMENT_CONDITION_FOCUS_TYPE:
2181              {
2182                  napi_value constructor = nullptr;
2183                  napi_get_reference_value(env, NAccessibilityElement::consRef_, &constructor);
2184                  napi_new_instance(env, constructor, 0, nullptr, &value);
2185                  ConvertElementInfoToJS(env, value, callbackInfo->nodeInfo_);
2186              }
2187              break;
2188          case FindElementCondition::FIND_ELEMENT_CONDITION_FOCUS_DIRECTION:
2189              {
2190                  napi_value constructor = nullptr;
2191                  napi_get_reference_value(env, NAccessibilityElement::consRef_, &constructor);
2192                  napi_new_instance(env, constructor, 0, nullptr, &value);
2193                  ConvertElementInfoToJS(env, value, callbackInfo->nodeInfo_);
2194              }
2195              break;
2196          case FindElementCondition::FIND_ELEMENT_CONDITION_ELEMENT_ID:
2197              {
2198                  napi_value constructor = nullptr;
2199                  napi_get_reference_value(env, NAccessibilityElement::consRef_, &constructor);
2200                  napi_new_instance(env, constructor, 0, nullptr, &value);
2201                  ConvertElementInfoToJS(env, value, callbackInfo->nodeInfo_);
2202              }
2203              break;
2204          default:
2205              break;
2206      }
2207  }
2208  
ErrorOperation(NAccessibilityElementData * callbackInfo)2209  napi_value NAccessibilityElement::ErrorOperation(NAccessibilityElementData *callbackInfo)
2210  {
2211      HILOG_DEBUG();
2212      napi_value promise = nullptr;
2213      if (callbackInfo == nullptr) {
2214          HILOG_ERROR("callbackInfo is nullptr");
2215          return nullptr;
2216      }
2217      napi_env env = callbackInfo->env_;
2218      if (callbackInfo->callback_) {
2219          HILOG_DEBUG("callback mode");
2220          napi_get_undefined(env, &promise);
2221      } else {
2222          napi_create_promise(env, &callbackInfo->deferred_, &promise);
2223      }
2224  
2225      napi_value resource = nullptr;
2226      napi_create_string_utf8(env, "ErrorOperation", NAPI_AUTO_LENGTH, &resource);
2227      if (resource == nullptr) {
2228          HILOG_ERROR("resource is nullptr.");
2229          return nullptr;
2230      }
2231      napi_create_async_work(env, nullptr, resource, [](napi_env env, void* data) {},
2232          // Execute the complete function
2233          [](napi_env env, napi_status status, void* data) {
2234              NAccessibilityElementData* callbackInfo = static_cast<NAccessibilityElementData*>(data);
2235              if (callbackInfo == nullptr) {
2236                  HILOG_ERROR("callbackInfo is nullptr");
2237                  return;
2238              }
2239  
2240              napi_value result[ARGS_SIZE_TWO] = {0};
2241              napi_value callback = 0;
2242              napi_value undefined = 0;
2243              napi_get_undefined(env, &undefined);
2244              result[PARAM0] = CreateBusinessError(env, callbackInfo->ret_);
2245              if (callbackInfo->callback_) {
2246                  // Callback mode
2247                  result[PARAM1] = undefined;
2248                  napi_get_reference_value(env, callbackInfo->callback_, &callback);
2249                  napi_value returnVal = nullptr;
2250                  napi_call_function(env, undefined, callback, ARGS_SIZE_TWO, result, &returnVal);
2251                  napi_delete_reference(env, callbackInfo->callback_);
2252              } else {
2253                  // Promise mode
2254                  napi_reject_deferred(env, callbackInfo->deferred_, result[PARAM0]);
2255              }
2256              napi_delete_async_work(env, callbackInfo->work_);
2257              delete callbackInfo;
2258              callbackInfo = nullptr;
2259          },
2260          reinterpret_cast<void*>(callbackInfo),
2261          &callbackInfo->work_);
2262      napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
2263      return promise;
2264  }
2265  
GetCursorPosition(napi_env env,napi_callback_info info)2266  napi_value NAccessibilityElement::GetCursorPosition(napi_env env, napi_callback_info info)
2267  {
2268      size_t argc = ARGS_SIZE_ONE;
2269      napi_value argv[ARGS_SIZE_ONE] = {0};
2270      napi_value thisVar = nullptr;
2271      void* data = nullptr;
2272      napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
2273      if (status != napi_ok) {
2274          HILOG_ERROR("Failed to get cb info");
2275          return nullptr;
2276      }
2277      HILOG_DEBUG("argc = %{public}d", (int)argc);
2278  
2279      // Unwrap AccessibilityElement
2280      AccessibilityElement* accessibilityElement = nullptr;
2281      status = napi_unwrap(env, thisVar, (void**)&accessibilityElement);
2282      if (!accessibilityElement || status != napi_ok) {
2283          HILOG_ERROR("accessibilityElement is null or status[%{public}d] is wrong", status);
2284          return nullptr;
2285      }
2286      if (!accessibilityElement->isElementInfo_) {
2287          HILOG_ERROR("Type of AccessibilityElement is not right");
2288          return nullptr;
2289      }
2290  
2291      NAccessibilityElementData *callbackInfo = new(std::nothrow) NAccessibilityElementData();
2292      if (callbackInfo == nullptr) {
2293          HILOG_ERROR("Failed to create callbackInfo.");
2294          return nullptr;
2295      }
2296      callbackInfo->env_ = env;
2297      return GetCursorPositionAsync(env, argc, argv, callbackInfo, accessibilityElement);
2298  }
2299  
ConvertStringToCondition(const std::string & str)2300  FindElementCondition NAccessibilityElement::ConvertStringToCondition(const std::string &str)
2301  {
2302      static const std::map<std::string, FindElementCondition> findElementConditionTable = {
2303          {"content", FindElementCondition::FIND_ELEMENT_CONDITION_CONTENT},
2304          {"focusType", FindElementCondition::FIND_ELEMENT_CONDITION_FOCUS_TYPE},
2305          {"focusDirection", FindElementCondition::FIND_ELEMENT_CONDITION_FOCUS_DIRECTION},
2306          {"elementId", FindElementCondition::FIND_ELEMENT_CONDITION_ELEMENT_ID},
2307          {"textType", FindElementCondition::FIND_ELEMENT_CONDITION_TEXT_TYPE}
2308      };
2309  
2310      if (findElementConditionTable.find(str) == findElementConditionTable.end()) {
2311          return FindElementCondition::FIND_ELEMENT_CONDITION_INVALID;
2312      }
2313  
2314      return findElementConditionTable.at(str);
2315  }
2316  
ConvertStringToDirection(const std::string & str)2317  FocusMoveDirection NAccessibilityElement::ConvertStringToDirection(const std::string &str)
2318  {
2319      static const std::map<std::string, FocusMoveDirection> focusMoveDirectionTable = {
2320          {"up", FocusMoveDirection::UP},
2321          {"down", FocusMoveDirection::DOWN},
2322          {"left", FocusMoveDirection::LEFT},
2323          {"right", FocusMoveDirection::RIGHT},
2324          {"forward", FocusMoveDirection::FORWARD},
2325          {"backward", FocusMoveDirection::BACKWARD}
2326      };
2327  
2328      if (focusMoveDirectionTable.find(str) == focusMoveDirectionTable.end()) {
2329          return FocusMoveDirection::DIRECTION_INVALID;
2330      }
2331  
2332      return focusMoveDirectionTable.at(str);
2333  }
2334  
ConvertStringToFocusType(const std::string & str)2335  int32_t NAccessibilityElement::ConvertStringToFocusType(const std::string &str)
2336  {
2337      static const std::map<std::string, int32_t> focusTypeTable = {
2338          {"normal", FOCUS_TYPE_INPUT},
2339          {"accessibility", FOCUS_TYPE_ACCESSIBILITY}
2340      };
2341  
2342      if (focusTypeTable.find(str) == focusTypeTable.end()) {
2343          return FOCUS_TYPE_INVALID;
2344      }
2345      return focusTypeTable.at(str);
2346  }