• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 #include <cstdio>
17 #include <cstring>
18 #include <pthread.h>
19 #include <unistd.h>
20 
21 #include "hilog_wrapper.h"
22 #include "napi_accessibility_event_info.h"
23 #include "napi_accessibility_system_ability_client.h"
24 #include "napi/native_api.h"
25 #include "napi/native_node_api.h"
26 
27 EXTERN_C_START
Cleanup(void * data)28 static void Cleanup(void *data)
29 {
30     HILOG_INFO("cleanup hook");
31     if (NAccessibilityClient::accessibilityStateListeners_) {
32         NAccessibilityClient::accessibilityStateListeners_->UnsubscribeFromFramework();
33     }
34     if (NAccessibilityClient::touchGuideStateListeners_) {
35         NAccessibilityClient::touchGuideStateListeners_->UnsubscribeFromFramework();
36     }
37     if (NAccessibilityClient::screenReaderStateListeners_) {
38         NAccessibilityClient::screenReaderStateListeners_->UnsubscribeFromFramework();
39     }
40     if (NAccessibilityClient::touchModeListeners_) {
41         NAccessibilityClient::touchModeListeners_->UnsubscribeFromFramework();
42     }
43     if (NAccessibilityClient::captionListeners_) {
44         NAccessibilityClient::captionListeners_->UnsubscribeFromFramework();
45     }
46 }
47 
CreateIntObject(napi_env env,int32_t value)48 static napi_value CreateIntObject(napi_env env, int32_t value)
49 {
50     napi_value jsObject = nullptr;
51     napi_create_int32(env, value, &jsObject);
52     return jsObject;
53 }
54 
CreateAccessibilityEventTypePartTwo(napi_env env,napi_value objValue)55 static void CreateAccessibilityEventTypePartTwo(napi_env env, napi_value objValue)
56 {
57     napi_set_named_property(env, objValue, "TYPE_WINDOW_LAYER",
58         CreateIntObject(env, AccessibilityEventType::TYPE_WINDOW_LAYER));
59     napi_set_named_property(env, objValue, "TYPE_TOUCH_BEGIN",
60         CreateIntObject(env, AccessibilityEventType::TYPE_TOUCH_BEGIN));
61     napi_set_named_property(env, objValue, "TYPE_TOUCH_END",
62         CreateIntObject(env, AccessibilityEventType::TYPE_TOUCH_END));
63     napi_set_named_property(env, objValue, "TYPE_PAGE_CONTENT_UPDATE",
64         CreateIntObject(env, AccessibilityEventType::TYPE_PAGE_CONTENT_UPDATE));
65     napi_set_named_property(env, objValue, "TYPE_PAGE_STATE_UPDATE",
66         CreateIntObject(env, AccessibilityEventType::TYPE_PAGE_STATE_UPDATE));
67     napi_set_named_property(env, objValue, "TYPE_PAGE_OPEN",
68         CreateIntObject(env, AccessibilityEventType::TYPE_PAGE_OPEN));
69     napi_set_named_property(env, objValue, "TYPE_PAGE_CLOSE",
70         CreateIntObject(env, AccessibilityEventType::TYPE_PAGE_CLOSE));
71     napi_set_named_property(env, objValue, "TYPE_SWIPE_LEFT",
72         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_LEFT));
73     napi_set_named_property(env, objValue, "TYPE_SWIPE_LEFT_THEN_RIGHT",
74         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_LEFT_THEN_RIGHT));
75     napi_set_named_property(env, objValue, "TYPE_SWIPE_LEFT_THEN_UP",
76         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_LEFT_THEN_UP));
77     napi_set_named_property(env, objValue, "TYPE_SWIPE_LEFT_THEN_DOWN",
78         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_LEFT_THEN_DOWN));
79     napi_set_named_property(env, objValue, "TYPE_SWIPE_RIGHT",
80         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_RIGHT));
81     napi_set_named_property(env, objValue, "TYPE_SWIPE_RIGHT_THEN_LEFT",
82         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_RIGHT_THEN_LEFT));
83     napi_set_named_property(env, objValue, "TYPE_SWIPE_RIGHT_THEN_UP",
84         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_RIGHT_THEN_UP));
85     napi_set_named_property(env, objValue, "TYPE_SWIPE_RIGHT_THEN_DOWN",
86         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_RIGHT_THEN_DOWN));
87     napi_set_named_property(env, objValue, "TYPE_SWIPE_UP",
88         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_UP));
89     napi_set_named_property(env, objValue, "TYPE_SWIPE_UP_THEN_LEFT",
90         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_UP_THEN_LEFT));
91     napi_set_named_property(env, objValue, "TYPE_SWIPE_UP_THEN_RIGHT",
92         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_UP_THEN_RIGHT));
93     napi_set_named_property(env, objValue, "TYPE_SWIPE_UP_THEN_DOWN",
94         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_UP_THEN_DOWN));
95     napi_set_named_property(env, objValue, "TYPE_SWIPE_DOWN",
96         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_DOWN));
97     napi_set_named_property(env, objValue, "TYPE_SWIPE_DOWN_THEN_LEFT",
98         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_DOWN_THEN_LEFT));
99     napi_set_named_property(env, objValue, "TYPE_SWIPE_DOWN_THEN_RIGHT",
100         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_DOWN_THEN_RIGHT));
101     napi_set_named_property(env, objValue, "TYPE_SWIPE_DOWN_THEN_UP",
102         CreateIntObject(env, AccessibilityEventType::TYPE_SWIPE_DOWN_THEN_UP));
103     napi_set_named_property(env, objValue, "TYPE_TWO_FINGER_SINGLE_TAP",
104         CreateIntObject(env, AccessibilityEventType::TYPE_TWO_FINGER_SINGLE_TAP));
105 }
106 
CreateAccessibilityEventTypePartThree(napi_env env,napi_value objValue)107 static void CreateAccessibilityEventTypePartThree(napi_env env, napi_value objValue)
108 {
109     napi_set_named_property(env, objValue, "TYPE_TWO_FINGER_DOUBLE_TAP",
110         CreateIntObject(env, AccessibilityEventType::TYPE_TWO_FINGER_DOUBLE_TAP));
111     napi_set_named_property(env, objValue, "TYPE_TWO_FINGER_DOUBLE_TAP_AND_HOLD",
112         CreateIntObject(env, AccessibilityEventType::TYPE_TWO_FINGER_DOUBLE_TAP_AND_HOLD));
113     napi_set_named_property(env, objValue, "TYPE_TWO_FINGER_TRIPLE_TAP",
114         CreateIntObject(env, AccessibilityEventType::TYPE_TWO_FINGER_TRIPLE_TAP));
115     napi_set_named_property(env, objValue, "TYPE_TWO_FINGER_TRIPLE_TAP_AND_HOLD",
116         CreateIntObject(env, AccessibilityEventType::TYPE_TWO_FINGER_TRIPLE_TAP_AND_HOLD));
117     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_SINGLE_TAP",
118         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_SINGLE_TAP));
119     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_DOUBLE_TAP",
120         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_DOUBLE_TAP));
121     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_DOUBLE_TAP_AND_HOLD",
122         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_DOUBLE_TAP_AND_HOLD));
123     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_TRIPLE_TAP",
124         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_TRIPLE_TAP));
125     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_TRIPLE_TAP_AND_HOLD",
126         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_TRIPLE_TAP_AND_HOLD));
127     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_SINGLE_TAP",
128         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_SINGLE_TAP));
129     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_DOUBLE_TAP",
130         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_DOUBLE_TAP));
131     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_DOUBLE_TAP_AND_HOLD",
132         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_DOUBLE_TAP_AND_HOLD));
133     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_TRIPLE_TAP",
134         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_TRIPLE_TAP));
135     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_TRIPLE_TAP_AND_HOLD",
136         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_TRIPLE_TAP_AND_HOLD));
137     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_SWIPE_UP",
138         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_SWIPE_UP));
139     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_SWIPE_DOWN",
140         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_SWIPE_DOWN));
141     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_SWIPE_LEFT",
142         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_SWIPE_LEFT));
143     napi_set_named_property(env, objValue, "TYPE_THREE_FINGER_SWIPE_RIGHT",
144         CreateIntObject(env, AccessibilityEventType::TYPE_THREE_FINGER_SWIPE_RIGHT));
145     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_SWIPE_UP",
146         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_SWIPE_UP));
147     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_SWIPE_DOWN",
148         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_SWIPE_DOWN));
149     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_SWIPE_LEFT",
150         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_SWIPE_LEFT));
151     napi_set_named_property(env, objValue, "TYPE_FOUR_FINGER_SWIPE_RIGHT",
152         CreateIntObject(env, AccessibilityEventType::TYPE_FOUR_FINGER_SWIPE_RIGHT));
153 }
154 
CreateAccessibilityEventType(napi_env env)155 static napi_value CreateAccessibilityEventType(napi_env env)
156 {
157     napi_value objValue = nullptr;
158     napi_create_object(env, &objValue);
159     napi_set_named_property(env, objValue, "TYPE_ACCESSIBILITY_FOCUS",
160         CreateIntObject(env, AccessibilityEventType::TYPE_ACCESSIBILITY_FOCUS));
161     napi_set_named_property(env, objValue, "TYPE_ACCESSIBILITY_FOCUS_CLEAR",
162         CreateIntObject(env, AccessibilityEventType::TYPE_ACCESSIBILITY_FOCUS_CLEAR));
163     napi_set_named_property(env, objValue, "TYPE_CLICK", CreateIntObject(env, AccessibilityEventType::TYPE_CLICK));
164     napi_set_named_property(env, objValue, "TYPE_LONG_CLICK",
165         CreateIntObject(env, AccessibilityEventType::TYPE_LONG_CLICK));
166     napi_set_named_property(env, objValue, "TYPE_SELECT", CreateIntObject(env, AccessibilityEventType::TYPE_SELECT));
167     napi_set_named_property(env, objValue, "TYPE_HOVER_ENTER",
168         CreateIntObject(env, AccessibilityEventType::TYPE_HOVER_ENTER));
169     napi_set_named_property(env, objValue, "TYPE_HOVER_EXIT",
170         CreateIntObject(env, AccessibilityEventType::TYPE_HOVER_EXIT));
171     napi_set_named_property(env, objValue, "TYPE_FOCUS", CreateIntObject(env, AccessibilityEventType::TYPE_FOCUS));
172     napi_set_named_property(env, objValue, "TYPE_TEXT_UPDATE",
173         CreateIntObject(env, AccessibilityEventType::TYPE_TEXT_UPDATE));
174     napi_set_named_property(env, objValue, "TYPE_TEXT_SELECTION_UPDATE",
175         CreateIntObject(env, AccessibilityEventType::TYPE_TEXT_SELECTION_UPDATE));
176     napi_set_named_property(env, objValue, "TYPE_SCROLL", CreateIntObject(env, AccessibilityEventType::TYPE_SCROLL));
177     napi_set_named_property(env, objValue, "TYPE_REQUEST_FOCUS_FOR_ACCESSIBILITY",
178         CreateIntObject(env, AccessibilityEventType::TYPE_REQUEST_FOCUS_FOR_ACCESSIBILITY));
179     napi_set_named_property(env, objValue, "TYPE_ANNOUNCE_FOR_ACCESSIBILITY",
180         CreateIntObject(env, AccessibilityEventType::TYPE_ANNOUNCE_FOR_ACCESSIBILITY));
181     napi_set_named_property(env, objValue, "TYPE_REQUEST_FOCUS_FOR_ACCESSIBILITY_NOT_INTERRUPT",
182         CreateIntObject(env, AccessibilityEventType::TYPE_REQUEST_FOCUS_FOR_ACCESSIBILITY_NOT_INTERRUPT));
183     napi_set_named_property(env, objValue, "TYPE_ANNOUNCE_FOR_ACCESSIBILITY_NOT_INTERRUPT",
184         CreateIntObject(env, AccessibilityEventType::TYPE_ANNOUNCE_FOR_ACCESSIBILITY_NOT_INTERRUPT));
185     napi_set_named_property(env, objValue, "TYPE_ELEMENT_INFO_CHANGE",
186         CreateIntObject(env, AccessibilityEventType::TYPE_ELEMENT_INFO_CHANGE));
187     napi_set_named_property(env, objValue, "TYPE_SCROLLING",
188         CreateIntObject(env, AccessibilityEventType::TYPE_SCROLLING));
189     napi_set_named_property(env, objValue, "TYPE_WINDOW_ADD",
190         CreateIntObject(env, AccessibilityEventType::TYPE_WINDOW_ADD));
191     napi_set_named_property(env, objValue, "TYPE_WINDOW_REMOVE",
192         CreateIntObject(env, AccessibilityEventType::TYPE_WINDOW_REMOVE));
193     napi_set_named_property(env, objValue, "TYPE_WINDOW_BOUNDS",
194         CreateIntObject(env, AccessibilityEventType::TYPE_WINDOW_BOUNDS));
195     napi_set_named_property(env, objValue, "TYPE_WINDOW_ACTIVE",
196         CreateIntObject(env, AccessibilityEventType::TYPE_WINDOW_ACTIVE));
197     napi_set_named_property(env, objValue, "TYPE_WINDOW_FOCUS",
198         CreateIntObject(env, AccessibilityEventType::TYPE_WINDOW_FOCUS));
199     napi_set_named_property(env, objValue, "TYPE_WINDOW_PROPERTY",
200         CreateIntObject(env, AccessibilityEventType::TYPE_WINDOW_PROPERTY));
201     CreateAccessibilityEventTypePartTwo(env, objValue);
202     CreateAccessibilityEventTypePartThree(env, objValue);
203     return objValue;
204 }
205 
CreateAccessibilityAction(napi_env env)206 static napi_value CreateAccessibilityAction(napi_env env)
207 {
208     napi_value objValue = nullptr;
209     napi_create_object(env, &objValue);
210     napi_set_named_property(env, objValue, "ACCESSIBILITY_FOCUS",
211         CreateIntObject(env, AccessibilityAction::ACCESSIBILITY_FOCUS));
212     napi_set_named_property(env, objValue, "CLEAR_ACCESSIBILITY_FOCUS",
213         CreateIntObject(env, AccessibilityAction::CLEAR_ACCESSIBILITY_FOCUS));
214     napi_set_named_property(env, objValue, "FOCUS", CreateIntObject(env, AccessibilityAction::FOCUS));
215     napi_set_named_property(env, objValue, "CLEAR_FOCUS", CreateIntObject(env, AccessibilityAction::CLEAR_FOCUS));
216     napi_set_named_property(env, objValue, "CLICK", CreateIntObject(env, AccessibilityAction::CLICK));
217     napi_set_named_property(env, objValue, "LONG_CLICK", CreateIntObject(env, AccessibilityAction::LONG_CLICK));
218     napi_set_named_property(env, objValue, "CUT", CreateIntObject(env, AccessibilityAction::CUT));
219     napi_set_named_property(env, objValue, "COPY", CreateIntObject(env, AccessibilityAction::COPY));
220     napi_set_named_property(env, objValue, "PASTE", CreateIntObject(env, AccessibilityAction::PASTE));
221     napi_set_named_property(env, objValue, "SELECT", CreateIntObject(env, AccessibilityAction::SELECT));
222     napi_set_named_property(env, objValue, "SET_TEXT", CreateIntObject(env, AccessibilityAction::SET_TEXT));
223     napi_set_named_property(env, objValue, "SCROLL_FORWARD",
224         CreateIntObject(env, AccessibilityAction::SCROLL_FORWARD));
225     napi_set_named_property(env, objValue, "SCROLL_BACKWARD",
226         CreateIntObject(env, AccessibilityAction::SCROLL_BACKWARD));
227     napi_set_named_property(env, objValue, "SET_SELECTION", CreateIntObject(env, AccessibilityAction::SET_SELECTION));
228     napi_set_named_property(env, objValue, "SET_CURSOR_POSITION",
229         CreateIntObject(env, AccessibilityAction::SET_CURSOR_POSITION));
230     napi_set_named_property(env, objValue, "HOME", CreateIntObject(env, AccessibilityAction::HOME));
231     napi_set_named_property(env, objValue, "BACK", CreateIntObject(env, AccessibilityAction::BACK));
232     napi_set_named_property(env, objValue, "RECENT_TASK", CreateIntObject(env, AccessibilityAction::RECENT_TASK));
233     napi_set_named_property(env, objValue, "NOTIFICATION_CENTER",
234         CreateIntObject(env, AccessibilityAction::NOTIFICATION_CENTER));
235     napi_set_named_property(env, objValue, "CONTROL_CENTER",
236         CreateIntObject(env, AccessibilityAction::CONTROL_CENTER));
237     napi_set_named_property(env, objValue, "SPAN_CLICK", CreateIntObject(env, AccessibilityAction::SPAN_CLICK));
238     return objValue;
239 }
240 
241 /*
242  * function for module exports
243  */
Init(napi_env env,napi_value exports)244 static napi_value Init(napi_env env, napi_value exports)
245 {
246     napi_property_descriptor desc[] = {
247         DECLARE_NAPI_FUNCTION("isOpenAccessibility", NAccessibilityClient::IsOpenAccessibility),
248         DECLARE_NAPI_FUNCTION("isOpenAccessibilitySync", NAccessibilityClient::IsOpenAccessibilitySync),
249         DECLARE_NAPI_FUNCTION("isOpenTouchGuide", NAccessibilityClient::IsOpenTouchExploration),
250         DECLARE_NAPI_FUNCTION("isOpenTouchGuideSync", NAccessibilityClient::IsOpenTouchExplorationSync),
251         DECLARE_NAPI_FUNCTION("isScreenReaderOpenSync", NAccessibilityClient::IsScreenReaderOpenSync),
252         DECLARE_NAPI_FUNCTION("getTouchModeSync", NAccessibilityClient::GetTouchModeSync),
253         DECLARE_NAPI_FUNCTION("getAbilityLists", NAccessibilityClient::GetAbilityList),
254         DECLARE_NAPI_FUNCTION("getAccessibilityExtensionList", NAccessibilityClient::GetAccessibilityExtensionList),
255         DECLARE_NAPI_FUNCTION("getAccessibilityExtensionListSync",
256             NAccessibilityClient::GetAccessibilityExtensionListSync),
257         DECLARE_NAPI_FUNCTION("on", NAccessibilityClient::SubscribeState),
258         DECLARE_NAPI_FUNCTION("off", NAccessibilityClient::UnsubscribeState),
259         DECLARE_NAPI_FUNCTION("sendEvent", NAccessibilityClient::SendEvent),
260         DECLARE_NAPI_FUNCTION("sendAccessibilityEvent", NAccessibilityClient::SendAccessibilityEvent),
261         DECLARE_NAPI_FUNCTION("getCaptionsManager", NAccessibilityClient::GetCaptionsManager),
262     };
263 
264     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
265 
266     napi_set_named_property(env, exports, "AccessibilityEventType", CreateAccessibilityEventType(env));
267     napi_set_named_property(env, exports, "AccessibilityAction", CreateAccessibilityAction(env));
268 
269     auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
270     (void)instance.InitializeContext();
271     NAccessibilityClient::DefineJSCaptionsManager(env);
272     NAccessibilityClient::DefineJSCaptionsStyle(env);
273     NAccessibilityEventInfo::DefineJSAccessibilityEventInfo(env, exports);
274     NAccessibilityClient::accessibilityStateListeners_->SubscribeToFramework();
275     NAccessibilityClient::touchGuideStateListeners_->SubscribeToFramework();
276     NAccessibilityClient::screenReaderStateListeners_->SubscribeToFramework();
277     NAccessibilityClient::touchModeListeners_->SubscribeToFramework();
278     NAccessibilityClient::captionListeners_->SubscribeToFramework();
279     napi_status status = napi_add_env_cleanup_hook(env, Cleanup, &NAccessibilityClient::accessibilityStateListeners_);
280     if (status != napi_ok) {
281         HILOG_WARN("add cleanup hook failed %{public}d", status);
282     }
283     HILOG_INFO("-----Init end------");
284     return exports;
285 }
286 EXTERN_C_END
287 
288 /*
289  * Module define
290  */
291 static napi_module _module = {
292     .nm_version = 1,
293     .nm_flags = 0,
294     .nm_filename = nullptr,
295     .nm_register_func = Init,
296     .nm_modname = "accessibility",
297     .nm_priv = ((void*)0),
298     .reserved = {0},
299 };
300 /*
301  * Module register function
302  */
RegisterNapiAccessibilityModule(void)303 extern "C" __attribute__((constructor)) void RegisterNapiAccessibilityModule(void)
304 {
305     napi_module_register(&_module);
306 }
307