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