• 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 
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