1 /* 2 * Copyright (c) 2022-2023 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 FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_ACCESSIBILITY_JS_ACCESSIBILITY_MANAGER_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_ACCESSIBILITY_JS_ACCESSIBILITY_MANAGER_H 18 19 #include <unordered_map> 20 #include <unordered_set> 21 #include <vector> 22 23 #include "accessibility_config.h" 24 #include "accessibility_element_operator.h" 25 #include "accessibility_event_info.h" 26 #include "accessibility_state_event.h" 27 28 #include "core/accessibility/accessibility_manager.h" 29 #include "core/accessibility/accessibility_utils.h" 30 #include "frameworks/bridge/common/accessibility/accessibility_node_manager.h" 31 32 #include "js_third_accessibility_hover_ng.h" 33 34 namespace OHOS::NWeb { 35 class NWebAccessibilityNodeInfo; 36 } // namespace OHOS::NWeb::NWebAccessibilityNodeInfo 37 38 namespace OHOS::Ace::NG { 39 class TransitionalNodeInfo; 40 } 41 42 namespace OHOS::Accessibility { 43 class AccessibilitySystemAbilityClient; 44 } 45 46 namespace OHOS::Ace::Framework { 47 48 struct SearchParameter { 49 int64_t nodeId; 50 std::string text; 51 int32_t mode; 52 int64_t uiExtensionOffset; 53 }; 54 55 struct CommonProperty { 56 int32_t innerWindowId = -1; 57 int32_t windowId = 0; 58 int32_t windowLeft = 0; 59 int32_t windowTop = 0; 60 std::vector<std::string> pagePaths; 61 std::vector<RefPtr<NG::FrameNode>> pageNodes; 62 bool isReduceMode = false; 63 RotateTransform rotateTransform; 64 float_t scaleX = 1.0f; 65 float_t scaleY = 1.0f; 66 }; 67 68 struct ActionTable { 69 AceAction aceAction; 70 ActionType action; 71 }; 72 73 struct ActionStrTable { 74 ActionType action; 75 std::string actionStr; 76 }; 77 78 struct FillEventInfoParam { 79 int64_t elementId = 0; 80 int64_t stackNodeId = 0; 81 uint32_t windowId = 0; 82 }; 83 84 struct AccessibilityActionParam { 85 RefPtr<NG::AccessibilityProperty> accessibilityProperty; 86 std::string setTextArgument = ""; 87 int32_t setSelectionStart = -1; 88 int32_t setSelectionEnd = -1; 89 bool setSelectionDir = false; 90 int32_t setCursorIndex = -1; 91 TextMoveUnit moveUnit = TextMoveUnit::STEP_CHARACTER; 92 AccessibilityScrollType scrollType = AccessibilityScrollType::SCROLL_DEFAULT; 93 int32_t spanId = -1; 94 }; 95 96 struct ActionParam { 97 Accessibility::ActionType action; 98 std::map<std::string, std::string> actionArguments; 99 }; 100 101 enum class DumpMode { 102 TREE, 103 NODE, 104 HANDLE_EVENT, 105 HOVER_TEST, 106 EVENT_TEST 107 }; 108 109 struct DumpInfoArgument { 110 bool useWindowId = false; 111 DumpMode mode = DumpMode::TREE; 112 bool isDumpSimplify = false; 113 bool verbose = false; 114 int64_t rootId = -1; 115 int32_t pointX = 0; 116 int32_t pointY = 0; 117 int64_t nodeId = -1; 118 int32_t action = 0; 119 int32_t eventId = -1; 120 }; 121 122 class JsAccessibilityManager : public AccessibilityNodeManager, 123 public AccessibilityHoverManagerForThirdNG { 124 DECLARE_ACE_TYPE(JsAccessibilityManager, AccessibilityNodeManager); 125 126 public: 127 JsAccessibilityManager() = default; 128 ~JsAccessibilityManager() override; 129 130 // JsAccessibilityManager overrides functions. 131 void InitializeCallback() override; 132 void SendAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent) override; 133 void UpdateVirtualNodeFocus() override; 134 void SetCardViewParams(const std::string& key, bool focus) override; 135 void HandleComponentPostBinding() override; 136 void RegisterSubWindowInteractionOperation(int windowId) override; 137 void SetPipelineContext(const RefPtr<PipelineBase>& context) override; 138 void UpdateElementInfosTreeId(std::list<Accessibility::AccessibilityElementInfo>& infos); 139 void UpdateElementInfoTreeId(Accessibility::AccessibilityElementInfo& info); 140 141 void UpdateViewScale(); 142 GetScaleX()143 float GetScaleX() const 144 { 145 return scaleX_; 146 } 147 GetScaleY()148 float GetScaleY() const 149 { 150 return scaleY_; 151 } 152 GetWindowId()153 uint32_t GetWindowId() const 154 { 155 return windowId_; 156 } 157 SetWindowId(uint32_t windowId)158 void SetWindowId(uint32_t windowId) 159 { 160 windowId_ = windowId; 161 } 162 SaveLast(const int64_t elementId,const RefPtr<NG::FrameNode> & node)163 void SaveLast(const int64_t elementId, const RefPtr<NG::FrameNode>& node) 164 { 165 lastElementId_ = elementId; 166 lastFrameNode_ = node; 167 } 168 SetReentrantLimit(const bool reentrantLimit)169 void SetReentrantLimit(const bool reentrantLimit) 170 { 171 reentrantLimit_ = reentrantLimit; 172 } 173 IsReentrantLimit()174 bool IsReentrantLimit() const 175 { 176 return reentrantLimit_; 177 } 178 SaveCurrentFocusNodeSize(const RefPtr<NG::FrameNode> & currentFocusNode)179 void SaveCurrentFocusNodeSize(const RefPtr<NG::FrameNode>& currentFocusNode) 180 { 181 if (currentFocusNode->IsAccessibilityVirtualNode()) { 182 auto oldGeometryNode = currentFocusNode->GetGeometryNode(); 183 CHECK_NULL_VOID(oldGeometryNode); 184 oldGeometrySize_ = oldGeometryNode->GetFrameSize(); 185 } 186 } 187 188 bool SubscribeToastObserver(); 189 bool UnsubscribeToastObserver(); 190 bool SubscribeStateObserver(uint32_t eventType); 191 bool UnsubscribeStateObserver(uint32_t eventType); 192 int RegisterInteractionOperation(int windowId); 193 void DeregisterInteractionOperation(); 194 195 bool IsSendAccessibilityEvent(const AccessibilityEvent& accessibilityEvent); 196 bool IsSendAccessibilityEventForUEA( 197 const AccessibilityEvent& accessibilityEvent, const std::string& componentType, const int32_t pageId); 198 bool IsSendAccessibilityEventForHost( 199 const AccessibilityEvent& accessibilityEvent, const std::string& componentType, const int32_t pageId); 200 void GetComponentTypeAndPageIdByNodeId(const int64_t nodeId, const RefPtr<PipelineBase>& context, 201 std::string& componentType, int32_t& pageId); 202 203 void SendCacheAccessibilityEvent(int32_t instanceId); 204 void SendCacheAccessibilityEventForHost(const int32_t pageId); 205 206 void AddFrameNodeToUecStatusVec(const RefPtr<NG::FrameNode>& node) override; 207 void AddFrameNodeToDefaultFocusList(const RefPtr<NG::FrameNode>& node, bool isFocus) override; 208 void AddDefaultFocusNode(const RefPtr<NG::FrameNode>& defaultFocusNode); 209 void EraseDefaultFocusNode(const RefPtr<NG::FrameNode>& defaultFocusNode); 210 GetDefaultFocusList()211 std::list<WeakPtr<NG::FrameNode>>& GetDefaultFocusList() 212 { 213 return defaultFocusList_; 214 } 215 216 void RegisterUIExtGetPageModeCallback(RefPtr<NG::UIExtensionManager>& uiExtManager) override; 217 void UpdateFrameNodeState(int32_t nodeId) override; 218 UpdatePageMode(const std::string & pageMode)219 void UpdatePageMode(const std::string& pageMode) override 220 { 221 pageMode_ = pageMode; 222 } 223 224 bool SendAccessibilitySyncEvent( 225 const AccessibilityEvent& accessibilityEvent, Accessibility::AccessibilityEventInfo eventInfo); 226 bool TransferAccessibilityAsyncEvent( 227 const Accessibility::AccessibilityEventInfo& eventInfo, 228 int64_t uiExtensionOffset) override; 229 void SendExtensionAccessibilityEvent( 230 const Accessibility::AccessibilityEventInfo& eventInfo, 231 int64_t uiExtensionOffset) override; 232 void SearchElementInfoByAccessibilityId(const int64_t elementId, const int32_t requestId, 233 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode, const int32_t windowId); 234 void SearchElementInfosByText(const int64_t elementId, const std::string& text, const int32_t requestId, 235 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId); 236 void SearchDefaultFocusByWindowId(const int32_t windowId, int32_t pageId, const int32_t requestId, 237 Accessibility::AccessibilityElementOperatorCallback& callback); 238 void FindFocusedElementInfo(const int64_t elementId, const int32_t focusType, const int32_t requestId, 239 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId); 240 void FocusMoveSearch(const int64_t elementId, const int32_t direction, const int32_t requestId, 241 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId); 242 bool IsUpdateWindowSceneInfo(const RefPtr<NG::FrameNode>& node, NG::WindowSceneInfo& windowSceneInfo); 243 void UpdateElementInfoInnerWindowId(Accessibility::AccessibilityElementInfo& info, const int64_t& elementId); 244 void ExecuteAction(const int64_t accessibilityId, const ActionParam& param, const int32_t requestId, 245 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId); 246 bool ClearCurrentFocus(); 247 void UpdateNodeChildIds(const RefPtr<AccessibilityNode>& node); 248 void SendActionEvent(const Accessibility::ActionType& action, int64_t nodeId); 249 void SearchElementInfoByAccessibilityIdNG(int64_t elementId, int32_t mode, 250 std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context, 251 const int64_t uiExtensionOffset = 0) override; 252 void SearchDefaultFocusByWindowIdNG(const int32_t pageId, 253 std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context); 254 void SearchElementInfosByTextNG(int64_t elementId, const std::string& text, 255 std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context, 256 const int64_t uiExtensionOffset = 0) override; 257 void FindFocusedElementInfoNG(int64_t elementId, int32_t focusType, Accessibility::AccessibilityElementInfo& info, 258 const RefPtr<PipelineBase>& context, const int64_t uiExtensionOffset = 0) override; 259 void FocusMoveSearchNG(int64_t elementId, int32_t direction, Accessibility::AccessibilityElementInfo& info, 260 const RefPtr<PipelineBase>& context, const int64_t uiExtensionOffset = 0) override; 261 bool ExecuteExtensionActionNG(int64_t elementId, const std::map<std::string, std::string>& actionArguments, 262 int32_t action, const RefPtr<PipelineBase>& context, int64_t uiExtensionOffset) override; 263 int32_t GetTransformDegreeRelativeToWindow(const RefPtr<NG::FrameNode>& node, bool excludeSelf = false); 264 AccessibilityParentRectInfo GetTransformRectInfoRelativeToWindow( 265 const RefPtr<NG::FrameNode>& node, const RefPtr<PipelineBase>& context) override; 266 #ifdef WEB_SUPPORTED 267 void SendWebAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent, 268 const RefPtr<NG::WebPattern>& webPattern) override; 269 void SearchWebElementInfoByAccessibilityId(const int64_t elementId, const int32_t requestId, 270 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode, const int32_t windowId, 271 const RefPtr<NG::WebPattern>& webPattern); 272 void SearchWebElementInfoByAccessibilityIdNG(int64_t elementId, int32_t mode, 273 std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context, 274 const RefPtr<NG::WebPattern>& webPattern); 275 void FindWebFocusedElementInfo(const int64_t elementId, const int32_t focusType, 276 const int32_t requestId, Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId, 277 const RefPtr<NG::WebPattern>& webPattern); 278 void FindWebFocusedElementInfoNG(int64_t elementId, int32_t focusType, 279 Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context, 280 const RefPtr<NG::WebPattern>& webPattern); 281 void WebFocusMoveSearch(const int64_t elementId, const int32_t direction, const int32_t requestId, 282 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId, 283 const RefPtr<NG::WebPattern>& webPattern); 284 void WebFocusMoveSearchNG(int64_t elementId, int32_t direction, 285 Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context, 286 const RefPtr<NG::WebPattern>& webPattern); 287 void ExecuteWebAction(const int64_t elementId, const ActionParam& param, const int32_t requestId, 288 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId, 289 const RefPtr<NG::WebPattern>& webPattern); 290 bool ExecuteWebActionNG(int64_t elementId, Accessibility::ActionType action, 291 const std::map<std::string, std::string>& actionArguments, const RefPtr<NG::WebPattern>& webPattern); 292 293 bool DeregisterWebInteractionOperationAsChildTree(int32_t treeID) override; 294 bool RegisterWebInteractionOperationAsChildTree(int64_t accessibilityId, 295 const WeakPtr<NG::WebPattern>& webPattern) override; 296 void GetWebCursorPosition(const int64_t elementId, const int32_t requestId, 297 AccessibilityElementOperatorCallback& callback, const RefPtr<NG::WebPattern>& webPattern); 298 #endif //WEB_SUPPORTED 299 void GetResultOfFocusMoveSearchNG( 300 int64_t elementId, int32_t direction, Accessibility::AccessibilityElementInfo& info); 301 302 std::string GetPagePath(); 303 304 void RegisterAccessibilityChildTreeCallback( 305 int64_t elementId, const std::shared_ptr<AccessibilityChildTreeCallback> &callback) override; 306 307 void DeregisterAccessibilityChildTreeCallback(int64_t elementId) override; 308 309 void RegisterAccessibilitySAObserverCallback( 310 int64_t elementId, const std::shared_ptr<AccessibilitySAObserverCallback> &callback) override; 311 312 void DeregisterAccessibilitySAObserverCallback(int64_t elementId) override; 313 314 void RegisterInteractionOperationAsChildTree(uint32_t parentWindowId, int32_t parentTreeId, 315 int64_t parentElementId) override; 316 void SetAccessibilityGetParentRectHandler(std::function<void(int32_t &, int32_t &)> &&callback) override; 317 void SetAccessibilityGetParentRectHandler( 318 std::function<void(AccessibilityParentRectInfo &)> &&callback) override; 319 void DeregisterInteractionOperationAsChildTree() override; 320 void SendEventToAccessibilityWithNode(const AccessibilityEvent& accessibilityEvent, 321 const RefPtr<AceType>& node, const RefPtr<PipelineBase>& context) override; 322 323 bool RegisterInteractionOperationAsChildTree(const Registration& registration) override; 324 bool DeregisterInteractionOperationAsChildTree(uint32_t windowId, int32_t treeId) override; 325 326 void TransferThirdProviderHoverEvent( 327 const WeakPtr<NG::FrameNode>& hostNode, const NG::PointF& point, SourceType source, 328 NG::AccessibilityHoverEventType eventType, TimeStamp time) override; 329 330 void DumpAccessibilityPropertyNG(const AccessibilityElementInfo& nodeInfo); 331 void DumpCommonPropertyNG(const AccessibilityElementInfo& nodeInfo, int32_t treeId); 332 bool OnDumpChildInfoForThird( 333 int64_t hostElementId, 334 const std::vector<std::string>& params, 335 std::vector<std::string>& info) override; 336 void ProcessParameters( 337 ActionType op, const std::vector<std::string>& params, std::map<std::string, std::string>& paramsMap); 338 bool CheckDumpHandleEventParams(const std::vector<std::string> ¶ms); 339 bool CheckGetActionIdAndOp( 340 const std::vector<std::string>& params, 341 int64_t& actionAccessibilityId, 342 ActionType& actionOp); 343 bool DumpProcessEventParameters( 344 AccessibilityEvent& event, const std::vector<std::string>& params); 345 bool GetDumpInfoArgument(const std::vector<std::string>& params, DumpInfoArgument& argument); 346 347 void FireAccessibilityEventCallback(uint32_t eventId, int64_t parameter) override; 348 AccessibilityWindowInfo GenerateWindowInfo(const RefPtr<NG::FrameNode>& node, 349 const RefPtr<PipelineBase>& context) override; 350 void UpdateWindowInfo(AccessibilityWindowInfo& window, const RefPtr<PipelineBase>& context) override; 351 352 AccessibilityWorkMode GenerateAccessibilityWorkMode() override; 353 354 AccessibilityParentRectInfo GetUECAccessibilityParentRectInfo() const; 355 void UpdateUECAccessibilityParentRectInfo(const AccessibilityParentRectInfo& info); 356 void RegisterUIExtBusinessConsumeCallback(); 357 void RegisterGetParentRectHandler(); 358 IsScreenReaderEnabled()359 bool IsScreenReaderEnabled() override 360 { 361 return isScreenReaderEnabled_; 362 } 363 364 void UpdateAccessibilityNodeRect(const RefPtr<NG::FrameNode>& frameNode) override; 365 void OnAccessbibilityDetachFromMainTree(const RefPtr<NG::FrameNode>& frameNode) override; 366 367 void SetFocusMoveResultWithNode( 368 const WeakPtr<NG::FrameNode>& hostNode, 369 AccessibilityElementOperatorCallback& callback, 370 const int32_t requestId); 371 372 protected: 373 void OnDumpInfoNG(const std::vector<std::string>& params, uint32_t windowId, bool hasJson = false) override; 374 void DumpHandleEvent(const std::vector<std::string>& params) override; 375 void DumpProperty(const std::vector<std::string>& params) override; 376 void DumpTree(int32_t depth, int64_t nodeID, bool isDumpSimplify = false) override; 377 378 private: 379 static constexpr int32_t INVALID_PARENT_ID = -2100000; 380 381 class JsInteractionOperation : public Accessibility::AccessibilityElementOperator { 382 public: JsInteractionOperation(int32_t windowId)383 explicit JsInteractionOperation(int32_t windowId) : windowId_(windowId) {} 384 virtual ~JsInteractionOperation() = default; 385 // Accessibility override. 386 void SearchElementInfoByAccessibilityId(const int64_t elementId, const int32_t requestId, 387 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode) override; 388 void SearchElementInfosByText(const int64_t elementId, const std::string& text, const int32_t requestId, 389 Accessibility::AccessibilityElementOperatorCallback& callback) override; 390 void SearchDefaultFocusByWindowId(const int32_t windowId, const int32_t requestId, 391 Accessibility::AccessibilityElementOperatorCallback &callback, const int32_t pageId) override; 392 void FindFocusedElementInfo(const int64_t elementId, const int32_t focusType, const int32_t requestId, 393 Accessibility::AccessibilityElementOperatorCallback& callback) override; 394 void FocusMoveSearch(const int64_t elementId, const int32_t direction, const int32_t requestId, 395 Accessibility::AccessibilityElementOperatorCallback& callback) override; 396 void ExecuteAction(const int64_t elementId, const int32_t action, 397 const std::map<std::string, std::string>& actionArguments, const int32_t requestId, 398 Accessibility::AccessibilityElementOperatorCallback& callback) override; 399 void ClearFocus() override; 400 void OutsideTouch() override; 401 void GetCursorPosition(const int64_t elementId, const int32_t requestId, 402 Accessibility::AccessibilityElementOperatorCallback &callback) override; 403 void SetChildTreeIdAndWinId(const int64_t nodeId, const int32_t treeId, const int32_t childWindowId) override; 404 void SetBelongTreeId(const int32_t treeId) override; 405 SetHandler(const WeakPtr<JsAccessibilityManager> & js)406 void SetHandler(const WeakPtr<JsAccessibilityManager>& js) 407 { 408 js_ = js; 409 } 410 GetHandler()411 const WeakPtr<JsAccessibilityManager>& GetHandler() const 412 { 413 return js_; 414 } 415 416 private: 417 WeakPtr<JsAccessibilityManager> js_; 418 uint32_t windowId_ = 0; 419 }; 420 #ifdef WEB_SUPPORTED 421 422 class WebInteractionOperation : public Accessibility::AccessibilityElementOperator { 423 public: WebInteractionOperation(int32_t windowId)424 explicit WebInteractionOperation(int32_t windowId) : windowId_(windowId) {} 425 virtual ~WebInteractionOperation() = default; 426 // Accessibility override. 427 void SearchElementInfoByAccessibilityId(const int64_t elementId, const int32_t requestId, 428 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode) override; 429 void SearchElementInfosByText(const int64_t elementId, const std::string& text, const int32_t requestId, 430 Accessibility::AccessibilityElementOperatorCallback& callback) override; 431 void SearchDefaultFocusByWindowId(const int32_t windowId, const int32_t requestId, 432 Accessibility::AccessibilityElementOperatorCallback &callback, const int32_t pageId) override; 433 void FindFocusedElementInfo(const int64_t elementId, const int32_t focusType, const int32_t requestId, 434 Accessibility::AccessibilityElementOperatorCallback& callback) override; 435 void FocusMoveSearch(const int64_t elementId, const int32_t direction, const int32_t requestId, 436 Accessibility::AccessibilityElementOperatorCallback& callback) override; 437 void ExecuteAction(const int64_t elementId, const int32_t action, 438 const std::map<std::string, std::string>& actionArguments, const int32_t requestId, 439 Accessibility::AccessibilityElementOperatorCallback& callback) override; 440 void ClearFocus() override; 441 void OutsideTouch() override; 442 void GetCursorPosition(const int64_t elementId, const int32_t requestId, 443 Accessibility::AccessibilityElementOperatorCallback &callback) override; 444 void SetChildTreeIdAndWinId(const int64_t nodeId, const int32_t treeId, const int32_t childWindowId) override; 445 void SetBelongTreeId(const int32_t treeId) override; 446 SetHandler(const WeakPtr<JsAccessibilityManager> & js)447 void SetHandler(const WeakPtr<JsAccessibilityManager>& js) 448 { 449 js_ = js; 450 } 451 GetHandler()452 const WeakPtr<JsAccessibilityManager>& GetHandler() const 453 { 454 return js_; 455 } 456 SetWebPattern(const WeakPtr<NG::WebPattern> & webPattern)457 void SetWebPattern(const WeakPtr<NG::WebPattern>& webPattern) 458 { 459 webPattern_ = webPattern; 460 } 461 GetWebPattern()462 const WeakPtr<NG::WebPattern>& GetWebPattern() const 463 { 464 return webPattern_; 465 } 466 467 private: 468 WeakPtr<JsAccessibilityManager> js_; 469 uint32_t windowId_ = 0; 470 WeakPtr<NG::WebPattern> webPattern_; 471 }; 472 #endif // WEB_SUPPORTED 473 474 class ToastAccessibilityConfigObserver : public AccessibilityConfig::AccessibilityConfigObserver { 475 public: 476 ToastAccessibilityConfigObserver() = default; 477 void OnConfigChanged( 478 const AccessibilityConfig::CONFIG_ID id, const AccessibilityConfig::ConfigValue& value) override; 479 }; 480 481 class JsAccessibilityStateObserver : public Accessibility::AccessibilityStateObserver { 482 public: 483 void OnStateChanged(const bool state) override; SetAccessibilityManager(const WeakPtr<JsAccessibilityManager> & accessibilityManager)484 void SetAccessibilityManager(const WeakPtr<JsAccessibilityManager>& accessibilityManager) 485 { 486 accessibilityManager_ = accessibilityManager; 487 } 488 SetPipeline(const WeakPtr<PipelineBase> & pipeline)489 void SetPipeline(const WeakPtr<PipelineBase>& pipeline) 490 { 491 pipeline_ = pipeline; 492 } 493 SetEventType(uint32_t eventType)494 void SetEventType(uint32_t eventType) 495 { 496 eventType_ = eventType; 497 } 498 499 private: 500 // Do not upgrade accessibilityManager_ on async thread, destructor might cause freeze 501 WeakPtr<JsAccessibilityManager> accessibilityManager_; 502 WeakPtr<PipelineBase> pipeline_; 503 uint32_t eventType_; 504 }; 505 506 bool AccessibilityActionEvent(const Accessibility::ActionType& action, 507 const std::map<std::string, std::string>& actionArguments, const RefPtr<AccessibilityNode>& node, 508 const RefPtr<PipelineContext>& context); 509 bool RequestAccessibilityFocus(const RefPtr<AccessibilityNode>& node); 510 511 bool ClearAccessibilityFocus(const RefPtr<AccessibilityNode>& node); 512 513 void AddFocusableNode(std::list<RefPtr<AccessibilityNode>>& nodeList, const RefPtr<AccessibilityNode>& node); 514 bool CanAccessibilityFocused(const RefPtr<AccessibilityNode>& node); 515 RefPtr<AccessibilityNode> FindNodeInRelativeDirection( 516 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node, const int direction); 517 RefPtr<AccessibilityNode> FindNodeInAbsoluteDirection( 518 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node, const int direction); 519 RefPtr<AccessibilityNode> GetNextFocusableNode( 520 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node); 521 RefPtr<AccessibilityNode> GetPreviousFocusableNode( 522 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node); 523 524 bool ExecuteActionNG(int64_t elementId, const std::map<std::string, std::string>& actionArguments, 525 Accessibility::ActionType action, const RefPtr<PipelineBase>& context, int64_t uiExtensionOffset); 526 bool ConvertActionTypeToBoolen(Accessibility::ActionType action, RefPtr<NG::FrameNode>& frameNode, 527 int64_t elementId, RefPtr<NG::PipelineContext>& context); 528 void SetSearchElementInfoByAccessibilityIdResult(Accessibility::AccessibilityElementOperatorCallback& callback, 529 std::list<Accessibility::AccessibilityElementInfo>&& infos, const int32_t requestId); 530 531 void SetSearchElementInfoByTextResult(Accessibility::AccessibilityElementOperatorCallback& callback, 532 std::list<Accessibility::AccessibilityElementInfo>&& infos, const int32_t requestId); 533 534 void SetSearchDefaultFocusByWindowIdResult(Accessibility::AccessibilityElementOperatorCallback& callback, 535 std::list<Accessibility::AccessibilityElementInfo>&& infos, const int32_t requestId); 536 537 void SetFindFocusedElementInfoResult(Accessibility::AccessibilityElementOperatorCallback& callback, 538 Accessibility::AccessibilityElementInfo& info, const int32_t requestId); 539 540 void SetFocusMoveSearchResult(Accessibility::AccessibilityElementOperatorCallback& callback, 541 Accessibility::AccessibilityElementInfo& info, const int32_t requestId); 542 543 void SetExecuteActionResult( 544 Accessibility::AccessibilityElementOperatorCallback& callback, const bool succeeded, const int32_t requestId); 545 546 void SearchExtensionElementInfoByAccessibilityIdNG(const SearchParameter& searchParam, 547 const RefPtr<NG::FrameNode>& node, std::list<Accessibility::AccessibilityElementInfo>& infos, 548 const RefPtr<PipelineBase>& context, const RefPtr<NG::PipelineContext>& ngPipeline); 549 void SearchElementInfosByTextNG(const SearchParameter& searchParam, const RefPtr<NG::FrameNode>& node, 550 std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context, 551 const RefPtr<NG::PipelineContext>& ngPipeline); 552 std::list<Accessibility::AccessibilityElementInfo> SearchElementInfosByTextNG( 553 int64_t elementId, const std::string& text, const RefPtr<NG::FrameNode>& node, int64_t offset); 554 void FindFocusedExtensionElementInfoNG(const SearchParameter& searchParam, 555 Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context, 556 const RefPtr<NG::FrameNode>& root); 557 void FocusExtensionElementMoveSearchNG(const SearchParameter& searchParam, 558 Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context, 559 const RefPtr<NG::FrameNode>& root, RefPtr<NG::FrameNode>& outputExtensionNode); 560 void TransferExecuteAction(int64_t elementId, RefPtr<NG::FrameNode>& node, 561 const std::map<std::string, std::string>& actionArguments, 562 Accessibility::ActionType& action, int64_t uiExtensionOffset); 563 RefPtr<NG::FrameNode> FindNodeFromRootByExtensionId(const RefPtr<NG::FrameNode>& root, const int64_t uiExtensionId); 564 bool RegisterThirdProviderInteractionOperationAsChildTree(const Registration& registration); 565 566 void DumpProperty(const RefPtr<AccessibilityNode>& node); 567 void DumpPropertyNG(int64_t nodeID); 568 void DumpHoverTestNG(uint32_t windowId, int64_t nodeID, int32_t x, int32_t y, bool verbose); 569 RefPtr<NG::PipelineContext> FindPipelineByElementId(const int64_t elementId, RefPtr<NG::FrameNode>& node); 570 RefPtr<NG::FrameNode> FindNodeFromPipeline(const WeakPtr<PipelineBase>& context, const int64_t elementId); 571 RefPtr<PipelineBase> GetPipelineByWindowId(const int32_t windowId); 572 573 RefPtr<NG::PipelineContext> GetPipelineByWindowId(uint32_t windowId); 574 void DumpTreeNG(bool useWindowId, uint32_t windowId, int64_t rootId, bool isDumpSimplify = false); 575 void DumpTreeNG(const RefPtr<NG::FrameNode>& parent, int32_t depth, 576 int64_t nodeID, const CommonProperty& commonProperty, bool isDumpSimplify = false); 577 void DumpTreeNodeSafeAreaInfoNg(const RefPtr<NG::FrameNode>& node); 578 void DumpPadding(const std::unique_ptr<NG::PaddingProperty>& padding, std::string label); 579 void DumpBorder(const std::unique_ptr<NG::BorderWidthProperty>& border, std::string label); 580 void DumpTreeNodeCommonInfoNg(const RefPtr<NG::FrameNode>& node, const CommonProperty& commonProperty); 581 void DumpTreeNodeSimplifyInfoNG( 582 const RefPtr<NG::FrameNode>& node, int32_t depth, const CommonProperty& commonProperty, int32_t childSize); 583 void DumpTreeAccessibilityNodeNG(const RefPtr<NG::UINode>& uiNodeParent, 584 int32_t depth, int64_t nodeID, const CommonProperty& commonProperty); 585 bool CheckDumpInfoParams(const std::vector<std::string> ¶ms); 586 void DumpSendEventTest(int64_t nodeId, int32_t eventId, const std::vector<std::string>& params); 587 588 void GenerateCommonProperty(const RefPtr<PipelineBase>& context, CommonProperty& output, 589 const RefPtr<PipelineBase>& mainContext, const RefPtr<NG::FrameNode>& node = nullptr); 590 591 void FindText(const RefPtr<NG::UINode>& node, std::list<Accessibility::AccessibilityElementInfo>& infos, 592 const RefPtr<NG::PipelineContext>& context, 593 const CommonProperty& commonProperty, const SearchParameter& searchParam); 594 595 void FindTextByTextHint(const RefPtr<NG::UINode>& node, std::list<Accessibility::AccessibilityElementInfo>& infos, 596 const RefPtr<NG::PipelineContext>& context, 597 const CommonProperty& commonProperty, const SearchParameter& searchParam); 598 599 void UpdateAccessibilityElementInfo( 600 const RefPtr<NG::FrameNode>& node, Accessibility::AccessibilityElementInfo& nodeInfo); 601 602 void UpdateAccessibilityVisible( 603 const RefPtr<NG::FrameNode>& node, AccessibilityElementInfo& nodeInfo); 604 605 void UpdateVirtualNodeInfo(std::list<Accessibility::AccessibilityElementInfo>& infos, 606 Accessibility::AccessibilityElementInfo& nodeInfo, 607 const RefPtr<NG::UINode>& uiVirtualNode, const CommonProperty& commonProperty, 608 const RefPtr<NG::PipelineContext>& ngPipeline); 609 610 void UpdateVirtualNodeChildAccessibilityElementInfo( 611 const RefPtr<NG::FrameNode>& node, const CommonProperty& commonProperty, 612 Accessibility::AccessibilityElementInfo& nodeParentInfo, Accessibility::AccessibilityElementInfo& nodeInfo, 613 const RefPtr<NG::PipelineContext>& ngPipeline); 614 615 void UpdateVirtualNodeAccessibilityElementInfo( 616 const RefPtr<NG::FrameNode>& parent, const RefPtr<NG::FrameNode>& node, 617 const CommonProperty& commonProperty, Accessibility::AccessibilityElementInfo& nodeInfo, 618 const RefPtr<NG::PipelineContext>& ngPipeline); 619 620 void UpdateAccessibilityElementInfo( 621 const RefPtr<NG::FrameNode>& node, const CommonProperty& commonProperty, 622 Accessibility::AccessibilityElementInfo& nodeInfo, const RefPtr<NG::PipelineContext>& ngPipeline); 623 624 void UpdateCacheInfoNG(std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<NG::FrameNode>& node, 625 CommonProperty& commonProperty, const RefPtr<NG::PipelineContext>& ngPipeline, 626 const SearchParameter& searchParam); 627 #ifdef WEB_SUPPORTED 628 629 void UpdateWebAccessibilityElementInfo(const std::shared_ptr<NG::TransitionalNodeInfo>& node, 630 Accessibility::AccessibilityElementInfo& nodeInfo, int32_t treeId); 631 632 void UpdateWebAccessibilityElementInfo(const std::shared_ptr<NG::TransitionalNodeInfo>& node, 633 const CommonProperty& commonProperty, Accessibility::AccessibilityElementInfo& nodeInfo, 634 const RefPtr<NG::WebPattern>& webPattern); 635 636 void UpdateWebCacheInfo(std::list<Accessibility::AccessibilityElementInfo>& infos, int64_t nodeId, 637 const CommonProperty& commonProperty, const RefPtr<NG::PipelineContext>& ngPipeline, 638 const SearchParameter& searchParam, const RefPtr<NG::WebPattern>& webPattern); 639 #endif //WEB_SUPPORTED 640 void NotifyChildTreeOnRegister(int32_t treeId); 641 642 void NotifyChildTreeOnDeregister(); 643 644 void SendUecOnTreeEvent(int64_t splitElementId); 645 646 void NotifySetChildTreeIdAndWinId(int64_t elementId, const int32_t treeId, const int32_t childWindowId); 647 648 bool CheckIsChildElement( 649 int64_t &elementId, 650 const std::vector<std::string>& params, 651 std::vector<std::string>& info, 652 DumpMode mode, 653 int64_t &rootId); 654 655 bool NeedRegisterChildTree(uint32_t parentWindowId, int32_t parentTreeId, int64_t parentElementId); 656 657 void FillEventInfoWithNode( 658 const RefPtr<NG::FrameNode>& node, 659 Accessibility::AccessibilityEventInfo& eventInfo, 660 const RefPtr<NG::PipelineContext>& context, 661 int64_t elementId); 662 663 void NotifyAccessibilitySAStateChange(bool state); 664 void DumpTreeNodeInfoInJson( 665 const RefPtr<NG::FrameNode>& node, int32_t depth, const CommonProperty& commonProperty, int32_t childSize); 666 void CreateNodeInfoJson(const RefPtr<NG::FrameNode>& node, const CommonProperty& commonProperty, 667 std::unique_ptr<JsonValue>& json, int32_t childSize); 668 bool IsEventIgnoredByWorkMode(const AccessibilityEvent& accessibilityEvent); 669 void SendEventToAccessibilityWithNodeInner(const AccessibilityEvent& accessibilityEvent, 670 const RefPtr<AceType>& node, const RefPtr<PipelineBase>& context); 671 void SendAccessibilityAsyncEventInner(const AccessibilityEvent& accessibilityEvent); 672 int64_t GetDelayTimeBeforeSendEvent(const AccessibilityEvent& accessibilityEvent, const RefPtr<AceType>& node); 673 void UpdateChildrenNodeInCache(std::list<AccessibilityElementInfo>& infos, 674 const CommonProperty& commonProperty, const RefPtr<NG::PipelineContext>& ngPipeline, 675 const SearchParameter& searchParam, std::list<RefPtr<NG::FrameNode>>& children); 676 677 void RegisterDynamicRenderGetParentRectHandler(); 678 679 void GetCurrentWindowPages( 680 const RefPtr<NG::PipelineContext>& ngPipeline, 681 std::vector<RefPtr<NG::FrameNode>>& pageNodes, 682 std::vector<std::string>& pagePaths); 683 const std::string GetPagePathInPageNodes( 684 int32_t pageId, 685 const std::vector<RefPtr<NG::FrameNode>>& pageNodes, 686 const std::vector<std::string> pagePaths); 687 688 std::string callbackKey_; 689 uint32_t windowId_ = 0; 690 std::unordered_map<uint32_t, std::shared_ptr<JsAccessibilityStateObserver>> stateObserver_; 691 std::shared_ptr<ToastAccessibilityConfigObserver> toastObserver_ = nullptr; 692 float scaleX_ = 1.0f; 693 float scaleY_ = 1.0f; 694 int64_t currentFocusNodeId_ = -1; 695 bool isScreenReaderEnabled_ = false; 696 697 int64_t lastElementId_ = -1; 698 WeakPtr<NG::FrameNode> lastFrameNode_; 699 NG::SizeF oldGeometrySize_; 700 mutable std::mutex childTreeCallbackMapMutex_; 701 std::unordered_map<int64_t, std::shared_ptr<AccessibilityChildTreeCallback>> childTreeCallbackMap_; 702 mutable std::mutex componentSACallbackMutex_; 703 std::unordered_map<int64_t, std::shared_ptr<AccessibilitySAObserverCallback>> componentSACallbackMap_; 704 int64_t parentElementId_ = INVALID_PARENT_ID; 705 uint32_t parentWindowId_ = 0; 706 int32_t parentTreeId_ = 0; 707 uint32_t parentWebWindowId_ = 0; 708 std::function<void(int32_t&, int32_t&)> getParentRectHandler_; 709 std::function<void(AccessibilityParentRectInfo&)> getParentRectHandlerNew_; 710 bool isUseJson_ = false; 711 bool reentrantLimit_ = false; 712 std::string pageMode_; 713 std::vector<AccessibilityEvent> cacheEventVec_; 714 std::list<WeakPtr<NG::FrameNode>> defaultFocusList_; 715 std::vector<std::pair<WeakPtr<NG::FrameNode>, bool>> extensionComponentStatusVec_; 716 std::unordered_map<int32_t, std::optional<AccessibilityEvent>> pageIdEventMap_; 717 AccessibilityParentRectInfo uecRectInfo_; 718 }; 719 720 } // namespace OHOS::Ace::Framework 721 722 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_ACCESSIBILITY_JS_ACCESSIBILITY_MANAGER_H 723