• 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 "frameworks/core/accessibility/accessibility_node.h"
30 #include "frameworks/core/accessibility/accessibility_utils.h"
31 #include "frameworks/core/accessibility/native_interface_accessibility_provider.h"
32 #include "frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.h"
33 #include "frameworks/core/components_ng/pattern/stage/page_pattern.h"
34 #include "adapter/ohos/osal/js_accessibility_manager.h"
35 #include "js_third_provider_interaction_operation_test.h"
36 
37 using namespace testing;
38 using namespace testing::ext;
39 using namespace OHOS::Accessibility;
40 
41 namespace OHOS::Ace {
42 int32_t g_mockErrorCode = -1;
43 std::string TEST_CONTENT_STR = "testForFindByText";
44 
45 class MockAccessibilityElementOperatorCallback : public Accessibility::AccessibilityElementOperatorCallback {
46 public:
47     ~MockAccessibilityElementOperatorCallback() = default;
48 
SetSearchElementInfoByAccessibilityIdResult(const std::list<Accessibility::AccessibilityElementInfo> & infos,const int32_t requestId)49     void SetSearchElementInfoByAccessibilityIdResult(const std::list<Accessibility::AccessibilityElementInfo> &infos,
50         const int32_t requestId)  override
51     {
52         mockInfos_ = infos;
53         mockRequestId = requestId;
54     }
55 
SetSearchElementInfoByTextResult(const std::list<Accessibility::AccessibilityElementInfo> & infos,const int32_t requestId)56     void SetSearchElementInfoByTextResult(const std::list<Accessibility::AccessibilityElementInfo> &infos,
57         const int32_t requestId) override
58     {
59         mockInfos_ = infos;
60         mockRequestId = requestId;
61     }
62 
SetSearchDefaultFocusByWindowIdResult(const std::list<Accessibility::AccessibilityElementInfo> & infos,const int32_t requestId)63     void SetSearchDefaultFocusByWindowIdResult(const std::list<Accessibility::AccessibilityElementInfo> &infos,
64         const int32_t requestId) override
65     {
66         mockInfos_ = infos;
67         mockRequestId = requestId;
68     }
69 
SetFindFocusedElementInfoResult(const Accessibility::AccessibilityElementInfo & info,const int32_t requestId)70     void SetFindFocusedElementInfoResult(
71         const Accessibility::AccessibilityElementInfo &info,
72         const int32_t requestId) override
73     {
74         mockInfo_ = info;
75         mockRequestId = requestId;
76     }
77 
SetFocusMoveSearchResult(const Accessibility::AccessibilityElementInfo & info,const int32_t requestId)78     void SetFocusMoveSearchResult(const Accessibility::AccessibilityElementInfo &info, const int32_t requestId) override
79     {
80         mockInfo_ = info;
81         mockRequestId = requestId;
82     }
83 
SetExecuteActionResult(const bool succeeded,const int32_t requestId)84     void SetExecuteActionResult(const bool succeeded, const int32_t requestId) override
85     {
86         mockSucceeded_ = succeeded;
87         mockRequestId = requestId;
88     }
89 
SetCursorPositionResult(const int32_t cursorPosition,const int32_t requestId)90     void SetCursorPositionResult(const int32_t cursorPosition, const int32_t requestId) override
91     {
92         mockCursorPosition_ = cursorPosition;
93         mockRequestId = requestId;
94     }
95 
96     std::list<Accessibility::AccessibilityElementInfo> mockInfos_;
97     Accessibility::AccessibilityElementInfo mockInfo_;
98     int32_t mockRequestId = 0;
99     bool mockSucceeded_ = false;
100     int32_t mockCursorPosition_ = 0;
101 };
102 } // namespace OHOS::Ace
103 
104 namespace OHOS::Ace::NG {
105 namespace {
106     const int32_t IGNORE_POSITION_TRANSITION_SWITCH = -990;
107 } // namespace
108 
109 class JsThirdProviderInteractionOperationTest : public testing::Test {
110 public:
111     static void SetUpTestCase();
112     static void TearDownTestCase();
113 };
114 
SetUpTestCase()115 void JsThirdProviderInteractionOperationTest::SetUpTestCase()
116 {
117     MockPipelineContext::SetUp();
118     MockContainer::SetUp();
119     MockContainer::Current()->taskExecutor_ = AceType::MakeRefPtr<MockTaskExecutor>();
120     MockContainer::Current()->pipelineContext_ = MockPipelineContext::GetCurrentContext();
121     MockContainer::Current()->pipelineContext_->taskExecutor_ = MockContainer::Current()->taskExecutor_;
122     auto context = NG::PipelineContext::GetCurrentContext();
123     context->instanceId_ = IGNORE_POSITION_TRANSITION_SWITCH;
124 }
125 
TearDownTestCase()126 void JsThirdProviderInteractionOperationTest::TearDownTestCase()
127 {
128     MockPipelineContext::TearDown();
129     MockContainer::TearDown();
130 }
131 
132 /**
133  * @tc.name: JsThirdProviderInteractionOperationTest001
134  * @tc.desc: ClearFocusFromProvider
135  * @tc.type: FUNC
136  */
137 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest001, TestSize.Level1)
138 {
139     auto ohAccessibilityProvider
140         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
141 
142     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
143     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
144     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
145         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
146 
147     auto ret =jsInteractionOperation->ClearFocusFromProvider();
148     jsInteractionOperation->ClearFocus();
149     EXPECT_EQ(ret, true);
150     EXPECT_EQ(ohAccessibilityProvider->providerMockResult_.receiveClear_, true);
151 }
152 
153 /**
154  * @tc.name: JsThirdProviderInteractionOperationTest002
155  * @tc.desc: SearchElementInfoByAccessibilityId
156  * @tc.type: FUNC
157  */
158 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest002, TestSize.Level1)
159 {
160     auto ohAccessibilityProvider
161         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
162     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
163     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
164     auto context = NG::PipelineContext::GetCurrentContext();
165     jsAccessibilityManager->SetPipelineContext(context);
166     jsAccessibilityManager->Register(true);
167 
168     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
169         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
170     jsInteractionOperation->SetBelongTreeId(0);
171 
172     int64_t elementId = -1;
173     int32_t requestId = 2;
174     int32_t mode = 8; // search tree
175     MockAccessibilityElementOperatorCallback operatorCallback;
176 
177     // 1 provider abnormal, callback should receive same request id and empty infos
178     ohAccessibilityProvider->SetInjectResult(-1);
179     jsInteractionOperation->SearchElementInfoByAccessibilityId(
180         elementId, requestId,
181         operatorCallback, mode);
182 
183     EXPECT_EQ(operatorCallback.mockInfos_.size(), 0);
184     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
185 
186     // 2 provider normal,callback should receive same request id and same infos as provider
187     ohAccessibilityProvider->providerMockResult_.Reset();
188     jsInteractionOperation->SearchElementInfoByAccessibilityId(
189         elementId, requestId,
190         operatorCallback, mode);
191     EXPECT_EQ(operatorCallback.mockInfos_.size(),
192         ohAccessibilityProvider->providerMockResult_.elementInfosList_.size());
193     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
194 }
195 
196 /**
197  * @tc.name: JsThirdProviderInteractionOperationTest003
198  * @tc.desc: earchElementInfosByText
199  * @tc.type: FUNC
200  */
201 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest003, TestSize.Level1)
202 {
203     auto ohAccessibilityProvider
204         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
205     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
206     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
207     auto context = NG::PipelineContext::GetCurrentContext();
208     jsAccessibilityManager->SetPipelineContext(context);
209     jsAccessibilityManager->Register(true);
210 
211     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
212         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
213     jsInteractionOperation->SetBelongTreeId(0);
214 
215     int64_t elementId = -1;
216     int32_t requestId = 2;
217     std::string& text = TEST_CONTENT_STR;
218     MockAccessibilityElementOperatorCallback operatorCallback;
219 
220     // 1 provider abnormal, callback should receive same request id and empty infos
221     ohAccessibilityProvider->SetInjectResult(-1);
222     jsInteractionOperation->SearchElementInfosByText(
223         elementId, text, requestId, operatorCallback);
224 
225     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
226 
227     // 2 provider normal,callback should receive same request id and same infos as provider
228     ohAccessibilityProvider->providerMockResult_.Reset();
229     jsInteractionOperation->SearchElementInfosByText(
230         elementId, text, requestId, operatorCallback);
231     EXPECT_EQ(operatorCallback.mockInfos_.size(),
232         ohAccessibilityProvider->providerMockResult_.elementInfosList_.size());
233     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
234 }
235 
236 /**
237  * @tc.name: JsThirdProviderInteractionOperationTest004
238  * @tc.desc: FindFocusedElementInfo
239  * @tc.type: FUNC
240  */
241 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest004, TestSize.Level1)
242 {
243     auto ohAccessibilityProvider
244         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
245     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
246     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
247     auto context = NG::PipelineContext::GetCurrentContext();
248     jsAccessibilityManager->SetPipelineContext(context);
249     jsAccessibilityManager->Register(true);
250 
251     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
252         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
253     jsInteractionOperation->SetBelongTreeId(0);
254 
255     int64_t elementId = -1;
256     int32_t requestId = 2;
257     int32_t focusType = 3;
258     MockAccessibilityElementOperatorCallback operatorCallback;
259 
260     // 1 provider abnormal, callback should receive same request id and empty info
261     ohAccessibilityProvider->SetInjectResult(-1);
262     jsInteractionOperation->FindFocusedElementInfo(
263         elementId, focusType, requestId, operatorCallback);
264 
265     EXPECT_EQ(operatorCallback.mockInfo_.GetAccessibilityId(), -1);
266     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
267 
268     // 2 provider normal,callback should receive same request id and same info as provider
269     ohAccessibilityProvider->providerMockResult_.Reset();
270     jsInteractionOperation->FindFocusedElementInfo(
271         elementId, focusType, requestId, operatorCallback);
272     EXPECT_EQ(operatorCallback.mockInfo_.GetAccessibilityId(),
273         ohAccessibilityProvider->providerMockResult_.focusElementInfo_.GetElementId());
274     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
275 }
276 
277 /**
278  * @tc.name: JsThirdProviderInteractionOperationTest005
279  * @tc.desc: FocusMoveSearch
280  * @tc.type: FUNC
281  */
282 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest005, TestSize.Level1)
283 {
284     auto ohAccessibilityProvider
285         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
286     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
287     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
288     auto context = NG::PipelineContext::GetCurrentContext();
289     jsAccessibilityManager->SetPipelineContext(context);
290     jsAccessibilityManager->Register(true);
291 
292     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
293         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
294     jsInteractionOperation->SetBelongTreeId(0);
295 
296     int64_t elementId = -1;
297     int32_t requestId = 2;
298     int32_t direction = 3;
299     MockAccessibilityElementOperatorCallback operatorCallback;
300 
301     // 1 provider abnormal, callback should receive same request id and info of host
302     ohAccessibilityProvider->SetInjectResult(-1);
303     jsInteractionOperation->FocusMoveSearch(
304         elementId, direction, requestId, operatorCallback);
305     EXPECT_EQ(operatorCallback.mockInfo_.GetAccessibilityId(), frameNode->GetAccessibilityId());
306     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
307 
308     // 2 provider normal,callback should receive same request id and same info as provider
309     ohAccessibilityProvider->providerMockResult_.Reset();
310     jsInteractionOperation->FocusMoveSearch(
311         elementId, direction, requestId, operatorCallback);
312     EXPECT_EQ(operatorCallback.mockInfo_.GetAccessibilityId(),
313         ohAccessibilityProvider->providerMockResult_.nextFocusElementInfo_.GetElementId());
314     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
315 }
316 
317 /**
318  * @tc.name: JsThirdProviderInteractionOperationTest006
319  * @tc.desc: ExecuteAction
320  * @tc.type: FUNC
321  */
322 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest006, TestSize.Level1)
323 {
324     auto ohAccessibilityProvider
325         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
326     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
327     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
328     auto context = NG::PipelineContext::GetCurrentContext();
329     jsAccessibilityManager->SetPipelineContext(context);
330     jsAccessibilityManager->Register(true);
331 
332     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
333         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
334     jsInteractionOperation->SetBelongTreeId(0);
335     int64_t elementId = 0;
336     int32_t requestId = 2;
337     int32_t action = -1;
338     std::map<std::string, std::string> actionArguments =
339         ohAccessibilityProvider->providerMockResult_.originActionArguments_;
340 
341     MockAccessibilityElementOperatorCallback operatorCallback;
342 
343     // 1 FindAccessibilityNode abnormal, callback should receive same request id and false
344     ohAccessibilityProvider->SetInjectResult(-1);
345     operatorCallback.mockSucceeded_ = true;
346     jsInteractionOperation->ExecuteAction(
347         elementId, action, actionArguments, requestId, operatorCallback);
348     EXPECT_EQ(operatorCallback.mockSucceeded_, false);
349     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
350 
351     // 2 ExecuteAccessibilityAction abnormal, callback should receive same request id and false
352     ohAccessibilityProvider->providerMockResult_.Reset();
353     ohAccessibilityProvider->SetInjectActionResult(-1);
354     operatorCallback.mockSucceeded_ = true;
355     jsInteractionOperation->ExecuteAction(
356         elementId, action, actionArguments, requestId, operatorCallback);
357     EXPECT_EQ(operatorCallback.mockSucceeded_, false);
358     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
359 
360     // 3 ExecuteAccessibilityAction normal, callback should receive same request id and true
361     ohAccessibilityProvider->providerMockResult_.Reset();
362     jsInteractionOperation->ExecuteAction(
363         elementId, action, actionArguments, requestId, operatorCallback);
364     EXPECT_EQ(operatorCallback.mockSucceeded_, true);
365     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
366 }
367 
368 /**
369  * @tc.name: JsThirdProviderInteractionOperationTest007
370  * @tc.desc: GetCursorPosition
371  * @tc.type: FUNC
372  */
373 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest007, TestSize.Level1)
374 {
375     auto ohAccessibilityProvider
376         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
377     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
378     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
379     auto context = NG::PipelineContext::GetCurrentContext();
380     jsAccessibilityManager->SetPipelineContext(context);
381     jsAccessibilityManager->Register(true);
382 
383     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
384         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
385     jsInteractionOperation->SetBelongTreeId(0);
386 
387     int64_t elementId = -1;
388     int32_t requestId = 2;
389     MockAccessibilityElementOperatorCallback operatorCallback;
390 
391     // 1 provider abnormal, callback should receive same request id and CursorPosition default
392     ohAccessibilityProvider->SetInjectResult(-1);
393     jsInteractionOperation->GetCursorPosition(
394         elementId, requestId, operatorCallback);
395     EXPECT_EQ(operatorCallback.mockCursorPosition_, -1);
396     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
397 
398     // 2 provider normal,callback should receive same request id and same CursorPosition as provider
399     ohAccessibilityProvider->providerMockResult_.Reset();
400     jsInteractionOperation->GetCursorPosition(
401         elementId, requestId, operatorCallback);
402     EXPECT_EQ(operatorCallback.mockCursorPosition_, SPECIAL_CURSOR_POSTION);
403     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
404 }
405 
406 /**
407  * @tc.name: JsThirdProviderInteractionOperationTest008
408  * @tc.desc: GetCursorPosition
409  * @tc.type: FUNC
410  */
411 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest008, TestSize.Level1)
412 {
413     auto ohAccessibilityProvider
414         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
415     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
416     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
417     auto context = NG::PipelineContext::GetCurrentContext();
418     jsAccessibilityManager->SetPipelineContext(context);
419     jsAccessibilityManager->Register(true);
420 
421     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
422         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
423     jsInteractionOperation->SetBelongTreeId(0);
424 
425     ArkUI_AccessibilityEventInfo event;
426 
427     event.SetEventType(ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ACCESSIBILITY_FOCUSED);
428     event.SetPageId(1);
429     int32_t requestFocusId = 0;
430     event.SetRequestFocusId(requestFocusId);
431     ArkUI_AccessibilityElementInfo elementInfo;
432     event.SetElementInfo(&elementInfo);
433     std::string textAnnouncedForAccessibility = "textAnnouncedForAccessibility";
434     event.SetTextAnnouncedForAccessibility(textAnnouncedForAccessibility);
435 
436     g_mockErrorCode = -1;
437 
__anon56a52ef40202(int32_t errorCode) 438     auto callback = [](int32_t errorCode) { g_mockErrorCode = errorCode; };
439 
440     // 1 send event  and callback receive 0
441     jsInteractionOperation->SendAccessibilityAsyncEvent(
442         event, callback);
443 
444     EXPECT_EQ(g_mockErrorCode, 0);
445 }
446 
447 /**
448  * @tc.name: JsThirdProviderInteractionOperationTest009
449  * @tc.desc: element info transform by host node's info
450  * @tc.type: FUNC
451  */
452 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest009, TestSize.Level1)
453 {
454     auto ohAccessibilityProvider
455         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
456     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
457     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
458     auto context = NG::PipelineContext::GetCurrentContext();
459     jsAccessibilityManager->SetPipelineContext(context);
460     jsAccessibilityManager->Register(true);
461 
462     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
463         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
464 
465     int32_t treeId = 0;
466     jsInteractionOperation->SetBelongTreeId(treeId);
467     int32_t pageId = 4;
468     frameNode->SetHostPageId(pageId);
469     int32_t windowId = 5;
470     context->SetRealHostWindowId(windowId);
471     std::string bundleName = "com.example.myapplication";
472     AceApplicationInfo::GetInstance().SetPackageName(bundleName);
473 
474     int64_t elementId = -1;
475     int32_t requestId = 2;
476     int32_t mode = 8; // search tree
477 
478     MockAccessibilityElementOperatorCallback operatorCallback;
479 
480     // 1 provider normal,callback should receive same request id and info's detail is transformed by host node's detail
481     ohAccessibilityProvider->providerMockResult_.Reset();
482     jsInteractionOperation->SearchElementInfoByAccessibilityId(
483         elementId, requestId,
484         operatorCallback, mode);
485     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
486     EXPECT_EQ(operatorCallback.mockInfos_.size(),
487         ohAccessibilityProvider->providerMockResult_.elementInfosList_.size());
488 
489     std::vector<Accessibility::AccessibilityElementInfo> mockInfosVector;
490     for (Accessibility::AccessibilityElementInfo &elementInfo : operatorCallback.mockInfos_) {
491         mockInfosVector.push_back(elementInfo);
492     }
493     for (int32_t i = 0; i < operatorCallback.mockInfos_.size(); i++) {
494         int64_t splitElementId = Accessibility::AccessibilityElementInfo::UNDEFINED_ACCESSIBILITY_ID;
495         int32_t splitTreeId = Accessibility::AccessibilityElementInfo::UNDEFINED_TREE_ID;
496 
497         Accessibility::AccessibilitySystemAbilityClient::GetTreeIdAndElementIdBySplitElementId(
498              mockInfosVector[i].GetAccessibilityId(), splitElementId, splitTreeId);
499         EXPECT_EQ(splitTreeId, treeId);
500         EXPECT_EQ(splitElementId,
501             ohAccessibilityProvider->providerMockResult_.elementInfosList_[i].GetElementId());
502         EXPECT_EQ(mockInfosVector[i].GetBelongTreeId(), treeId);
503         EXPECT_EQ(mockInfosVector[i].GetPageId(), pageId);
504         EXPECT_EQ(mockInfosVector[i].GetWindowId(), windowId);
505         EXPECT_EQ(mockInfosVector[i].GetParentWindowId(), windowId);
506         EXPECT_EQ(mockInfosVector[i].GetBundleName(), bundleName);
507     }
508 }
509 
510 /**
511  * @tc.name: JsThirdProviderInteractionOperationTest010
512  * @tc.desc: SendAccessibilityAsyncEventForThird
513  * @tc.type: FUNC
514  */
515 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest010, TestSize.Level1)
516 {
517     auto ohAccessibilityProvider
518         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
519     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
520     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
521     auto context = NG::PipelineContext::GetCurrentContext();
522     jsAccessibilityManager->SetPipelineContext(context);
523     jsAccessibilityManager->Register(true);
524 
525     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
526         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
527     jsInteractionOperation->SetBelongTreeId(0);
528 
529     int32_t ret = 0;
530 
531     int64_t thirdElementId = 1;
532     Accessibility::EventType eventType = Accessibility::EventType::TYPE_VIEW_ACCESSIBILITY_FOCUSED_EVENT;
533 
534     // 1 provider abnormal, return -1
535     ohAccessibilityProvider->SetInjectResult(-1);
536     ret = jsInteractionOperation->SendAccessibilityAsyncEventForThird(
537         thirdElementId, eventType);
538     EXPECT_EQ(ret, -1);
539     // 2 provider normal ; TBM check  send  client 's event is right
540     ohAccessibilityProvider->providerMockResult_.Reset();
541     ret = jsInteractionOperation->SendAccessibilityAsyncEventForThird(
542         thirdElementId, eventType);
543     EXPECT_EQ(ret, 0);
544 }
545 
546 /**
547  * @tc.name: JsThirdProviderInteractionOperationTest011
548  * @tc.desc: HandleEventByFramework ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_FOCUS_NODE_UPDATE
549  * @tc.type: FUNC
550  */
551 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest011, TestSize.Level1)
552 {
553     auto ohAccessibilityProvider
554         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
555     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
556     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
557     auto context = NG::PipelineContext::GetCurrentContext();
558     jsAccessibilityManager->SetPipelineContext(context);
559     jsAccessibilityManager->Register(true);
560 
561     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
562         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
563     jsInteractionOperation->SetBelongTreeId(0);
564 
565     ArkUI_AccessibilityEventInfo event;
566 
567     event.SetEventType(ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_FOCUS_NODE_UPDATE);
568     event.SetPageId(1);
569     int32_t requestFocusId = 0;
570     event.SetRequestFocusId(requestFocusId);
571     ArkUI_AccessibilityElementInfo elementInfo;
572     event.SetElementInfo(&elementInfo);
573     std::string textAnnouncedForAccessibility = "textAnnouncedForAccessibility";
574     event.SetTextAnnouncedForAccessibility(textAnnouncedForAccessibility);
575 
576     g_mockErrorCode = -1;
577 
__anon56a52ef40302(int32_t errorCode) 578     auto callback = [](int32_t errorCode) { g_mockErrorCode = errorCode; };
579 
580     // TBM check not send event to client
581     jsInteractionOperation->SendAccessibilityAsyncEvent(
582         event, callback);
583 
584     EXPECT_EQ(g_mockErrorCode, 0);
585 }
586 
587 /**
588  * @tc.name: FrameNodeAccessibilityVisible01
589  * @tc.desc: Test the function accessibilityVisible
590  * @tc.type: FUNC
591  */
592 HWTEST_F(JsThirdProviderInteractionOperationTest, FrameNodeAccessibilityVisible01, TestSize.Level1)
593 {
594     /**
595      * @tc.steps: step1. create frameNode.
596      */
597     auto frameNode = FrameNode::CreateFrameNode("page", 1, AceType::MakeRefPtr<PagePattern>(nullptr), true);
598     EXPECT_NE(frameNode->pattern_, nullptr);
599     frameNode->isActive_ = false;
600     auto pattern = frameNode->GetPattern<PagePattern>();
601     pattern->isOnShow_ = true;
602     auto pipeline = frameNode->GetContext();
603     auto overlayManager = pipeline->GetOverlayManager();
604 
605     /**
606      * @tc.steps: step2. Bind keyboard.
607      */
608     auto keyboardThd = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, 1, AceType::MakeRefPtr<Pattern>());
609     overlayManager->BindKeyboardWithNode(keyboardThd, frameNode->GetId());
610     overlayManager->UpdateCustomKeyboardPosition();
611     overlayManager->AvoidCustomKeyboard(1, 1.0);
612 
613     /**
614      * @tc.steps: step3. create childNode.
615      */
616     auto childNode = FrameNode::CreateFrameNode(
617     "child", ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<Pattern>());
618     auto nodeGeometry = frameNode->GetGeometryNode();
619     NG::RectF testRect = { 10.0f, nodeGeometry->GetFrameRect().Height() - 10.0f, 10.0f, 10.0f };
620     auto layoutProperty = AceType::MakeRefPtr<LayoutProperty>();
621     layoutProperty->SetLayoutRect(testRect);
622     childNode->SetLayoutProperty(layoutProperty);
623     frameNode->AddChild(childNode);
624 
625     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
626     auto context = NG::PipelineContext::GetCurrentContext();
627     jsAccessibilityManager->SetPipelineContext(context);
628     jsAccessibilityManager->Register(true);
629     RefPtr<NG::PipelineContext> ngPipeline;
630     ngPipeline = AceType::DynamicCast<NG::PipelineContext>(pipeline);
631     std::list<AccessibilityElementInfo> extensionElementInfos;
632     jsAccessibilityManager->SearchElementInfoByAccessibilityIdNG(
633         childNode->GetAccessibilityId(), 1, extensionElementInfos, ngPipeline, 1);
634     for (auto& extensionElementInfo : extensionElementInfos) {
635         if (childNode->GetAccessibilityId() == extensionElementInfo.GetAccessibilityId()) {
636             EXPECT_FALSE(childNode->GetAccessibilityVisible());
637         }
638     }
639 
640     /**
641      * @tc.steps: step4. close Keyboard.
642      */
643     overlayManager->CloseKeyboard(frameNode->GetId());
644 }
645 } // namespace OHOS::Ace::NG
646