• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 #include "bridge/declarative_frontend/jsview/js_accessibility.h"
16 
17 #include "bridge/declarative_frontend/engine/functions/js_accessibility_function.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h"
19 #include "bridge/declarative_frontend/jsview/js_view_abstract.h"
20 #include "bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h"
21 #include "core/components_ng/base/view_abstract_model_ng.h"
22 #include "frameworks/base/log/ace_scoring_log.h"
23 
24 namespace OHOS::Ace::Framework {
25 namespace {
26 const std::unordered_map<AccessibilityRoleType, std::string> accessibilityRoleMap {
27     { AccessibilityRoleType::ACTION_SHEET, "actionsheet" }, { AccessibilityRoleType::ALERT_DIALOG, "alertdialog" },
28     { AccessibilityRoleType::INDEXER_COMPONENT, "alphabetindexer" },
29     { AccessibilityRoleType::BADGE_COMPONENT, "badge" }, { AccessibilityRoleType::BLANK, "blank" },
30     { AccessibilityRoleType::BUTTON, "button" }, { AccessibilityRoleType::BACK_BUTTON, "backbutton" },
31     { AccessibilityRoleType::SHEET_DRAG_BAR, "sheetdragbar" },
32     { AccessibilityRoleType::CALENDAR_PICKER, "calendarpicker" }, { AccessibilityRoleType::CALENDAR, "calendar" },
33     { AccessibilityRoleType::CANVAS, "canvas" }, { AccessibilityRoleType::CANVAS_GRADIENT, "canvasgradient" },
34     { AccessibilityRoleType::CANVAS_PATTERN, "canvaspattern" }, { AccessibilityRoleType::CHECKBOX, "checkbox" },
35     { AccessibilityRoleType::CHECKBOX_GROUP, "checkboxgroup" }, { AccessibilityRoleType::CIRCLE, "circle" },
36     { AccessibilityRoleType::COLUMN_SPLIT, "columnsplit" }, { AccessibilityRoleType::COLUMN, "column" },
37     { AccessibilityRoleType::CANVAS_RENDERING_CONTEXT_2D, "canvasrenderingcontext2d" },
38     { AccessibilityRoleType::CHART, "chart" }, { AccessibilityRoleType::COUNTER, "counter" },
39     { AccessibilityRoleType::CONTAINER_MODAL, "containermodal" }, { AccessibilityRoleType::DATA_PANEL, "datapanel" },
40     { AccessibilityRoleType::DATE_PICKER, "datepicker" }, { AccessibilityRoleType::DIALOG, "dialog" },
41     { AccessibilityRoleType::DIVIDER, "divider" }, { AccessibilityRoleType::DRAG_BAR, "dragbar" },
42     { AccessibilityRoleType::EFFECT_COMPONENT, "effectcomponent" }, { AccessibilityRoleType::ELLIPSE, "ellipse" },
43     { AccessibilityRoleType::FLEX, "flex" }, { AccessibilityRoleType::FLOW_ITEM, "flowitem" },
44     { AccessibilityRoleType::FORM_COMPONENT, "formcomponent" }, { AccessibilityRoleType::FORM_LINK, "formlink" },
45     { AccessibilityRoleType::GAUGE, "gauge" }, { AccessibilityRoleType::GRID, "grid" },
46     { AccessibilityRoleType::GRID_COL, "gridcol" }, { AccessibilityRoleType::GRID_CONTAINER, "gridcontainer" },
47     { AccessibilityRoleType::GRID_ITEM, "griditem" }, { AccessibilityRoleType::GRID_ROW, "grid-row" },
48     { AccessibilityRoleType::HYPERLINK, "hyperlink" }, { AccessibilityRoleType::IMAGE, "image" },
49     { AccessibilityRoleType::IMAGE_ANIMATOR, "imageanimator" },
50     { AccessibilityRoleType::ROLE_IMAGE_BITMAP, "imagebitmap" }, { AccessibilityRoleType::IMAGE_DATA, "imagedata" },
51     { AccessibilityRoleType::IMAGE_SPAN, "imagespan" }, { AccessibilityRoleType::LABEL, "label" },
52     { AccessibilityRoleType::LINE, "line" }, { AccessibilityRoleType::LIST, "list" },
53     { AccessibilityRoleType::LIST_ITEM, "listitem" }, { AccessibilityRoleType::LIST_ITEM_GROUP, "listitemgroup" },
54     { AccessibilityRoleType::LOADING_PROGRESS, "loadingprogress" }, { AccessibilityRoleType::MARQUEE, "marquee" },
55     { AccessibilityRoleType::MATRIX2D, "matrix2d" }, { AccessibilityRoleType::MENU, "menu" },
56     { AccessibilityRoleType::MENU_ITEM, "menuitem" }, { AccessibilityRoleType::MENU_ITEM_GROUP, "menuitemgroup" },
57     { AccessibilityRoleType::NAV_DESTINATION, "navdestination" }, { AccessibilityRoleType::NAV_ROUTER, "navrouter" },
58     { AccessibilityRoleType::NAVIGATION, "navigation" }, { AccessibilityRoleType::NAVIGATION_BAR, "navigation-bar" },
59     { AccessibilityRoleType::NAVIGATION_MENU, "navigation-menu" }, { AccessibilityRoleType::NAVIGATOR, "navigator" },
60     { AccessibilityRoleType::OFFSCREEN_CANVAS, "offscreencanvas" },
61     { AccessibilityRoleType::OFFSCREEN_CANVAS_RENDERING_CONTEXT2D, "offscreencanvasrenderingcontext2d" },
62     { AccessibilityRoleType::OPTION, "option" }, { AccessibilityRoleType::PANEL, "panel" },
63     { AccessibilityRoleType::PAPER_PAGE, "paperpage" }, { AccessibilityRoleType::PATH, "path" },
64     { AccessibilityRoleType::PATH2D, "path2d" }, { AccessibilityRoleType::PATTERN_LOCK, "patternlock" },
65     { AccessibilityRoleType::PICKER, "picker" }, { AccessibilityRoleType::PICKER_VIEW, "picker-view" },
66     { AccessibilityRoleType::PLUGIN_COMPONENT, "plugincomponent" }, { AccessibilityRoleType::POLYGON, "polygon" },
67     { AccessibilityRoleType::POLYLINE, "polyline" }, { AccessibilityRoleType::POPUP, "popup" },
68     { AccessibilityRoleType::PROGRESS, "progress" }, { AccessibilityRoleType::QRCODE, "qrcode" },
69     { AccessibilityRoleType::RADIO, "radio" }, { AccessibilityRoleType::RATING, "rating" },
70     { AccessibilityRoleType::RECT, "rect" }, { AccessibilityRoleType::REFRESH, "refresh" },
71     { AccessibilityRoleType::RELATIVE_CONTAINER, "relativecontainer" },
72     { AccessibilityRoleType::REMOTE_WINDOW, "remotewindow" }, { AccessibilityRoleType::RICH_EDITOR, "richeditor" },
73     { AccessibilityRoleType::RICH_TEXT, "richtext" }, { AccessibilityRoleType::ROLE_PAGER, "rolepager" },
74     { AccessibilityRoleType::ROW, "row" }, { AccessibilityRoleType::ROW_SPLIT, "rowsplit" },
75     { AccessibilityRoleType::SCROLL, "scroll" }, { AccessibilityRoleType::SCROLL_BAR, "scrollbar" },
76     { AccessibilityRoleType::SEARCH, "search" }, { AccessibilityRoleType::SEARCH_FIELD, "searchfield" },
77     { AccessibilityRoleType::SELECT, "select" }, { AccessibilityRoleType::SHAPE, "shape" },
78     { AccessibilityRoleType::SIDEBAR_CONTAINER, "sidebarcontainer" }, { AccessibilityRoleType::SLIDER, "slider" },
79     { AccessibilityRoleType::SPAN, "span" }, { AccessibilityRoleType::STACK, "stack" },
80     { AccessibilityRoleType::STEPPER, "stepper" }, { AccessibilityRoleType::STEPPER_ITEM, "stepperitem" },
81     { AccessibilityRoleType::SWIPER, "swiper" }, { AccessibilityRoleType::SWIPER_INDICATOR, "swiperindicator" },
82     { AccessibilityRoleType::SWITCH, "switch" }, { AccessibilityRoleType::SYMBOL_GLYPH, "symbolglyph" },
83     { AccessibilityRoleType::TAB_CONTENT, "tabcontent" }, { AccessibilityRoleType::TAB_BAR, "tab-bar" },
84     { AccessibilityRoleType::TABS, "tabs" }, { AccessibilityRoleType::TEXT, "text" },
85     { AccessibilityRoleType::TEXT_CLOCK, "textclock" }, { AccessibilityRoleType::TEXT_ENTRY, "textentry" },
86     { AccessibilityRoleType::TEXT_INPUT, "textinput" }, { AccessibilityRoleType::TEXT_PICKER, "textpicker" },
87     { AccessibilityRoleType::TEXT_TIMER, "texttimer" }, { AccessibilityRoleType::TEXT_AREA, "textarea" },
88     { AccessibilityRoleType::TEXT_FIELD, "textfield" }, { AccessibilityRoleType::TIME_PICKER, "timepicker" },
89     { AccessibilityRoleType::TITLE_BAR, "titlebar" }, { AccessibilityRoleType::TOGGLER, "toggler" },
90     { AccessibilityRoleType::UI_EXTENSION_COMPONENT, "uiextensioncomponent" },
91     { AccessibilityRoleType::VIDEO, "video" }, { AccessibilityRoleType::WATER_FLOW, "waterflow" },
92     { AccessibilityRoleType::WEB, "web" }, { AccessibilityRoleType::XCOMPONENT, "xcomponent" },
93     { AccessibilityRoleType::ROLE_NONE, "NULL" }
94 };
95 
96 const std::vector<AccessibilitySamePageMode> PAGE_MODE_TYPE = { AccessibilitySamePageMode::SEMI_SILENT,
97     AccessibilitySamePageMode::FULL_SILENT };
98 }
99 
JsAccessibilityGroup(const JSCallbackInfo & info)100 void JSViewAbstract::JsAccessibilityGroup(const JSCallbackInfo& info)
101 {
102     bool isGroup = false;
103     if (info[0]->IsBoolean()) {
104         isGroup = info[0]->ToBoolean();
105     }
106     ViewAbstractModel::GetInstance()->SetAccessibilityGroup(isGroup);
107 
108     if (info.Length() > 1 && info[1]->IsObject()) {
109         auto obj = JSRef<JSObject>::Cast(info[1]);
110 
111         auto preferAccessibilityTextObj = obj->GetProperty("accessibilityPreferred");
112         auto preferAccessibilityText =
113             preferAccessibilityTextObj->IsBoolean() ? preferAccessibilityTextObj->ToBoolean() : false;
114         ViewAbstractModel::GetInstance()->SetAccessibilityTextPreferred(preferAccessibilityText);
115     }
116 }
117 
JsAccessibilityText(const JSCallbackInfo & info)118 void JSViewAbstract::JsAccessibilityText(const JSCallbackInfo& info)
119 {
120     const JSRef<JSVal>& jsValue = info[0];
121     std::string text;
122     if (!ParseJsString(jsValue, text)) {
123         return;
124     }
125     ViewAbstractModel::GetInstance()->SetAccessibilityText(text);
126 }
127 
JsAccessibilityTextHint(const std::string & text)128 void JSViewAbstract::JsAccessibilityTextHint(const std::string& text)
129 {
130     ViewAbstractModel::GetInstance()->SetAccessibilityTextHint(text);
131 }
132 
JsAccessibilityNextFocusId(const JSCallbackInfo & info)133 void JSViewAbstract::JsAccessibilityNextFocusId(const JSCallbackInfo& info)
134 {
135     const JSRef<JSVal>& jsValue = info[0];
136     std::string nextFocusId;
137     if (!ParseJsString(jsValue, nextFocusId)) {
138         return;
139     }
140     ViewAbstractModel::GetInstance()->SetAccessibilityNextFocusId(nextFocusId);
141 }
142 
JsAccessibilityDescription(const JSCallbackInfo & info)143 void JSViewAbstract::JsAccessibilityDescription(const JSCallbackInfo& info)
144 {
145     const JSRef<JSVal>& jsValue = info[0];
146     std::string description;
147     if (!ParseJsString(jsValue, description)) {
148         return;
149     }
150     std::pair<bool, std::string> autoEventPair(false, "");
151     std::pair<bool, std::string> descriptionPair(false, "");
152     ParseAccessibilityDescriptionJson(description, autoEventPair, descriptionPair);
153     if (descriptionPair.first) {
154         ViewAbstractModel::GetInstance()->SetAccessibilityDescription(descriptionPair.second);
155     } else {
156         ViewAbstractModel::GetInstance()->SetAccessibilityDescription(description);
157     }
158     if (autoEventPair.first) {
159         ViewAbstractModel::GetInstance()->SetAutoEventParam(autoEventPair.second);
160     }
161 }
162 
ParseAccessibilityDescriptionJson(const std::string & description,std::pair<bool,std::string> & autoEventPair,std::pair<bool,std::string> & descriptionPair)163 void JSViewAbstract::ParseAccessibilityDescriptionJson(const std::string& description,
164     std::pair<bool, std::string>& autoEventPair, std::pair<bool, std::string>& descriptionPair)
165 {
166     if (description.empty()) {
167         return;
168     }
169     if (!StartWith(description, "{") || !EndWith(description, "}")) {
170         return;
171     }
172     auto jsonObj = JsonUtil::ParseJsonString(description);
173     if (!jsonObj || !jsonObj->IsValid() || !jsonObj->IsObject()) {
174         return;
175     }
176     if (jsonObj->Contains("$autoEventParam")) {
177         auto param = jsonObj->GetValue("$autoEventParam");
178         if (param) {
179             autoEventPair = std::make_pair(true, param->ToString());
180         }
181     }
182     if (jsonObj->Contains("$accessibilityDescription")) {
183         descriptionPair = std::make_pair(true, jsonObj->GetString("$accessibilityDescription"));
184     } else if (jsonObj->Contains("$autoEventParam")) {
185         descriptionPair = std::make_pair(true, "");
186     }
187 }
188 
JsAccessibilityImportance(const std::string & importance)189 void JSViewAbstract::JsAccessibilityImportance(const std::string& importance)
190 {
191     ViewAbstractModel::GetInstance()->SetAccessibilityImportance(importance);
192 }
193 
JsAccessibilityLevel(const std::string & level)194 void JSViewAbstract::JsAccessibilityLevel(const std::string& level)
195 {
196     ViewAbstractModel::GetInstance()->SetAccessibilityImportance(level);
197 }
198 
JsAccessibilityVirtualNode(const JSCallbackInfo & info)199 void JSViewAbstract::JsAccessibilityVirtualNode(const JSCallbackInfo& info)
200 {
201     // parse builder
202     if (!info[0]->IsObject()) {
203         return;
204     }
205     JSRef<JSObject> obj = JSRef<JSObject>::Cast(info[0]);
206     auto builder = obj->GetProperty("builder");
207     if (builder->IsFunction()) {
208         auto builderFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(builder));
209         CHECK_NULL_VOID(builderFunc);
210         auto buildFunc = [execCtx = info.GetExecutionContext(), func = std::move(builderFunc)]() {
211             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
212             ACE_SCORING_EVENT("AccessibilityVirtualNode");
213             func->Execute();
214         };
215         NG::ViewAbstractModelNG::GetInstance()->SetAccessibilityVirtualNode(std::move(buildFunc));
216     }
217 }
218 
JsAccessibilitySelected(const JSCallbackInfo & info)219 void JSViewAbstract::JsAccessibilitySelected(const JSCallbackInfo& info)
220 {
221     bool selected = false;
222     bool resetValue = false;
223     JSRef<JSVal> arg = info[0];
224     if (arg->IsUndefined()) {
225         resetValue = true;
226     } else if (arg->IsBoolean()) {
227         selected = arg->ToBoolean();
228     } else {
229         return;
230     }
231 
232     ViewAbstractModel::GetInstance()->SetAccessibilitySelected(selected, resetValue);
233 }
234 
JsAccessibilityChecked(const JSCallbackInfo & info)235 void JSViewAbstract::JsAccessibilityChecked(const JSCallbackInfo& info)
236 {
237     bool checked = false;
238     bool resetValue = false;
239     JSRef<JSVal> arg = info[0];
240     if (arg->IsUndefined()) {
241         resetValue = true;
242     } else if (arg->IsBoolean()) {
243         checked = arg->ToBoolean();
244     } else {
245         return;
246     }
247 
248     ViewAbstractModel::GetInstance()->SetAccessibilityChecked(checked, resetValue);
249 }
250 
JsAccessibilityScrollTriggerable(const JSCallbackInfo & info)251 void JSViewAbstract::JsAccessibilityScrollTriggerable(const JSCallbackInfo& info)
252 {
253     bool scrollTriggerable = false;
254     bool resetValue = false;
255     JSRef<JSVal> arg = info[0];
256     if (arg->IsUndefined()) {
257         resetValue = true;
258     } else if (arg->IsBoolean()) {
259         scrollTriggerable = arg->ToBoolean();
260     } else {
261         return;
262     }
263 
264     ViewAbstractModel::GetInstance()->SetAccessibilityScrollTriggerable(scrollTriggerable, resetValue);
265 }
266 
JsAccessibilityRole(const JSCallbackInfo & info)267 void JSViewAbstract::JsAccessibilityRole(const JSCallbackInfo& info)
268 {
269     bool resetValue = false;
270     std::string role;
271     if (info.Length() < 1 || !info[0]->IsNumber()) {
272         ViewAbstractModel::GetInstance()->SetAccessibilityRole(role, true);
273         return;
274     }
275     auto index = info[0]->ToNumber<int32_t>();
276     AccessibilityRoleType text = static_cast<AccessibilityRoleType>(index);
277     auto it = accessibilityRoleMap.find(text);
278     if (it != accessibilityRoleMap.end()) {
279         role = it->second;
280     } else {
281         resetValue = true;
282     }
283     ViewAbstractModel::GetInstance()->SetAccessibilityRole(role, resetValue);
284 }
285 
JsOnAccessibilityFocus(const JSCallbackInfo & info)286 void JSViewAbstract::JsOnAccessibilityFocus(const JSCallbackInfo& info)
287 {
288     if (info[0]->IsUndefined() || !info[0]->IsFunction()) {
289         ViewAbstractModel::GetInstance()->ResetOnAccessibilityFocus();
290         return;
291     }
292     RefPtr<JsFunction> jsFoucusFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(info[0]));
293     WeakPtr<NG::FrameNode> frameNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
294     auto onAccessibilityFoucus = [execCtx = info.GetExecutionContext(), func = std::move(jsFoucusFunc),
295                                      node = frameNode](bool isFocus) {
296         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
297         ACE_SCORING_EVENT("onAccessibilityFoucus");
298         PipelineContext::SetCallBackNode(node);
299         JSRef<JSVal> newJSVal = JSRef<JSVal>::Make(ToJSValue(isFocus));
300         func->ExecuteJS(1, &newJSVal);
301     };
302     ViewAbstractModel::GetInstance()->SetOnAccessibilityFocus(std::move(onAccessibilityFoucus));
303 }
304 
JsAccessibilityDefaultFocus(const JSCallbackInfo & info)305 void JSViewAbstract::JsAccessibilityDefaultFocus(const JSCallbackInfo& info)
306 {
307     JSRef<JSVal> arg = info[0];
308     if (arg->IsBoolean()) {
309         auto isFocus = arg->ToBoolean();
310         ViewAbstractModel::GetInstance()->SetAccessibilityDefaultFocus(isFocus);
311         return;
312     }
313     ViewAbstractModel::GetInstance()->SetAccessibilityDefaultFocus(false);
314 }
315 
JsAccessibilityUseSamePage(const JSCallbackInfo & info)316 void JSViewAbstract::JsAccessibilityUseSamePage(const JSCallbackInfo& info)
317 {
318     JSRef<JSVal> arg = info[0];
319     if (arg->IsNumber()) {
320         auto pageModeType = arg->ToNumber<int32_t>();
321         if (pageModeType >= 0 && pageModeType < static_cast<int32_t>(PAGE_MODE_TYPE.size())) {
322             auto pageMode = static_cast<bool>(PAGE_MODE_TYPE[pageModeType]) ? "FULL_SILENT" : "SEMI_SILENT";
323             ViewAbstractModel::GetInstance()->SetAccessibilityUseSamePage(pageMode);
324             return;
325         }
326         ViewAbstractModel::GetInstance()->SetAccessibilityUseSamePage("");
327         return;
328     }
329     ViewAbstractModel::GetInstance()->SetAccessibilityUseSamePage("");
330 }
331 
GetRoleByType(AccessibilityRoleType roleType)332 std::string JSAccessibilityAbstract::GetRoleByType(AccessibilityRoleType roleType)
333 {
334     auto it = accessibilityRoleMap.find(roleType);
335     if (it != accessibilityRoleMap.end()) {
336         return it->second;
337     }
338     return "";
339 }
340 
JsAccessibilityFocusDrawLevel(const JSCallbackInfo & info)341 void JSViewAbstract::JsAccessibilityFocusDrawLevel(const JSCallbackInfo& info)
342 {
343     int32_t drawLevel = 0;
344     JSRef<JSVal> arg = info[0];
345     do {
346         if (!arg->IsNumber()) {
347             break;
348         }
349         if (arg->ToNumber<int32_t>() > 1) {
350             break;
351         }
352         drawLevel = arg->ToNumber<int32_t>();
353     } while (false);
354     ViewAbstractModel::GetInstance()->SetAccessibilityFocusDrawLevel(drawLevel);
355 }
356 
JsOnAccessibilityActionIntercept(const JSCallbackInfo & info)357 void JSViewAbstract::JsOnAccessibilityActionIntercept(const JSCallbackInfo& info)
358 {
359     if (info[0]->IsUndefined() || !info[0]->IsFunction()) {
360         ViewAbstractModel::GetInstance()->SetOnAccessibilityActionIntercept(nullptr);
361         return;
362     }
363     auto jsInterceptFunc = AceType::MakeRefPtr<JsAccessibilityActionInterceptFunction>(JSRef<JSFunc>::Cast(info[0]));
364     WeakPtr<NG::FrameNode> frameNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
365     auto onAccessibilityActionIntercept = [execCtx = info.GetExecutionContext(), func = std::move(jsInterceptFunc),
366         node = frameNode](AccessibilityInterfaceAction action) -> AccessibilityActionInterceptResult {
367         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx, AccessibilityActionInterceptResult::ACTION_CONTINUE);
368         ACE_SCORING_EVENT("onAccessibilityActionIntercept");
369         PipelineContext::SetCallBackNode(node);
370         return func->Execute(action);
371     };
372     ViewAbstractModel::GetInstance()->SetOnAccessibilityActionIntercept(std::move(onAccessibilityActionIntercept));
373 }
374 
JsOnAccessibilityHoverTransparent(const JSCallbackInfo & args)375 void JSViewAbstract::JsOnAccessibilityHoverTransparent(const JSCallbackInfo& args)
376 {
377     if (args[0]->IsUndefined() || !args[0]->IsFunction()) {
378         ViewAbstractModel::GetInstance()->SetOnAccessibilityHoverTransparent(nullptr);
379         return;
380     }
381     auto jsOnHoverTransparentFunc =
382         AceType::MakeRefPtr<JsAccessibilityHoverTransparentFunction>(JSRef<JSFunc>::Cast(args[0]));
383     WeakPtr<NG::FrameNode> frameNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
384     auto onHoverTransparentFunc = [execCtx = args.GetExecutionContext(),
385         func = jsOnHoverTransparentFunc, node = frameNode](
386         TouchEventInfo& info) {
387         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
388         ACE_SCORING_EVENT("onHoverTransparent");
389         PipelineContext::SetCallBackNode(node);
390         func->Execute(info);
391     };
392     ViewAbstractModel::GetInstance()->SetOnAccessibilityHoverTransparent(std::move(onHoverTransparentFunc));
393 }
394 }