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 }