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