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
34namespace OHOS::NWeb {
35class NWebAccessibilityNodeInfo;
36} // namespace OHOS::NWeb::NWebAccessibilityNodeInfo
37
38namespace OHOS::Ace::Framework {
39
40struct SearchParameter {
41    int64_t nodeId;
42    std::string text;
43    int32_t mode;
44    int64_t uiExtensionOffset;
45};
46
47struct CommonProperty {
48    int32_t windowId = 0;
49    int32_t windowLeft = 0;
50    int32_t windowTop = 0;
51    int32_t pageId = 0;
52    std::string pagePath;
53};
54
55struct ActionTable {
56    AceAction aceAction;
57    ActionType action;
58};
59
60struct ActionStrTable {
61    ActionType action;
62    std::string actionStr;
63};
64
65struct FillEventInfoParam {
66    int64_t elementId = 0;
67    int64_t stackNodeId = 0;
68    uint32_t windowId = 0;
69};
70
71struct AccessibilityActionParam {
72    RefPtr<NG::AccessibilityProperty> accessibilityProperty;
73    std::string setTextArgument = "";
74    int32_t setSelectionStart = -1;
75    int32_t setSelectionEnd = -1;
76    bool setSelectionDir = false;
77    int32_t setCursorIndex = -1;
78    TextMoveUnit moveUnit = TextMoveUnit::STEP_CHARACTER;
79    AccessibilityScrollType scrollType = AccessibilityScrollType::SCROLL_DEFAULT;
80    int32_t spanId = -1;
81};
82
83struct ActionParam {
84    Accessibility::ActionType action;
85    std::map<std::string, std::string> actionArguments;
86};
87
88class JsAccessibilityManager : public AccessibilityNodeManager,
89    public AccessibilityHoverManagerForThirdNG {
90    DECLARE_ACE_TYPE(JsAccessibilityManager, AccessibilityNodeManager);
91
92public:
93    JsAccessibilityManager() = default;
94    ~JsAccessibilityManager() override;
95
96    // JsAccessibilityManager overrides functions.
97    void InitializeCallback() override;
98    void SendAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent) override;
99    void UpdateVirtualNodeFocus() override;
100    void SetCardViewParams(const std::string& key, bool focus) override;
101    void HandleComponentPostBinding() override;
102    void RegisterSubWindowInteractionOperation(int windowId) override;
103    void SetPipelineContext(const RefPtr<PipelineBase>& context) override;
104    void UpdateElementInfosTreeId(std::list<Accessibility::AccessibilityElementInfo>& infos);
105    void UpdateElementInfoTreeId(Accessibility::AccessibilityElementInfo& info);
106
107    void UpdateViewScale();
108
109    float GetScaleX() const
110    {
111        return scaleX_;
112    }
113
114    float GetScaleY() const
115    {
116        return scaleY_;
117    }
118
119    uint32_t GetWindowId() const
120    {
121        return windowId_;
122    }
123
124    void SetWindowId(uint32_t windowId)
125    {
126        windowId_ = windowId;
127    }
128
129    void SaveLast(const int64_t elementId, const RefPtr<NG::FrameNode>& node)
130    {
131        lastElementId_ = elementId;
132        lastFrameNode_ = node;
133    }
134
135    void SaveCurrentFocusNodeSize(const RefPtr<NG::FrameNode>& currentFocusNode)
136    {
137        if (currentFocusNode->IsAccessibilityVirtualNode()) {
138            auto oldGeometryNode = currentFocusNode->GetGeometryNode();
139            CHECK_NULL_VOID(oldGeometryNode);
140            oldGeometrySize_ = oldGeometryNode->GetFrameSize();
141        }
142    }
143
144    bool SubscribeToastObserver();
145    bool UnsubscribeToastObserver();
146    bool SubscribeStateObserver(int eventType);
147    bool UnsubscribeStateObserver(int eventType);
148    int RegisterInteractionOperation(int windowId);
149    void DeregisterInteractionOperation();
150    bool SendAccessibilitySyncEvent(
151        const AccessibilityEvent& accessibilityEvent, Accessibility::AccessibilityEventInfo eventInfo);
152    bool TransferAccessibilityAsyncEvent(
153        const Accessibility::AccessibilityEventInfo& eventInfo,
154        int64_t uiExtensionOffset) override;
155    void SendExtensionAccessibilityEvent(
156        const Accessibility::AccessibilityEventInfo& eventInfo,
157        int64_t uiExtensionOffset) override;
158    void SearchElementInfoByAccessibilityId(const int64_t elementId, const int32_t requestId,
159        Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode, const int32_t windowId);
160    void SearchElementInfosByText(const int64_t elementId, const std::string& text, const int32_t requestId,
161        Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId);
162    void FindFocusedElementInfo(const int64_t elementId, const int32_t focusType, const int32_t requestId,
163        Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId);
164    void FocusMoveSearch(const int64_t elementId, const int32_t direction, const int32_t requestId,
165        Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId);
166
167    void ExecuteAction(const int64_t accessibilityId, const ActionParam& param, const int32_t requestId,
168        Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId);
169    bool ClearCurrentFocus();
170    void UpdateNodeChildIds(const RefPtr<AccessibilityNode>& node);
171    void SendActionEvent(const Accessibility::ActionType& action, int64_t nodeId);
172    void SearchElementInfoByAccessibilityIdNG(int64_t elementId, int32_t mode,
173        std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context,
174        const int64_t uiExtensionOffset = 0) override;
175    void SearchElementInfosByTextNG(int64_t elementId, const std::string& text,
176        std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context,
177        const int64_t uiExtensionOffset = 0) override;
178    void FindFocusedElementInfoNG(int64_t elementId, int32_t focusType, Accessibility::AccessibilityElementInfo& info,
179        const RefPtr<PipelineBase>& context, const int64_t uiExtensionOffset = 0) override;
180    void FocusMoveSearchNG(int64_t elementId, int32_t direction, Accessibility::AccessibilityElementInfo& info,
181        const RefPtr<PipelineBase>& context, const int64_t uiExtensionOffset = 0) override;
182    bool ExecuteExtensionActionNG(int64_t elementId, const std::map<std::string, std::string>& actionArguments,
183        int32_t action, const RefPtr<PipelineBase>& context, int64_t uiExtensionOffset) override;
184#ifdef WEB_SUPPORTED
185    void SendWebAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent,
186        const RefPtr<NG::WebPattern>& webPattern) override;
187    void SearchWebElementInfoByAccessibilityId(const int64_t elementId, const int32_t requestId,
188        Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode, const int32_t windowId,
189        const RefPtr<NG::WebPattern>& webPattern);
190    void SearchWebElementInfoByAccessibilityIdNG(int64_t elementId, int32_t mode,
191        std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context,
192        const RefPtr<NG::WebPattern>& webPattern);
193    void FindWebFocusedElementInfo(const int64_t elementId, const int32_t focusType,
194        const int32_t requestId, Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId,
195        const RefPtr<NG::WebPattern>& webPattern);
196    void FindWebFocusedElementInfoNG(int64_t elementId, int32_t focusType,
197        Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context,
198        const RefPtr<NG::WebPattern>& webPattern);
199    void WebFocusMoveSearch(const int64_t elementId, const int32_t direction, const int32_t requestId,
200        Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId,
201        const RefPtr<NG::WebPattern>& webPattern);
202    void WebFocusMoveSearchNG(int64_t elementId, int32_t direction,
203        Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context,
204        const RefPtr<NG::WebPattern>& webPattern);
205    void ExecuteWebAction(const int64_t elementId, const ActionParam& param, const int32_t requestId,
206        Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId,
207        const RefPtr<NG::WebPattern>& webPattern);
208    bool ExecuteWebActionNG(int64_t elementId, Accessibility::ActionType action,
209        const std::map<std::string, std::string>& actionArguments, const RefPtr<NG::WebPattern>& webPattern);
210
211    bool DeregisterWebInteractionOperationAsChildTree(int32_t treeID) override;
212    bool RegisterWebInteractionOperationAsChildTree(int64_t accessibilityId,
213        const WeakPtr<NG::WebPattern>& webPattern) override;
214    void GetWebCursorPosition(const int64_t elementId, const int32_t requestId,
215        AccessibilityElementOperatorCallback& callback, const RefPtr<NG::WebPattern>& webPattern);
216#endif //WEB_SUPPORTED
217    void GetResultOfFocusMoveSearchNG(
218        int64_t elementId, int32_t direction, Accessibility::AccessibilityElementInfo& info);
219
220    std::string GetPagePath();
221
222    void RegisterAccessibilityChildTreeCallback(
223        int64_t elementId, const std::shared_ptr<AccessibilityChildTreeCallback> &callback) override;
224
225    void DeregisterAccessibilityChildTreeCallback(int64_t elementId) override;
226
227    void RegisterAccessibilitySAObserverCallback(
228        int64_t elementId, const std::shared_ptr<AccessibilitySAObserverCallback> &callback) override;
229
230    void DeregisterAccessibilitySAObserverCallback(int64_t elementId) override;
231
232    void RegisterInteractionOperationAsChildTree(uint32_t parentWindowId, int32_t parentTreeId,
233        int64_t parentElementId) override;
234    void SetAccessibilityGetParentRectHandler(std::function<void(int32_t &, int32_t &)> &&callback) override;
235    void SetAccessibilityGetParentRectHandler(
236        std::function<void(AccessibilityParentRectInfo &)> &&callback) override;
237    void DeregisterInteractionOperationAsChildTree() override;
238    void SendEventToAccessibilityWithNode(const AccessibilityEvent& accessibilityEvent,
239        const RefPtr<AceType>& node, const RefPtr<PipelineBase>& context) override;
240
241    bool RegisterInteractionOperationAsChildTree(const Registration& registration) override;
242    bool DeregisterInteractionOperationAsChildTree(uint32_t windowId, int32_t treeId) override;
243
244    void TransferThirdProviderHoverEvent(
245        const WeakPtr<NG::FrameNode>& hostNode, const NG::PointF& point, SourceType source,
246        NG::AccessibilityHoverEventType eventType, TimeStamp time) override;
247
248    void DumpAccessibilityPropertyNG(const AccessibilityElementInfo& nodeInfo);
249    void DumpCommonPropertyNG(const AccessibilityElementInfo& nodeInfo, int32_t treeId);
250    bool OnDumpChildInfoForThird(
251        int64_t hostElementId,
252        const std::vector<std::string>& params,
253        std::vector<std::string>& info) override;
254
255protected:
256    void OnDumpInfoNG(const std::vector<std::string>& params, uint32_t windowId, bool hasJson = false) override;
257    void DumpHandleEvent(const std::vector<std::string>& params) override;
258    void DumpProperty(const std::vector<std::string>& params) override;
259    void DumpTree(int32_t depth, int64_t nodeID, bool isDumpSimplify = false) override;
260
261private:
262    static constexpr int32_t INVALID_PARENT_ID = -2100000;
263
264    class JsInteractionOperation : public Accessibility::AccessibilityElementOperator {
265    public:
266        explicit JsInteractionOperation(int32_t windowId) : windowId_(windowId) {}
267        virtual ~JsInteractionOperation() = default;
268        // Accessibility override.
269        void SearchElementInfoByAccessibilityId(const int64_t elementId, const int32_t requestId,
270            Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode) override;
271        void SearchElementInfosByText(const int64_t elementId, const std::string& text, const int32_t requestId,
272            Accessibility::AccessibilityElementOperatorCallback& callback) override;
273        void FindFocusedElementInfo(const int64_t elementId, const int32_t focusType, const int32_t requestId,
274            Accessibility::AccessibilityElementOperatorCallback& callback) override;
275        void FocusMoveSearch(const int64_t elementId, const int32_t direction, const int32_t requestId,
276            Accessibility::AccessibilityElementOperatorCallback& callback) override;
277        void ExecuteAction(const int64_t elementId, const int32_t action,
278            const std::map<std::string, std::string>& actionArguments, const int32_t requestId,
279            Accessibility::AccessibilityElementOperatorCallback& callback) override;
280        void ClearFocus() override;
281        void OutsideTouch() override;
282        void GetCursorPosition(const int64_t elementId, const int32_t requestId,
283            Accessibility::AccessibilityElementOperatorCallback &callback) override;
284        void SetChildTreeIdAndWinId(const int64_t nodeId, const int32_t treeId, const int32_t childWindowId) override;
285        void SetBelongTreeId(const int32_t treeId) override;
286
287        void SetHandler(const WeakPtr<JsAccessibilityManager>& js)
288        {
289            js_ = js;
290        }
291
292        const WeakPtr<JsAccessibilityManager>& GetHandler() const
293        {
294            return js_;
295        }
296
297    private:
298        WeakPtr<JsAccessibilityManager> js_;
299        uint32_t windowId_ = 0;
300    };
301#ifdef WEB_SUPPORTED
302
303    class WebInteractionOperation : public Accessibility::AccessibilityElementOperator {
304    public:
305        explicit WebInteractionOperation(int32_t windowId) : windowId_(windowId) {}
306        virtual ~WebInteractionOperation() = default;
307        // Accessibility override.
308        void SearchElementInfoByAccessibilityId(const int64_t elementId, const int32_t requestId,
309            Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode) override;
310        void SearchElementInfosByText(const int64_t elementId, const std::string& text, const int32_t requestId,
311            Accessibility::AccessibilityElementOperatorCallback& callback) override;
312        void FindFocusedElementInfo(const int64_t elementId, const int32_t focusType, const int32_t requestId,
313            Accessibility::AccessibilityElementOperatorCallback& callback) override;
314        void FocusMoveSearch(const int64_t elementId, const int32_t direction, const int32_t requestId,
315            Accessibility::AccessibilityElementOperatorCallback& callback) override;
316        void ExecuteAction(const int64_t elementId, const int32_t action,
317            const std::map<std::string, std::string>& actionArguments, const int32_t requestId,
318            Accessibility::AccessibilityElementOperatorCallback& callback) override;
319        void ClearFocus() override;
320        void OutsideTouch() override;
321        void GetCursorPosition(const int64_t elementId, const int32_t requestId,
322            Accessibility::AccessibilityElementOperatorCallback &callback) override;
323        void SetChildTreeIdAndWinId(const int64_t nodeId, const int32_t treeId, const int32_t childWindowId) override;
324        void SetBelongTreeId(const int32_t treeId) override;
325
326        void SetHandler(const WeakPtr<JsAccessibilityManager>& js)
327        {
328            js_ = js;
329        }
330
331        const WeakPtr<JsAccessibilityManager>& GetHandler() const
332        {
333            return js_;
334        }
335
336        void SetWebPattern(const WeakPtr<NG::WebPattern>& webPattern)
337        {
338            webPattern_ = webPattern;
339        }
340
341        const WeakPtr<NG::WebPattern>& GetWebPattern() const
342        {
343            return webPattern_;
344        }
345
346    private:
347        WeakPtr<JsAccessibilityManager> js_;
348        uint32_t windowId_ = 0;
349        WeakPtr<NG::WebPattern> webPattern_;
350    };
351#endif // WEB_SUPPORTED
352
353    class ToastAccessibilityConfigObserver : public AccessibilityConfig::AccessibilityConfigObserver {
354    public:
355        ToastAccessibilityConfigObserver() = default;
356        void OnConfigChanged(
357            const AccessibilityConfig::CONFIG_ID id, const AccessibilityConfig::ConfigValue& value) override;
358    };
359
360    class JsAccessibilityStateObserver : public Accessibility::AccessibilityStateObserver {
361    public:
362        void OnStateChanged(const bool state) override;
363        void SetAccessibilityManager(const WeakPtr<JsAccessibilityManager>& accessibilityManager)
364        {
365            accessibilityManager_ = accessibilityManager;
366        }
367
368        void SetPipeline(const WeakPtr<PipelineBase>& pipeline)
369        {
370            pipeline_ = pipeline;
371        }
372
373    private:
374        // Do not upgrade accessibilityManager_ on async thread, destructor might cause freeze
375        WeakPtr<JsAccessibilityManager> accessibilityManager_;
376        WeakPtr<PipelineBase> pipeline_;
377    };
378
379    bool AccessibilityActionEvent(const Accessibility::ActionType& action,
380        const std::map<std::string, std::string>& actionArguments, const RefPtr<AccessibilityNode>& node,
381        const RefPtr<PipelineContext>& context);
382    bool RequestAccessibilityFocus(const RefPtr<AccessibilityNode>& node);
383
384    bool ClearAccessibilityFocus(const RefPtr<AccessibilityNode>& node);
385
386    void AddFocusableNode(std::list<RefPtr<AccessibilityNode>>& nodeList, const RefPtr<AccessibilityNode>& node);
387    bool CanAccessibilityFocused(const RefPtr<AccessibilityNode>& node);
388    RefPtr<AccessibilityNode> FindNodeInRelativeDirection(
389        const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node, const int direction);
390    RefPtr<AccessibilityNode> FindNodeInAbsoluteDirection(
391        const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node, const int direction);
392    RefPtr<AccessibilityNode> GetNextFocusableNode(
393        const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node);
394    RefPtr<AccessibilityNode> GetPreviousFocusableNode(
395        const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node);
396
397    bool ExecuteActionNG(int64_t elementId, const std::map<std::string, std::string>& actionArguments,
398        Accessibility::ActionType action, const RefPtr<PipelineBase>& context, int64_t uiExtensionOffset);
399    bool ConvertActionTypeToBoolen(Accessibility::ActionType action, RefPtr<NG::FrameNode>& frameNode,
400        int64_t elementId, RefPtr<NG::PipelineContext>& context);
401    void SetSearchElementInfoByAccessibilityIdResult(Accessibility::AccessibilityElementOperatorCallback& callback,
402        std::list<Accessibility::AccessibilityElementInfo>&& infos, const int32_t requestId);
403
404    void SetSearchElementInfoByTextResult(Accessibility::AccessibilityElementOperatorCallback& callback,
405        std::list<Accessibility::AccessibilityElementInfo>&& infos, const int32_t requestId);
406
407    void SetFindFocusedElementInfoResult(Accessibility::AccessibilityElementOperatorCallback& callback,
408        Accessibility::AccessibilityElementInfo& info, const int32_t requestId);
409
410    void SetFocusMoveSearchResult(Accessibility::AccessibilityElementOperatorCallback& callback,
411        Accessibility::AccessibilityElementInfo& info, const int32_t requestId);
412
413    void SetExecuteActionResult(
414        Accessibility::AccessibilityElementOperatorCallback& callback, const bool succeeded, const int32_t requestId);
415
416    void SearchExtensionElementInfoByAccessibilityIdNG(const SearchParameter& searchParam,
417        const RefPtr<NG::FrameNode>& node, std::list<Accessibility::AccessibilityElementInfo>& infos,
418        const RefPtr<PipelineBase>& context, const RefPtr<NG::PipelineContext>& ngPipeline);
419    void SearchElementInfosByTextNG(const SearchParameter& searchParam, const RefPtr<NG::FrameNode>& node,
420        std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context,
421        const RefPtr<NG::PipelineContext>& ngPipeline);
422    std::list<Accessibility::AccessibilityElementInfo> SearchElementInfosByTextNG(
423        int64_t elementId, const std::string& text, const RefPtr<NG::FrameNode>& node, int64_t offset);
424    void FindFocusedExtensionElementInfoNG(const SearchParameter& searchParam,
425        Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context,
426        const RefPtr<NG::FrameNode>& root);
427    void FocusExtensionElementMoveSearchNG(const SearchParameter& searchParam,
428        Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context,
429        const RefPtr<NG::FrameNode>& root, RefPtr<NG::FrameNode>& outputExtensionNode);
430    void TransferExecuteAction(int64_t elementId, RefPtr<NG::FrameNode>& node,
431        const std::map<std::string, std::string>& actionArguments,
432        Accessibility::ActionType& action, int64_t uiExtensionOffset);
433    RefPtr<NG::FrameNode> FindNodeFromRootByExtensionId(const RefPtr<NG::FrameNode>& root, const int64_t uiExtensionId);
434    bool RegisterThirdProviderInteractionOperationAsChildTree(const Registration& registration);
435
436    void DumpProperty(const RefPtr<AccessibilityNode>& node);
437    void DumpPropertyNG(int64_t nodeID);
438    void DumpHoverTestNG(uint32_t windowId, int64_t nodeID, int32_t x, int32_t y, bool verbose);
439    RefPtr<NG::PipelineContext> FindPipelineByElementId(const int64_t elementId, RefPtr<NG::FrameNode>& node);
440    RefPtr<NG::FrameNode> FindNodeFromPipeline(const WeakPtr<PipelineBase>& context, const int64_t elementId);
441    RefPtr<PipelineBase> GetPipelineByWindowId(const int32_t windowId);
442    void ProcessParameters(Accessibility::ActionType op, const std::vector<std::string>& params,
443        std::map<std::string, std::string>& paramsMap);
444
445    RefPtr<NG::PipelineContext> GetPipelineByWindowId(uint32_t windowId);
446    void DumpTreeNG(bool useWindowId, uint32_t windowId, int64_t rootId, bool isDumpSimplify = false);
447    void DumpTreeNG(const RefPtr<NG::FrameNode>& parent, int32_t depth,
448        int64_t nodeID, const CommonProperty& commonProperty, bool isDumpSimplify = false);
449    void DumpTreeNodeSafeAreaInfoNg(const RefPtr<NG::FrameNode>& node);
450    void DumpPadding(const std::unique_ptr<NG::PaddingProperty>& padding, std::string label);
451    void DumpBorder(const std::unique_ptr<NG::BorderWidthProperty>& border, std::string label);
452    void DumpTreeNodeCommonInfoNg(const RefPtr<NG::FrameNode>& node, const CommonProperty& commonProperty);
453    void DumpTreeNodeSimplifyInfoNG(
454        const RefPtr<NG::FrameNode>& node, int32_t depth, const CommonProperty& commonProperty, int32_t childSize);
455    void DumpTreeAccessibilityNodeNG(const RefPtr<NG::UINode>& uiNodeParent,
456        int32_t depth, int64_t nodeID, const CommonProperty& commonProperty);
457    bool CheckDumpInfoParams(const std::vector<std::string> &params);
458    bool CheckDumpHandleEventParams(const std::vector<std::string> &params);
459    void GenerateCommonProperty(const RefPtr<PipelineBase>& context, CommonProperty& output,
460        const RefPtr<PipelineBase>& mainContext);
461
462    void FindText(const RefPtr<NG::UINode>& node, std::list<Accessibility::AccessibilityElementInfo>& infos,
463        const RefPtr<NG::PipelineContext>& context,
464        const CommonProperty& commonProperty, const SearchParameter& searchParam);
465
466    void FindTextByTextHint(const RefPtr<NG::UINode>& node, std::list<Accessibility::AccessibilityElementInfo>& infos,
467        const RefPtr<NG::PipelineContext>& context,
468        const CommonProperty& commonProperty, const SearchParameter& searchParam);
469
470    void UpdateAccessibilityElementInfo(
471        const RefPtr<NG::FrameNode>& node, Accessibility::AccessibilityElementInfo& nodeInfo);
472
473    void UpdateAccessibilityVisible(
474        const RefPtr<NG::FrameNode>& node, AccessibilityElementInfo& nodeInfo);
475
476    void UpdateVirtualNodeInfo(std::list<Accessibility::AccessibilityElementInfo>& infos,
477        Accessibility::AccessibilityElementInfo& nodeInfo,
478        const RefPtr<NG::UINode>& uiVirtualNode, const CommonProperty& commonProperty,
479        const RefPtr<NG::PipelineContext>& ngPipeline);
480
481    void UpdateVirtualNodeChildAccessibilityElementInfo(
482        const RefPtr<NG::FrameNode>& node, const CommonProperty& commonProperty,
483        Accessibility::AccessibilityElementInfo& nodeParentInfo, Accessibility::AccessibilityElementInfo& nodeInfo,
484        const RefPtr<NG::PipelineContext>& ngPipeline);
485
486    void UpdateVirtualNodeAccessibilityElementInfo(
487        const RefPtr<NG::FrameNode>& parent, const RefPtr<NG::FrameNode>& node,
488        const CommonProperty& commonProperty, Accessibility::AccessibilityElementInfo& nodeInfo,
489        const RefPtr<NG::PipelineContext>& ngPipeline);
490
491    void UpdateAccessibilityElementInfo(
492        const RefPtr<NG::FrameNode>& node, const CommonProperty& commonProperty,
493        Accessibility::AccessibilityElementInfo& nodeInfo, const RefPtr<NG::PipelineContext>& ngPipeline);
494
495    void UpdateCacheInfoNG(std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<NG::FrameNode>& node,
496        const CommonProperty& commonProperty, const RefPtr<NG::PipelineContext>& ngPipeline,
497        const SearchParameter& searchParam);
498#ifdef WEB_SUPPORTED
499
500    void UpdateWebAccessibilityElementInfo(const std::shared_ptr<NWeb::NWebAccessibilityNodeInfo>& node,
501        Accessibility::AccessibilityElementInfo& nodeInfo, int32_t treeId);
502
503    void UpdateWebAccessibilityElementInfo(const std::shared_ptr<NWeb::NWebAccessibilityNodeInfo>& node,
504        const CommonProperty& commonProperty, Accessibility::AccessibilityElementInfo& nodeInfo,
505        const RefPtr<NG::WebPattern>& webPattern);
506
507    void UpdateWebCacheInfo(std::list<Accessibility::AccessibilityElementInfo>& infos, int64_t nodeId,
508        const CommonProperty& commonProperty, const RefPtr<NG::PipelineContext>& ngPipeline,
509        const SearchParameter& searchParam, const RefPtr<NG::WebPattern>& webPattern);
510#endif //WEB_SUPPORTED
511    void NotifyChildTreeOnRegister(int32_t treeId);
512
513    void NotifyChildTreeOnDeregister();
514
515    void SendUecOnTreeEvent(int64_t splitElementId);
516
517    void NotifySetChildTreeIdAndWinId(int64_t elementId, const int32_t treeId, const int32_t childWindowId);
518
519    bool CheckIsChildElement(
520        int64_t &elementId, const std::vector<std::string>& params, std::vector<std::string>& info);
521
522    bool NeedRegisterChildTree(uint32_t parentWindowId, int32_t parentTreeId, int64_t parentElementId);
523
524    void FillEventInfoWithNode(
525        const RefPtr<NG::FrameNode>& node,
526        Accessibility::AccessibilityEventInfo& eventInfo,
527        const RefPtr<NG::PipelineContext>& context,
528        int64_t elementId);
529
530    void NotifyAccessibilitySAStateChange(bool state);
531    void DumpTreeNodeInfoInJson(
532        const RefPtr<NG::FrameNode>& node, int32_t depth, const CommonProperty& commonProperty, int32_t childSize);
533    void CreateNodeInfoJson(const RefPtr<NG::FrameNode>& node, const CommonProperty& commonProperty,
534        std::unique_ptr<JsonValue>& json, int32_t childSize);
535
536    void SendEventToAccessibilityWithNodeInner(const AccessibilityEvent& accessibilityEvent,
537        const RefPtr<AceType>& node, const RefPtr<PipelineBase>& context);
538    void SendAccessibilityAsyncEventInner(const AccessibilityEvent& accessibilityEvent);
539    int64_t GetDelayTimeBeforeSendEvent(const AccessibilityEvent& accessibilityEvent, const RefPtr<AceType>& node);
540    void UpdateChildrenNodeInCache(std::list<AccessibilityElementInfo>& infos,
541        const CommonProperty& commonProperty, const RefPtr<NG::PipelineContext>& ngPipeline,
542        const SearchParameter& searchParam, std::list<RefPtr<NG::FrameNode>>& children);
543    std::string callbackKey_;
544    uint32_t windowId_ = 0;
545    std::shared_ptr<JsAccessibilityStateObserver> stateObserver_ = nullptr;
546    std::shared_ptr<ToastAccessibilityConfigObserver> toastObserver_ = nullptr;
547    float scaleX_ = 1.0f;
548    float scaleY_ = 1.0f;
549    int64_t currentFocusNodeId_ = -1;
550
551    int64_t lastElementId_ = -1;
552    WeakPtr<NG::FrameNode> lastFrameNode_;
553    NG::SizeF oldGeometrySize_;
554    mutable std::mutex childTreeCallbackMapMutex_;
555    std::unordered_map<int64_t, std::shared_ptr<AccessibilityChildTreeCallback>> childTreeCallbackMap_;
556    mutable std::mutex componentSACallbackMutex_;
557    std::unordered_map<int64_t, std::shared_ptr<AccessibilitySAObserverCallback>> componentSACallbackMap_;
558    int64_t parentElementId_ = INVALID_PARENT_ID;
559    uint32_t parentWindowId_ = 0;
560    int32_t parentTreeId_ = 0;
561    uint32_t parentWebWindowId_ = 0;
562    std::function<void(int32_t&, int32_t&)> getParentRectHandler_;
563    std::function<void(AccessibilityParentRectInfo&)> getParentRectHandlerNew_;
564    bool isUseJson_ = false;
565};
566
567} // namespace OHOS::Ace::Framework
568
569#endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_ACCESSIBILITY_JS_ACCESSIBILITY_MANAGER_H
570