1  /*
2   * Copyright (c) 2022-2024 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_COMPONENTS_NG_PROPERTIES_ACCESSIBILITY_PROPERTY_H
17  #define FOUNDATION_ACE_FRAMEWORKS_COMPONENTS_NG_PROPERTIES_ACCESSIBILITY_PROPERTY_H
18  
19  #include <cstdint>
20  #include <string>
21  #include <unordered_set>
22  
23  #include "base/memory/ace_type.h"
24  #include "interfaces/native/native_type.h"
25  #include "core/accessibility/accessibility_utils.h"
26  #include "core/components_ng/base/inspector_filter.h"
27  #include "core/components_ng/base/ui_node.h"
28  
29  namespace OHOS::Accessibility {
30  class ExtraElementInfo;
31  }
32  
33  namespace OHOS::Ace::NG {
34  using ActionNoParam = std::function<void()>;
35  using ActionSetTextImpl = std::function<void(const std::string&)>;
36  using ActionScrollForwardImpl = ActionNoParam;
37  using ActionScrollForwardWithParamImpl = std::function<void(AccessibilityScrollType scrollType)>;;
38  using ActionScrollBackwardImpl = ActionNoParam;
39  using ActionScrollBackwardWithParamImpl = std::function<void(AccessibilityScrollType scrollType)>;;
40  using ActionSetSelectionImpl = std::function<void(int32_t start, int32_t end, bool isForward)>;
41  using ActionCopyImpl = ActionNoParam;
42  using ActionCutImpl = ActionNoParam;
43  using ActionPasteImpl = ActionNoParam;
44  using ActionSelectImpl = ActionNoParam;
45  using ActionClearSelectionImpl = ActionNoParam;
46  using ActionMoveTextImpl = std::function<void(int32_t moveUnit, bool forward)>;
47  using ActionSetCursorIndexImpl = std::function<void(int32_t index)>;
48  using ActionExecSubComponentImpl = std::function<bool(int32_t spanId)>;
49  using ActionGetCursorIndexImpl = std::function<int32_t(void)>;
50  using ActionClickImpl = ActionNoParam;
51  using ActionLongClickImpl = ActionNoParam;
52  using ActionsImpl = std::function<void((uint32_t actionType))>;
53  using GetRelatedElementInfoImpl = std::function<void(Accessibility::ExtraElementInfo& extraElementInfo)>;
54  using OnAccessibilityFocusCallbackImpl = std::function<void((bool isFocus))>;
55  
56  class FrameNode;
57  using AccessibilityHoverTestPath = std::vector<RefPtr<FrameNode>>;
58  
59  class ACE_FORCE_EXPORT AccessibilityProperty : public virtual AceType {
60      DECLARE_ACE_TYPE(AccessibilityProperty, AceType);
61  
62  public:
63      AccessibilityProperty() = default;
64  
65      ~AccessibilityProperty() override = default;
66  
67      virtual std::string GetText() const;
68  
69      virtual std::string GetGroupText(bool forceGetChildren = false) const;
70  
71      virtual std::string GetGroupPreferAccessibilityText(bool forceGetChildren = false) const;
72  
SetText(const std::string & text)73      virtual void SetText(const std::string& text)
74      {
75          propText_ = text;
76      }
77  
IsCheckable()78      virtual bool IsCheckable() const
79      {
80          return false;
81      }
82  
IsChecked()83      virtual bool IsChecked() const
84      {
85          return false;
86      }
87  
IsSelected()88      virtual bool IsSelected() const
89      {
90          return false;
91      }
92  
IsPassword()93      virtual bool IsPassword() const
94      {
95          return false;
96      }
97  
IsEditable()98      virtual bool IsEditable() const
99      {
100          return false;
101      }
102  
IsMultiLine()103      virtual bool IsMultiLine() const
104      {
105          return false;
106      }
107  
IsDeletable()108      virtual bool IsDeletable() const
109      {
110          return false;
111      }
112  
IsHint()113      virtual bool IsHint() const
114      {
115          return false;
116      }
117  
IsScrollable()118      virtual bool IsScrollable() const
119      {
120          return false;
121      }
122  
GetCurrentIndex()123      virtual int32_t GetCurrentIndex() const
124      {
125          return -1;
126      }
127  
GetBeginIndex()128      virtual int32_t GetBeginIndex() const
129      {
130          return -1;
131      }
132  
GetEndIndex()133      virtual int32_t GetEndIndex() const
134      {
135          return -1;
136      }
137  
ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)138      virtual void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const
139      {
140          json->PutFixedAttr("scrollable", IsScrollable(), filter, FIXED_ATTR_SCROLLABLE);
141          json->PutExtAttr("accessibilityLevel", GetAccessibilityLevel().c_str(), filter);
142          json->PutExtAttr("accessibilityGroup", IsAccessibilityGroup(), filter);
143          json->PutExtAttr("accessibilityVirtualNode", HasAccessibilityVirtualNode(), filter);
144          json->PutExtAttr("accessibilityText", GetAccessibilityText().c_str(), filter);
145          json->PutExtAttr("accessibilityTextHint", GetTextType().c_str(), filter);
146          json->PutExtAttr("accessibilityDescription", GetAccessibilityDescription().c_str(), filter);
147      }
148  
FromJson(const std::unique_ptr<JsonValue> & json)149      virtual void FromJson(const std::unique_ptr<JsonValue>& json) {}
150  
HasRange()151      virtual bool HasRange() const
152      {
153          return false;
154      }
155  
HasSubComponent()156      virtual bool HasSubComponent() const
157      {
158          return false;
159      }
160  
GetSubComponentInfo(std::vector<SubComponentInfo> & subComponentInfos)161      virtual void GetSubComponentInfo(std::vector<SubComponentInfo>& subComponentInfos) const {}
162  
GetAccessibilityValue()163      virtual AccessibilityValue GetAccessibilityValue() const
164      {
165          return AccessibilityValue();
166      }
167  
SetHost(const WeakPtr<FrameNode> & host)168      void SetHost(const WeakPtr<FrameNode>& host)
169      {
170          host_ = host;
171      }
172  
GetHintText()173      virtual std::string GetHintText() const
174      {
175          return "";
176      }
177  
GetTextLengthLimit()178      virtual int32_t GetTextLengthLimit() const
179      {
180          return -1;
181      }
182  
GetCollectionInfo()183      virtual AceCollectionInfo GetCollectionInfo() const
184      {
185          return AceCollectionInfo();
186      }
187  
GetCollectionItemInfo()188      virtual AceCollectionItemInfo GetCollectionItemInfo() const
189      {
190          return AceCollectionItemInfo();
191      }
192  
GetErrorText()193      virtual std::string GetErrorText() const
194      {
195          return "";
196      }
197  
GetTextSelectionStart()198      virtual int32_t GetTextSelectionStart() const
199      {
200          return 0;
201      }
202  
GetTextSelectionEnd()203      virtual int32_t GetTextSelectionEnd() const
204      {
205          return 0;
206      }
207  
GetTextInputType()208      virtual AceTextCategory GetTextInputType() const
209      {
210          return AceTextCategory::INPUT_TYPE_DEFAULT;
211      }
212  
GetCollectionItemCounts()213      virtual int32_t GetCollectionItemCounts() const
214      {
215          return 0;
216      }
217  
GetContentInvalid()218      virtual bool GetContentInvalid() const
219      {
220          return true;
221      }
222  
223      virtual float GetScrollOffSet() const;
224  
AddSupportAction(AceAction action)225      void AddSupportAction(AceAction action)
226      {
227          supportActions_ |= (1UL << static_cast<uint32_t>(action));
228      }
229  
230      std::unordered_set<AceAction> GetSupportAction() const;
231  
ResetSupportAction()232      void ResetSupportAction()
233      {
234          supportActions_ = 0;
235          SetSpecificSupportAction();
236      };
237  
SetActionSetText(const ActionSetTextImpl & actionSetTextImpl)238      void SetActionSetText(const ActionSetTextImpl& actionSetTextImpl)
239      {
240          actionSetTextImpl_ = actionSetTextImpl;
241      }
242  
ActActionSetText(const std::string & text)243      bool ActActionSetText(const std::string& text)
244      {
245          if (actionSetTextImpl_) {
246              actionSetTextImpl_(text);
247              return true;
248          }
249          return false;
250      }
251  
SetActionSetSelection(const ActionSetSelectionImpl & actionSetSelection)252      void SetActionSetSelection(const ActionSetSelectionImpl& actionSetSelection)
253      {
254          actionSetSelectionImpl_ = actionSetSelection;
255      }
256  
257      bool ActActionSetSelection(int32_t start, int32_t end, bool isForward = false)
258      {
259          if (actionSetSelectionImpl_) {
260              actionSetSelectionImpl_(start, end, isForward);
261              return true;
262          }
263          return false;
264      }
265  
SetActionSetIndex(const ActionSetCursorIndexImpl & actionSetCursorIndexImpl)266      void SetActionSetIndex(const ActionSetCursorIndexImpl& actionSetCursorIndexImpl)
267      {
268          actionSetCursorIndexImpl_ = actionSetCursorIndexImpl;
269      }
270  
ActActionSetIndex(int32_t index)271      bool ActActionSetIndex(int32_t index)
272      {
273          if (actionSetCursorIndexImpl_) {
274              actionSetCursorIndexImpl_(index);
275              return true;
276          }
277          return false;
278      }
279  
SetActionExecSubComponent(const ActionExecSubComponentImpl & actionExecSubComponentImpl)280      void SetActionExecSubComponent(const ActionExecSubComponentImpl& actionExecSubComponentImpl)
281      {
282          actionExecSubComponentImpl_ = actionExecSubComponentImpl;
283      }
284  
ActActionExecSubComponent(int32_t spanId)285      bool ActActionExecSubComponent(int32_t spanId)
286      {
287          if (actionExecSubComponentImpl_) {
288              return actionExecSubComponentImpl_(spanId);
289          }
290          return false;
291      }
292  
SetActionGetIndex(const ActionGetCursorIndexImpl & actionGetCursorIndexImpl)293      void SetActionGetIndex(const ActionGetCursorIndexImpl& actionGetCursorIndexImpl)
294      {
295          actionGetCursorIndexImpl_ = actionGetCursorIndexImpl;
296      }
297  
ActActionGetIndex()298      int32_t ActActionGetIndex()
299      {
300          if (actionGetCursorIndexImpl_) {
301              return actionGetCursorIndexImpl_();
302          }
303          return -1;
304      }
305  
SetActionMoveText(const ActionMoveTextImpl & actionMoveText)306      void SetActionMoveText(const ActionMoveTextImpl& actionMoveText)
307      {
308          actionMoveTextImpl_ = actionMoveText;
309      }
310  
ActActionMoveText(int32_t moveUnit,bool forward)311      bool ActActionMoveText(int32_t moveUnit, bool forward)
312      {
313          if (actionMoveTextImpl_) {
314              actionMoveTextImpl_(moveUnit, forward);
315              return true;
316          }
317          return false;
318      }
319  
SetActionScrollForward(const ActionScrollForwardImpl & actionScrollForwardImpl)320      void SetActionScrollForward(const ActionScrollForwardImpl& actionScrollForwardImpl)
321      {
322          actionScrollForwardImpl_ = actionScrollForwardImpl;
323      }
324  
SetActionScrollForward(const ActionScrollForwardWithParamImpl & actionScrollForwardImpl)325      void SetActionScrollForward(const ActionScrollForwardWithParamImpl& actionScrollForwardImpl)
326      {
327          actionScrollForwardWithParamImpl_ = actionScrollForwardImpl;
328      }
329  
330      bool ActActionScrollForward(AccessibilityScrollType scrollType = AccessibilityScrollType::SCROLL_DEFAULT)
331      {
332          if (actionScrollForwardWithParamImpl_ == nullptr) {
333              scrollType = AccessibilityScrollType::SCROLL_DEFAULT;
334          }
335  
336          if ((scrollType == AccessibilityScrollType::SCROLL_DEFAULT) && (actionScrollForwardImpl_)) {
337              actionScrollForwardImpl_();
338              return true;
339          }
340  
341          if (actionScrollForwardWithParamImpl_) {
342              actionScrollForwardWithParamImpl_(scrollType);
343              return true;
344          }
345          return false;
346      }
347  
SetActionScrollBackward(const ActionScrollBackwardImpl & actionScrollBackwardImpl)348      void SetActionScrollBackward(const ActionScrollBackwardImpl& actionScrollBackwardImpl)
349      {
350          actionScrollBackwardImpl_ = actionScrollBackwardImpl;
351      }
352  
SetActionScrollBackward(const ActionScrollBackwardWithParamImpl & actionScrollBackwardImpl)353      void SetActionScrollBackward(const ActionScrollBackwardWithParamImpl& actionScrollBackwardImpl)
354      {
355          actionScrollBackwardWithParamImpl_ = actionScrollBackwardImpl;
356      }
357  
358      bool ActActionScrollBackward(AccessibilityScrollType scrollType = AccessibilityScrollType::SCROLL_DEFAULT)
359      {
360          if (actionScrollBackwardWithParamImpl_ == nullptr) {
361              scrollType = AccessibilityScrollType::SCROLL_DEFAULT;
362          }
363  
364          if ((scrollType == AccessibilityScrollType::SCROLL_DEFAULT) && (actionScrollBackwardImpl_)) {
365              actionScrollBackwardImpl_();
366              return true;
367          }
368  
369          if (actionScrollBackwardWithParamImpl_) {
370              actionScrollBackwardWithParamImpl_(scrollType);
371              return true;
372          }
373          return false;
374      }
375  
SetActionCopy(const ActionCopyImpl & actionCopyImpl)376      void SetActionCopy(const ActionCopyImpl& actionCopyImpl)
377      {
378          actionCopyImpl_ = actionCopyImpl;
379      }
380  
ActActionCopy()381      bool ActActionCopy()
382      {
383          if (ActionsDefined(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_COPY))) {
384              actionsImpl_(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_COPY));
385              return true;
386          }
387          if (actionCopyImpl_) {
388              actionCopyImpl_();
389              return true;
390          }
391          return false;
392      }
393  
SetActionCut(const ActionCutImpl & actionCutImpl)394      void SetActionCut(const ActionCutImpl& actionCutImpl)
395      {
396          actionCutImpl_ = actionCutImpl;
397      }
398  
ActActionCut()399      bool ActActionCut()
400      {
401          if (ActionsDefined(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_CUT))) {
402              actionsImpl_(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_CUT));
403              return true;
404          }
405          if (actionCutImpl_) {
406              actionCutImpl_();
407              return true;
408          }
409          return false;
410      }
411  
SetActionPaste(const ActionPasteImpl & actionPasteImpl)412      void SetActionPaste(const ActionPasteImpl& actionPasteImpl)
413      {
414          actionPasteImpl_ = actionPasteImpl;
415      }
416  
ActActionPaste()417      bool ActActionPaste()
418      {
419          if (ActionsDefined(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_PASTE))) {
420              actionsImpl_(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_PASTE));
421              return true;
422          }
423          if (actionPasteImpl_) {
424              actionPasteImpl_();
425              return true;
426          }
427          return false;
428      }
429  
SetActionLongClick(const ActionLongClickImpl & actionLongClickImpl)430      void SetActionLongClick(const ActionLongClickImpl& actionLongClickImpl)
431      {
432          actionLongClickImpl_ = actionLongClickImpl;
433      }
434  
ActActionLongClick()435      bool ActActionLongClick()
436      {
437          if (ActionsDefined(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_LONG_CLICK))) {
438              actionsImpl_(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_LONG_CLICK));
439              return true;
440          }
441          if (actionLongClickImpl_) {
442              actionLongClickImpl_();
443              return true;
444          }
445          return false;
446      }
447  
SetActionClick(const ActionClickImpl & actionClickImpl)448      void SetActionClick(const ActionClickImpl& actionClickImpl)
449      {
450          actionClickImpl_ = actionClickImpl;
451      }
452  
ActActionClick()453      bool ActActionClick()
454      {
455          if (ActionsDefined(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_CLICK))) {
456              actionsImpl_(static_cast<uint32_t>(ARKUI_ACCESSIBILITY_ACTION_CLICK));
457              return true;
458          }
459          if (actionClickImpl_) {
460              actionClickImpl_();
461              return true;
462          }
463          return false;
464      }
465  
SetActionSelect(const ActionSelectImpl & actionSelectImpl)466      void SetActionSelect(const ActionSelectImpl& actionSelectImpl)
467      {
468          actionSelectImpl_ = actionSelectImpl;
469      }
470  
ActActionSelect()471      bool ActActionSelect()
472      {
473          if (actionSelectImpl_) {
474              actionSelectImpl_();
475              return true;
476          }
477          return false;
478      }
479  
SetActionClearSelection(const ActionClearSelectionImpl & actionClearSelectionImpl)480      void SetActionClearSelection(const ActionClearSelectionImpl& actionClearSelectionImpl)
481      {
482          actionClearSelectionImpl_ = actionClearSelectionImpl;
483      }
484  
ActActionClearSelection()485      bool ActActionClearSelection()
486      {
487          if (actionClearSelectionImpl_) {
488              actionClearSelectionImpl_();
489              return true;
490          }
491          return false;
492      }
493  
SetOnAccessibilityFocusCallback(const OnAccessibilityFocusCallbackImpl & onAccessibilityFocusCallbackImpl)494      void SetOnAccessibilityFocusCallback(const OnAccessibilityFocusCallbackImpl& onAccessibilityFocusCallbackImpl)
495      {
496          onAccessibilityFocusCallbackImpl_ = onAccessibilityFocusCallbackImpl;
497      }
498  
OnAccessibilityFocusCallback(bool isFocus)499      void OnAccessibilityFocusCallback(bool isFocus)
500      {
501          if (onAccessibilityFocusCallbackImpl_) {
502              onAccessibilityFocusCallbackImpl_(isFocus);
503          }
504      }
505  
GetAccessibilityFocusState()506      bool GetAccessibilityFocusState() const
507      {
508          return isAccessibilityFocused_;
509      }
510  
SetAccessibilityFocusState(bool state)511      void SetAccessibilityFocusState(bool state)
512      {
513          isAccessibilityFocused_ = state;
514      }
515  
516      void SetAccessibilityGroup(bool accessibilityGroup);
517  
SetChildTreeId(int32_t childTreeId)518      void SetChildTreeId(int32_t childTreeId)
519      {
520          childTreeId_ = childTreeId;
521      }
522  
523      void SetAccessibilityTextPreferred(bool accessibilityTextPreferred);
524  
SetChildWindowId(int32_t childWindowId)525      void SetChildWindowId(int32_t childWindowId)
526      {
527          childWindowId_ = childWindowId;
528      }
529  
530      void SetAccessibilityText(const std::string& text);
531  
532      void SetAccessibilityTextWithEvent(const std::string& text);
533  
SetAccessibilityTextHint(const std::string & text)534      void SetAccessibilityTextHint(const std::string& text)
535      {
536          textTypeHint_ = text;
537      }
538  
539      void SetAccessibilityDescription(const std::string& accessibilityDescription);
540  
541      void SetAccessibilityDescriptionWithEvent(const std::string& accessibilityDescription);
542  
IsAccessibilityGroup()543      bool IsAccessibilityGroup() const
544      {
545          return accessibilityGroup_;
546      }
547  
GetChildTreeId()548      int32_t GetChildTreeId() const
549      {
550          return childTreeId_;
551      }
552  
553      bool IsAccessibilityTextPreferred() const;
554  
GetChildWindowId()555      int32_t GetChildWindowId() const
556      {
557          return childWindowId_;
558      }
559  
560      void NotifyComponentChangeEvent(AccessibilityEventType eventType);
561  
SaveAccessibilityVirtualNode(const RefPtr<UINode> & node)562      void SaveAccessibilityVirtualNode(const RefPtr<UINode>& node)
563      {
564          accessibilityVirtualNode_ = node;
565      }
566  
GetAccessibilityVirtualNode()567      RefPtr<UINode> GetAccessibilityVirtualNode()
568      {
569          return accessibilityVirtualNode_;
570      }
571  
GetAccessibilityVirtualNodePtr()572      NG::UINode* GetAccessibilityVirtualNodePtr()
573      {
574          return Referenced::RawPtr(accessibilityVirtualNode_);
575      }
576  
HasAccessibilityVirtualNode()577      bool HasAccessibilityVirtualNode() const
578      {
579          return accessibilityVirtualNode_ != nullptr;
580      }
581  
GetAccessibilityText()582      virtual std::string GetAccessibilityText() const
583      {
584          return accessibilityText_.value_or("");
585      }
586  
GetAccessibilityDescription()587      std::string GetAccessibilityDescription() const
588      {
589          return accessibilityDescription_.value_or("");
590      }
591  
GetTextType()592      std::string GetTextType() const
593      {
594          return textTypeHint_.value_or("");
595      }
596  
597      class Level {
598      public:
599          inline static const std::string AUTO = "auto";
600          inline static const std::string YES_STR = "yes";
601          inline static const std::string NO_STR = "no";
602          inline static const std::string NO_HIDE_DESCENDANTS = "no-hide-descendants";
603      };
604  
GetAccessibilityLevel()605      virtual std::string GetAccessibilityLevel() const
606      {
607          if (!accessibilityLevel_.has_value()) {
608              return Level::AUTO;
609          }
610          return accessibilityLevel_.value();
611      }
612  
613      void SetAccessibilityLevel(const std::string& accessibilityLevel);
614  
615      struct HoverTestDebugTraceInfo {
616          std::vector<std::unique_ptr<JsonValue>> trace;
617      };
618  
619      /*
620      * Get path from root to node which hit the hoverPoint.
621      * return: path contains nodes whose border cover the hoverPoint.
622      */
623      static AccessibilityHoverTestPath HoverTest(
624          const PointF& point,
625          const RefPtr<FrameNode>& root,
626          std::unique_ptr<HoverTestDebugTraceInfo>& debugInfo
627      );
628  
629      /*
630      * Judge whether a node can be accessibility focused.
631      * return: if node is accessibility focusable, return true.
632      * param: {node} should be not-null
633      */
634      static bool IsAccessibilityFocusable(const RefPtr<FrameNode>& node);
635  
636      /*
637      * param: {node}, {info} should be not-null
638      */
639      static bool IsAccessibilityFocusableDebug(const RefPtr<FrameNode>& node, std::unique_ptr<JsonValue>& info);
640  
641      /*
642      * Judge whether a node's tag is default accessibility focusable.
643      * return: if a node's tag is default accessibility focusable, return true.
644      * param: {tag} should be not-null
645      */
646      static bool IsAccessibilityFocusableTag(const std::string &tag);
647  
648      static bool IsTagInCrossProcessComponent(const std::string& tag);
649  
650      static bool IsTagInModalDialog(const RefPtr<FrameNode>& node);
651  
652      static bool HitAccessibilityHoverPriority(const RefPtr<FrameNode>& node);
653  
GetExtraElementInfo(Accessibility::ExtraElementInfo & extraElementInfo)654      virtual void GetExtraElementInfo(Accessibility::ExtraElementInfo& extraElementInfo) {}
655  
SetRelatedElementInfoCallback(const GetRelatedElementInfoImpl & getRelatedElementInfoImpl)656      void SetRelatedElementInfoCallback(const GetRelatedElementInfoImpl& getRelatedElementInfoImpl)
657      {
658          getRelatedElementInfoImpl_ = getRelatedElementInfoImpl;
659      }
660  
GetAllExtraElementInfo(Accessibility::ExtraElementInfo & extraElementInfo)661      void GetAllExtraElementInfo(Accessibility::ExtraElementInfo& extraElementInfo)
662      {
663          if (getRelatedElementInfoImpl_) {
664              getRelatedElementInfoImpl_(extraElementInfo);
665          }
666          GetExtraElementInfo(extraElementInfo);
667      }
668  
669      void SetAccessibilityActions(uint32_t actions);
670      void ResetAccessibilityActions();
671      bool HasAccessibilityActions();
672      uint32_t GetAccessibilityActions() const;
673  
674      void SetAccessibilityRole(const std::string& role);
675      void ResetAccessibilityRole();
676      bool HasAccessibilityRole();
677      std::string GetAccessibilityRole() const;
678  
679      void SetActions(const ActionsImpl& actionsImpl);
680      bool ActionsDefined(uint32_t action);
681  
682      void SetUserDisabled(const bool& isDisabled);
683      bool HasUserDisabled();
684      bool IsUserDisabled();
685  
686      void SetUserSelected(const bool& isSelected);
687      bool HasUserSelected();
688      bool IsUserSelected();
689      void ResetUserSelected();
690  
691      void SetUserCheckedType(const int32_t& checkedType);
692      bool HasUserCheckedType();
693      int32_t GetUserCheckedType();
694      void ResetUserCheckedType();
695  
696      void SetUserMinValue(const int32_t& minValue);
697      bool HasUserMinValue();
698      int32_t GetUserMinValue();
699  
700      void SetUserMaxValue(const int32_t& maxValue);
701      bool HasUserMaxValue();
702      int32_t GetUserMaxValue();
703  
704      void SetUserCurrentValue(const int32_t& currentValue);
705      bool HasUserCurrentValue();
706      int32_t GetUserCurrentValue();
707  
708      void SetUserTextValue(const std::string& textValue);
709      bool HasUserTextValue();
710      std::string GetUserTextValue();
711  
712      void SetUserCheckable(const bool& checkable);
713      bool HasUserCheckable();
714      bool IsUserCheckable();
715      void ResetUserCheckable();
716  
717      virtual bool IsAccessibilityHoverPriority() const;
718      void SetAccessibilityHoverPriority(bool hoverPriority);
719  
720  private:
721      // node should be not-null
722      static bool HoverTestRecursive(
723          const PointF& parentPoint,
724          const RefPtr<FrameNode>& node,
725          AccessibilityHoverTestPath& path,
726          std::unique_ptr<HoverTestDebugTraceInfo>& debugInfo,
727          bool& ancestorGroupFlag
728      );
729  
730      struct RecursiveParam {
731          bool hitTarget;
732          bool ancestorGroupFlag;
733      };
734  
735      static bool ProcessHoverTestRecursive(const PointF& noOffsetPoint, const RefPtr<FrameNode>& node,
736          AccessibilityHoverTestPath& path, std::unique_ptr<HoverTestDebugTraceInfo>& debugInfo,
737          RecursiveParam recursiveParam);
738  
739      static std::unique_ptr<JsonValue> CreateNodeSearchInfo(const RefPtr<FrameNode>& node, const PointF& parentPoint,
740          bool& ancestorGroupFlag);
741  
742      /*
743      * Get whether node and its children should be searched.
744      * return: first: node itself should be searched.
745      *         second: children of node should be searched.
746      * param: {node} should be not-null
747      */
748      static std::tuple<bool, bool, bool> GetSearchStrategy(const RefPtr<FrameNode>& node, bool& ancestorGroupFlag);
749  
750      void GetGroupTextRecursive(bool forceGetChildren, std::string& text, bool preferAccessibilityText) const;
751  
752      bool HasAccessibilityTextOrDescription() const;
753  
754      bool HasAction() const;
755  
756  protected:
SetSpecificSupportAction()757      virtual void SetSpecificSupportAction() {}
758      std::optional<std::string> propText_;
759      WeakPtr<FrameNode> host_;
760      uint64_t supportActions_ = 0;
761      ActionSetTextImpl actionSetTextImpl_;
762      ActionSetSelectionImpl actionSetSelectionImpl_;
763      ActionMoveTextImpl actionMoveTextImpl_;
764      ActionScrollForwardImpl actionScrollForwardImpl_;
765      ActionScrollForwardWithParamImpl actionScrollForwardWithParamImpl_;
766      ActionScrollBackwardImpl actionScrollBackwardImpl_;
767      ActionScrollBackwardWithParamImpl actionScrollBackwardWithParamImpl_;
768      ActionCopyImpl actionCopyImpl_;
769      ActionCutImpl actionCutImpl_;
770      ActionPasteImpl actionPasteImpl_;
771      ActionSelectImpl actionSelectImpl_;
772      ActionClearSelectionImpl actionClearSelectionImpl_;
773      ActionSetCursorIndexImpl actionSetCursorIndexImpl_;
774      ActionExecSubComponentImpl actionExecSubComponentImpl_;
775      ActionGetCursorIndexImpl actionGetCursorIndexImpl_;
776      ActionClickImpl actionClickImpl_;
777      ActionLongClickImpl actionLongClickImpl_;
778      ActionsImpl actionsImpl_;
779      GetRelatedElementInfoImpl getRelatedElementInfoImpl_;
780      OnAccessibilityFocusCallbackImpl onAccessibilityFocusCallbackImpl_;
781      bool isAccessibilityFocused_ = false;
782      bool accessibilityGroup_ = false;
783      bool accessibilityHoverPriority_ = false;
784      bool accessibilityTextPreferred_ = false;
785      int32_t childTreeId_ = -1;
786      int32_t childWindowId_ = 0;
787      RefPtr<UINode> accessibilityVirtualNode_;
788      std::optional<std::string> accessibilityText_;
789      std::optional<std::string> accessibilityDescription_;
790      std::optional<std::string> accessibilityLevel_;
791      std::optional<std::string> textTypeHint_;
792      std::optional<uint32_t> accessibilityActions_;
793      std::optional<std::string> accessibilityRole_;
794      ACE_DISALLOW_COPY_AND_MOVE(AccessibilityProperty);
795  
796      std::optional<bool> isDisabled_;
797      std::optional<bool> isSelected_;
798      std::optional<int32_t> checkedType_;
799      std::optional<bool> isUserCheckable_;
800  
801      std::optional<int32_t> minValue_;
802      std::optional<int32_t> maxValue_;
803      std::optional<int32_t> currentValue_;
804      std::optional<std::string> textValue_;
805  };
806  } // namespace OHOS::Ace::NG
807  
808  #endif
809