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
16 #include "gtest/gtest.h"
17
18 #define private public
19 #define protected public
20
21 #include "test/mock/base/mock_task_executor.h"
22 #include "test/mock/core/common/mock_container.h"
23 #include "test/mock/core/pipeline/mock_pipeline_context.h"
24
25 #include "accessibility_system_ability_client.h"
26 #include "frameworks/core/accessibility/accessibility_manager.h"
27 #include "adapter/ohos/osal/js_third_provider_interaction_operation.h"
28
29 #include "base/log/dump_log.h"
30 #include "frameworks/core/accessibility/accessibility_node.h"
31 #include "frameworks/core/accessibility/accessibility_utils.h"
32 #include "frameworks/core/accessibility/native_interface_accessibility_provider.h"
33 #include "frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.h"
34 #include "js_third_provider_interaction_operation_test.h"
35
36 using namespace testing;
37 using namespace testing::ext;
38
39 namespace OHOS::Ace {
40 } // namespace OHOS::Ace
41
42 namespace OHOS::Ace::NG {
43 namespace {
44 const int32_t IGNORE_POSITION_TRANSITION_SWITCH = -990;
45 } // namespace
46
47 class JsThirdAccessibilityHoverNgTest : public testing::Test {
48 public:
49 static void SetUpTestCase();
50 static void TearDownTestCase();
51 };
52
SetUpTestCase()53 void JsThirdAccessibilityHoverNgTest::SetUpTestCase()
54 {
55 MockPipelineContext::SetUp();
56 MockContainer::SetUp();
57 MockContainer::Current()->taskExecutor_ = AceType::MakeRefPtr<MockTaskExecutor>();
58 MockContainer::Current()->pipelineContext_ = MockPipelineContext::GetCurrentContext();
59 MockContainer::Current()->pipelineContext_->taskExecutor_ = MockContainer::Current()->taskExecutor_;
60 auto context = NG::PipelineContext::GetCurrentContext();
61 context->instanceId_ = IGNORE_POSITION_TRANSITION_SWITCH;
62 std::unique_ptr<std::ostream> ostream = std::make_unique<std::ostringstream>();
63 ASSERT_NE(ostream, nullptr);
64 DumpLog::GetInstance().SetDumpFile(std::move(ostream));
65 }
66
TearDownTestCase()67 void JsThirdAccessibilityHoverNgTest::TearDownTestCase()
68 {
69 MockPipelineContext::TearDown();
70 MockContainer::TearDown();
71 }
72
73 /**
74 * @tc.name: JsThirdAccessibilityHoverNgTest001
75 * @tc.desc: ClearFocusFromProvider
76 * @tc.type: FUNC
77 */
78 HWTEST_F(JsThirdAccessibilityHoverNgTest, JsThirdAccessibilityHoverNgTest001, TestSize.Level1)
79 {
80 auto ohAccessibilityProvider
81 = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
82 auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
83 auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
84 auto context = NG::PipelineContext::GetCurrentContext();
85 jsAccessibilityManager->SetPipelineContext(context);
86 jsAccessibilityManager->Register(true);
87
88 auto jsInteractionOperation = std::make_shared<Framework::JsThirdProviderInteractionOperation>(
89 ohAccessibilityProvider, jsAccessibilityManager, frameNode);
90 jsInteractionOperation->SetBelongTreeId(0);
91
92 bool ret;
93
94 int64_t elementId = 0;
95 Accessibility::AccessibilityElementInfo info;
96 int64_t hostElementId = 0;
97 // 1 jsThirdProviderOperator not registered
98 ret = jsAccessibilityManager->GetElementInfoForThird(elementId, info, hostElementId);
99 EXPECT_EQ(ret, false);
100
101 jsAccessibilityManager->RegisterJsThirdProviderInteractionOperation(hostElementId, jsInteractionOperation);
102 // 2 FindAccessibilityNodeInfosByIdFromProvider not ok
103 ohAccessibilityProvider->SetInjectResult(-1);
104 ret = jsAccessibilityManager->GetElementInfoForThird(elementId, info, hostElementId);
105 EXPECT_EQ(ret, false);
106
107 // 3 FindAccessibilityNodeInfosByIdFromProvider ok, info equals to mock element info
108 ohAccessibilityProvider->providerMockResult_.Reset();
109 ret = jsAccessibilityManager->GetElementInfoForThird(elementId, info, hostElementId);
110 EXPECT_EQ(ret, true);
111
112 EXPECT_EQ(info.GetAccessibilityId(),
113 ohAccessibilityProvider->providerMockResult_.elementInfosList_[elementId].GetElementId());
114 }
115
116 /**
117 * @tc.name: JsThirdAccessibilityHoverNgTest001
118 * @tc.desc: ClearFocusFromProvider
119 * @tc.type: FUNC
120 */
121 HWTEST_F(JsThirdAccessibilityHoverNgTest, JsThirdAccessibilityHoverNgTest002, TestSize.Level1)
122 {
123 auto ohAccessibilityProvider
124 = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
125 auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
126 auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
127 auto context = NG::PipelineContext::GetCurrentContext();
128 jsAccessibilityManager->SetPipelineContext(context);
129 jsAccessibilityManager->Register(true);
130
131 auto jsInteractionOperation = std::make_shared<Framework::JsThirdProviderInteractionOperation>(
132 ohAccessibilityProvider, jsAccessibilityManager, frameNode);
133 jsInteractionOperation->SetBelongTreeId(0);
134
135 std::string hitTestMode = "HitTestMode.Block";
136 bool shouldSearchSelf = true;
137 bool shouldSearchChildren = true;
138 // 1 HitTestMode.Block
139 jsAccessibilityManager->UpdateSearchStrategyByHitTestModeStr(hitTestMode, shouldSearchSelf, shouldSearchChildren);
140 EXPECT_EQ(shouldSearchSelf, true);
141 EXPECT_EQ(shouldSearchChildren, false);
142
143 // 2 HitTestMode.None
144 hitTestMode = "HitTestMode.None";
145 shouldSearchSelf = true;
146 shouldSearchChildren = true;
147 jsAccessibilityManager->UpdateSearchStrategyByHitTestModeStr(hitTestMode, shouldSearchSelf, shouldSearchChildren);
148 EXPECT_EQ(shouldSearchSelf, false);
149 EXPECT_EQ(shouldSearchChildren, true);
150
151 // 3 HitTestMode.Default
152 hitTestMode = "HitTestMode.Default";
153 shouldSearchSelf = true;
154 shouldSearchChildren = true;
155 jsAccessibilityManager->UpdateSearchStrategyByHitTestModeStr(hitTestMode, shouldSearchSelf, shouldSearchChildren);
156 EXPECT_EQ(shouldSearchSelf, true);
157 EXPECT_EQ(shouldSearchChildren, true);
158 }
159
160 /**
161 * @tc.name: JsThirdAccessibilityHoverNgTest003
162 * @tc.desc: IsAccessibilityFocusable
163 * @tc.type: FUNC
164 */
165 HWTEST_F(JsThirdAccessibilityHoverNgTest, JsThirdAccessibilityHoverNgTest003, TestSize.Level1)
166 {
167 auto ohAccessibilityProvider
168 = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
169 auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
170 auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
171 auto context = NG::PipelineContext::GetCurrentContext();
172 jsAccessibilityManager->SetPipelineContext(context);
173 jsAccessibilityManager->Register(true);
174
175 auto jsInteractionOperation = std::make_shared<Framework::JsThirdProviderInteractionOperation>(
176 ohAccessibilityProvider, jsAccessibilityManager, frameNode);
177 jsInteractionOperation->SetBelongTreeId(0);
178
179 bool ret;
180 Accessibility::AccessibilityElementInfo nodeInfo;
181
182 // level yes
183 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::YES_STR);
184 ret = jsAccessibilityManager->IsAccessibilityFocusable(nodeInfo);
185 EXPECT_EQ(ret, true);
186
187 // level no
188 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::NO_STR);
189 ret = jsAccessibilityManager->IsAccessibilityFocusable(nodeInfo);
190 EXPECT_EQ(ret, false);
191 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::AUTO);
192
193 // group true
194 nodeInfo.SetAccessibilityGroup(true);
195 ret = jsAccessibilityManager->IsAccessibilityFocusable(nodeInfo);
196 EXPECT_EQ(ret, true);
197 }
198
199 /**
200 * @tc.name: JsThirdAccessibilityHoverNgTest004
201 * @tc.desc: IsAccessibilityFocusable
202 * @tc.type: FUNC
203 */
204 HWTEST_F(JsThirdAccessibilityHoverNgTest, JsThirdAccessibilityHoverNgTest004, TestSize.Level1)
205 {
206 auto ohAccessibilityProvider
207 = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
208 auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
209 auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
210 auto context = NG::PipelineContext::GetCurrentContext();
211 jsAccessibilityManager->SetPipelineContext(context);
212 jsAccessibilityManager->Register(true);
213
214 auto jsInteractionOperation = std::make_shared<Framework::JsThirdProviderInteractionOperation>(
215 ohAccessibilityProvider, jsAccessibilityManager, frameNode);
216 jsInteractionOperation->SetBelongTreeId(0);
217
218 bool ret;
219 Accessibility::AccessibilityElementInfo nodeInfo;
220
221 bool shouldSearchSelf;
222 bool shouldSearchChildren;
223 std::pair<bool, bool> result;
224 // level yes
225 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::YES_STR);
226 result = jsAccessibilityManager->GetSearchStrategyForThird(nodeInfo);
227 shouldSearchSelf = result.first;
228 shouldSearchChildren = result.second;
229 EXPECT_EQ(shouldSearchSelf, true);
230 EXPECT_EQ(shouldSearchChildren, true);
231
232 // level NO_HIDE_DESCENDANTS
233 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::NO_HIDE_DESCENDANTS);
234 result = jsAccessibilityManager->GetSearchStrategyForThird(nodeInfo);
235 shouldSearchSelf = result.first;
236 shouldSearchChildren = result.second;
237 EXPECT_EQ(shouldSearchSelf, false);
238 EXPECT_EQ(shouldSearchChildren, false);
239
240 // level NO with AccessibilityText
241 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::NO_STR);
242 nodeInfo.SetAccessibilityText("test");
243 result = jsAccessibilityManager->GetSearchStrategyForThird(nodeInfo);
244 shouldSearchSelf = result.first;
245 shouldSearchChildren = result.second;
246 EXPECT_EQ(shouldSearchSelf, false);
247 EXPECT_EQ(shouldSearchChildren, true);
248
249 // level NO
250 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::NO_STR);
251 result = jsAccessibilityManager->GetSearchStrategyForThird(nodeInfo);
252 shouldSearchSelf = result.first;
253 shouldSearchChildren = result.second;
254 EXPECT_EQ(shouldSearchSelf, false);
255 EXPECT_EQ(shouldSearchChildren, true);
256 }
257
258 /**
259 * @tc.name: JsThirdAccessibilityHoverNgTest004
260 * @tc.desc: IsAccessibilityFocusable
261 * @tc.type: FUNC
262 */
263 HWTEST_F(JsThirdAccessibilityHoverNgTest, JsThirdAccessibilityHoverNgTest0041, TestSize.Level1)
264 {
265 auto ohAccessibilityProvider
266 = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
267 auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
268 auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
269 auto context = NG::PipelineContext::GetCurrentContext();
270 jsAccessibilityManager->SetPipelineContext(context);
271 jsAccessibilityManager->Register(true);
272
273 auto jsInteractionOperation = std::make_shared<Framework::JsThirdProviderInteractionOperation>(
274 ohAccessibilityProvider, jsAccessibilityManager, frameNode);
275 jsInteractionOperation->SetBelongTreeId(0);
276
277 bool ret;
278 Accessibility::AccessibilityElementInfo nodeInfo;
279
280 bool shouldSearchSelf;
281 bool shouldSearchChildren;
282 std::pair<bool, bool> result;
283
284 // level auto and not accessibility text and hit test mode default
285 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::AUTO);
286 result = jsAccessibilityManager->GetSearchStrategyForThird(nodeInfo);
287 shouldSearchSelf = result.first;
288 shouldSearchChildren = result.second;
289 EXPECT_EQ(shouldSearchSelf, true);
290 EXPECT_EQ(shouldSearchChildren, true);
291
292 // level auto and has accessibility text and hit test mode none
293 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::AUTO);
294 nodeInfo.SetAccessibilityText("test");
295 nodeInfo.SetHitTestBehavior("HitTestMode.None");
296 result = jsAccessibilityManager->GetSearchStrategyForThird(nodeInfo);
297 shouldSearchSelf = result.first;
298 shouldSearchChildren = result.second;
299 EXPECT_EQ(shouldSearchSelf, true);
300 EXPECT_EQ(shouldSearchChildren, true);
301
302
303 // level auto and has accessibility text and hit test mode default
304 nodeInfo.SetAccessibilityLevel(NG::AccessibilityProperty::Level::AUTO);
305 nodeInfo.SetAccessibilityText("");
306 nodeInfo.SetHitTestBehavior("HitTestMode.None");
307 result = jsAccessibilityManager->GetSearchStrategyForThird(nodeInfo);
308 shouldSearchSelf = result.first;
309 shouldSearchChildren = result.second;
310 EXPECT_EQ(shouldSearchSelf, false);
311 EXPECT_EQ(shouldSearchChildren, true);
312 }
313
314 /**
315 * @tc.name: JsThirdAccessibilityHoverNgTest004
316 * @tc.desc: IsAccessibilityFocusable
317 * @tc.type: FUNC
318 */
319 HWTEST_F(JsThirdAccessibilityHoverNgTest, JsThirdAccessibilityHoverNgTest005, TestSize.Level1)
320 {
321 auto ohAccessibilityProvider
322 = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
323 auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
324 auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
325 auto context = NG::PipelineContext::GetCurrentContext();
326 jsAccessibilityManager->SetPipelineContext(context);
327 jsAccessibilityManager->Register(true);
328
329 auto jsInteractionOperation = std::make_shared<Framework::JsThirdProviderInteractionOperation>(
330 ohAccessibilityProvider, jsAccessibilityManager, frameNode);
331 jsInteractionOperation->SetBelongTreeId(0);
332 int64_t hostElementId = 0;
333 jsAccessibilityManager->RegisterJsThirdProviderInteractionOperation(hostElementId, jsInteractionOperation);
334
335 NG::PointF point(1, 1);
336 auto elementInfoListSize = ohAccessibilityProvider->providerMockResult_.elementInfosList_.size();
337 for (int32_t i = 0; i < elementInfoListSize; i++) {
338 auto leftTopX = 0;
339 auto leftTopY = 0;
340 auto rightBottomX = 100;
341 auto rightBottomY = 100;
342 ArkUI_AccessibleRect screenRect {leftTopX, leftTopY, rightBottomX, rightBottomY};
343 ohAccessibilityProvider->providerMockResult_.elementInfosList_[i].SetRect(screenRect);
344 }
345 Accessibility::AccessibilityElementInfo rootInfo;
346
347 auto ret = jsAccessibilityManager->GetElementInfoForThird(-1, rootInfo, hostElementId);
348 EXPECT_EQ(ret, true);
349 auto path = jsAccessibilityManager->HoverPathForThird(hostElementId, point, rootInfo);
350 EXPECT_EQ(path.size(), elementInfoListSize);
351 }
352
353 /**
354 * @tc.name: JsThirdAccessibilityHoverNgTest004
355 * @tc.desc: IsAccessibilityFocusable
356 * @tc.type: FUNC
357 */
358 HWTEST_F(JsThirdAccessibilityHoverNgTest, JsThirdAccessibilityHoverNgTest006, TestSize.Level1)
359 {
360 auto ohAccessibilityProvider
361 = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
362 auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
363 auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
364 auto context = NG::PipelineContext::GetCurrentContext();
365 jsAccessibilityManager->SetPipelineContext(context);
366 jsAccessibilityManager->Register(true);
367
368 auto jsInteractionOperation = std::make_shared<Framework::JsThirdProviderInteractionOperation>(
369 ohAccessibilityProvider, jsAccessibilityManager, frameNode);
370 jsInteractionOperation->SetBelongTreeId(0);
371 int64_t hostElementId = 0;
372 jsAccessibilityManager->RegisterJsThirdProviderInteractionOperation(hostElementId, jsInteractionOperation);
373
374 bool ret;
375
376 auto elementInfoListSize = ohAccessibilityProvider->providerMockResult_.elementInfosList_.size();
377 for (int32_t i = 0; i < elementInfoListSize; i++) {
378 auto leftTopX = 0;
379 auto leftTopY = 0;
380 auto rightBottomX = 100;
381 auto rightBottomY = 100;
382 ArkUI_AccessibleRect screenRect {leftTopX, leftTopY, rightBottomX, rightBottomY};
383 ohAccessibilityProvider->providerMockResult_.elementInfosList_[i].SetRect(screenRect);
384 }
385
386 NG::PointF point(0, 0);
387 SourceType sourceType = SourceType::NONE;
388 NG::AccessibilityHoverEventType eventType = NG::AccessibilityHoverEventType::ENTER;
389 TimeStamp time = std::chrono::high_resolution_clock::now();
390 Framework::AccessibilityHoverForThirdConfig config
391 {hostElementId, point, sourceType, eventType, time, context};
392
393 jsAccessibilityManager->HandleAccessibilityHoverForThird(config);
394 // tbm mock client to check event;
395 EXPECT_NE(frameNode, nullptr);
396 }
397
398
399 /**
400 * @tc.name: JsThirdAccessibilityHoverNgTest007
401 * @tc.desc: IsAccessibilityFocusable
402 * @tc.type: FUNC
403 */
404 HWTEST_F(JsThirdAccessibilityHoverNgTest, JsThirdAccessibilityHoverNgTest007, TestSize.Level1)
405 {
406 auto ohAccessibilityProvider
407 = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
408 auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
409 auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
410 auto context = NG::PipelineContext::GetCurrentContext();
411 jsAccessibilityManager->SetPipelineContext(context);
412 jsAccessibilityManager->Register(true);
413
414 auto jsInteractionOperation = std::make_shared<Framework::JsThirdProviderInteractionOperation>(
415 ohAccessibilityProvider, jsAccessibilityManager, frameNode);
416 jsInteractionOperation->SetBelongTreeId(0);
417 int64_t hostElementId = 0;
418 jsAccessibilityManager->RegisterJsThirdProviderInteractionOperation(hostElementId, jsInteractionOperation);
419
420 std::vector<std::string> info;
421 // 1. dump property
422 std::vector<std::string> params;
423 params.push_back("-inspector");
424 params.push_back("1");
425
426 jsAccessibilityManager->OnDumpChildInfoForThirdRecursive(hostElementId, params, info, jsAccessibilityManager);
427 // tbm make sure check method;
428 EXPECT_NE(frameNode, nullptr);
429 // 2. dump tree
430 params.clear();
431 params.push_back("-inspector");
432 params.push_back("--root");
433 params.push_back("1");
434 params.push_back("2");
435
436 jsAccessibilityManager->OnDumpChildInfoForThirdRecursive(hostElementId, params, info, jsAccessibilityManager);
437 // tbm make sure check method;
438 EXPECT_NE(frameNode, nullptr);
439 }
440
441 } // namespace OHOS::Ace::NG