• 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 
SetSearchElementInfoBySpecificPropertyResult(const std::list<AccessibilityElementInfo> & infos,const std::list<AccessibilityElementInfo> & treeInfos,const int32_t requestId)96     void SetSearchElementInfoBySpecificPropertyResult(const std::list<AccessibilityElementInfo> &infos,
97         const std::list<AccessibilityElementInfo> &treeInfos, const int32_t requestId) override
98     {
99         mockInfos_ = infos;
100         mockRequestId = requestId;
101     }
102 
103     std::list<Accessibility::AccessibilityElementInfo> mockInfos_;
104     Accessibility::AccessibilityElementInfo mockInfo_;
105     int32_t mockRequestId = 0;
106     bool mockSucceeded_ = false;
107     int32_t mockCursorPosition_ = 0;
108 };
109 } // namespace OHOS::Ace
110 
111 namespace OHOS::Ace::NG {
112 namespace {
113     const int32_t IGNORE_POSITION_TRANSITION_SWITCH = -990;
114 } // namespace
115 
116 class JsThirdProviderInteractionOperationTest : public testing::Test {
117 public:
118     static void SetUpTestCase();
119     static void TearDownTestCase();
120 };
121 
SetUpTestCase()122 void JsThirdProviderInteractionOperationTest::SetUpTestCase()
123 {
124     MockPipelineContext::SetUp();
125     MockContainer::SetUp();
126     MockContainer::Current()->taskExecutor_ = AceType::MakeRefPtr<MockTaskExecutor>();
127     MockContainer::Current()->pipelineContext_ = MockPipelineContext::GetCurrentContext();
128     MockContainer::Current()->pipelineContext_->taskExecutor_ = MockContainer::Current()->taskExecutor_;
129     auto context = NG::PipelineContext::GetCurrentContext();
130     context->instanceId_ = IGNORE_POSITION_TRANSITION_SWITCH;
131 }
132 
TearDownTestCase()133 void JsThirdProviderInteractionOperationTest::TearDownTestCase()
134 {
135     MockPipelineContext::TearDown();
136     MockContainer::TearDown();
137 }
138 
139 /**
140  * @tc.name: JsThirdProviderInteractionOperationTest001
141  * @tc.desc: ClearFocusFromProvider
142  * @tc.type: FUNC
143  */
144 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest001, TestSize.Level1)
145 {
146     auto ohAccessibilityProvider
147         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
148 
149     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
150     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
151     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
152         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
153 
154     auto ret =jsInteractionOperation->ClearFocusFromProvider();
155     jsInteractionOperation->ClearFocus();
156     EXPECT_EQ(ret, true);
157     EXPECT_EQ(ohAccessibilityProvider->providerMockResult_.receiveClear_, true);
158 }
159 
160 /**
161  * @tc.name: JsThirdProviderInteractionOperationTest002
162  * @tc.desc: SearchElementInfoByAccessibilityId
163  * @tc.type: FUNC
164  */
165 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest002, 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 = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
176         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
177     jsInteractionOperation->SetBelongTreeId(0);
178 
179     int64_t elementId = -1;
180     int32_t requestId = 2;
181     int32_t mode = 8; // search tree
182     MockAccessibilityElementOperatorCallback operatorCallback;
183 
184     // 1 provider abnormal, callback should receive same request id and empty infos
185     ohAccessibilityProvider->SetInjectResult(-1);
186     jsInteractionOperation->SearchElementInfoByAccessibilityId(
187         elementId, requestId,
188         operatorCallback, mode);
189 
190     EXPECT_EQ(operatorCallback.mockInfos_.size(), 0);
191     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
192 
193     // 2 provider normal,callback should receive same request id and same infos as provider
194     ohAccessibilityProvider->providerMockResult_.Reset();
195     jsInteractionOperation->SearchElementInfoByAccessibilityId(
196         elementId, requestId,
197         operatorCallback, mode);
198     EXPECT_EQ(operatorCallback.mockInfos_.size(),
199         ohAccessibilityProvider->providerMockResult_.elementInfosList_.size());
200     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
201 }
202 
203 /**
204  * @tc.name: JsThirdProviderInteractionOperationTest003
205  * @tc.desc: earchElementInfosByText
206  * @tc.type: FUNC
207  */
208 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest003, TestSize.Level1)
209 {
210     auto ohAccessibilityProvider
211         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
212     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
213     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
214     auto context = NG::PipelineContext::GetCurrentContext();
215     jsAccessibilityManager->SetPipelineContext(context);
216     jsAccessibilityManager->Register(true);
217 
218     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
219         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
220     jsInteractionOperation->SetBelongTreeId(0);
221 
222     int64_t elementId = -1;
223     int32_t requestId = 2;
224     std::string& text = TEST_CONTENT_STR;
225     MockAccessibilityElementOperatorCallback operatorCallback;
226 
227     // 1 provider abnormal, callback should receive same request id and empty infos
228     ohAccessibilityProvider->SetInjectResult(-1);
229     jsInteractionOperation->SearchElementInfosByText(
230         elementId, text, requestId, operatorCallback);
231 
232     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
233 
234     // 2 provider normal,callback should receive same request id and same infos as provider
235     ohAccessibilityProvider->providerMockResult_.Reset();
236     jsInteractionOperation->SearchElementInfosByText(
237         elementId, text, requestId, operatorCallback);
238     EXPECT_EQ(operatorCallback.mockInfos_.size(),
239         ohAccessibilityProvider->providerMockResult_.elementInfosList_.size());
240     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
241 }
242 
243 /**
244  * @tc.name: JsThirdProviderInteractionOperationTest004
245  * @tc.desc: FindFocusedElementInfo
246  * @tc.type: FUNC
247  */
248 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest004, TestSize.Level1)
249 {
250     auto ohAccessibilityProvider
251         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
252     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
253     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
254     auto context = NG::PipelineContext::GetCurrentContext();
255     jsAccessibilityManager->SetPipelineContext(context);
256     jsAccessibilityManager->Register(true);
257 
258     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
259         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
260     jsInteractionOperation->SetBelongTreeId(0);
261 
262     int64_t elementId = -1;
263     int32_t requestId = 2;
264     int32_t focusType = 3;
265     MockAccessibilityElementOperatorCallback operatorCallback;
266 
267     // 1 provider abnormal, callback should receive same request id and empty info
268     ohAccessibilityProvider->SetInjectResult(-1);
269     jsInteractionOperation->FindFocusedElementInfo(
270         elementId, focusType, requestId, operatorCallback);
271 
272     EXPECT_EQ(operatorCallback.mockInfo_.GetAccessibilityId(), -1);
273     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
274 
275     // 2 provider normal,callback should receive same request id and same info as provider
276     ohAccessibilityProvider->providerMockResult_.Reset();
277     jsInteractionOperation->FindFocusedElementInfo(
278         elementId, focusType, requestId, operatorCallback);
279     EXPECT_EQ(operatorCallback.mockInfo_.GetAccessibilityId(),
280         ohAccessibilityProvider->providerMockResult_.focusElementInfo_.GetElementId());
281     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
282 }
283 
284 /**
285  * @tc.name: JsThirdProviderInteractionOperationTest005
286  * @tc.desc: FocusMoveSearch
287  * @tc.type: FUNC
288  */
289 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest005, TestSize.Level1)
290 {
291     auto ohAccessibilityProvider
292         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
293     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
294     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
295     auto context = NG::PipelineContext::GetCurrentContext();
296     jsAccessibilityManager->SetPipelineContext(context);
297     jsAccessibilityManager->Register(true);
298 
299     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
300         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
301     jsInteractionOperation->SetBelongTreeId(0);
302 
303     int64_t elementId = -1;
304     int32_t requestId = 2;
305     int32_t direction = 3;
306     MockAccessibilityElementOperatorCallback operatorCallback;
307 
308     // 1 provider abnormal, callback should receive same request id and info of host
309     ohAccessibilityProvider->SetInjectResult(-1);
310     jsInteractionOperation->FocusMoveSearch(
311         elementId, direction, requestId, operatorCallback);
312     EXPECT_EQ(operatorCallback.mockInfo_.GetAccessibilityId(), frameNode->GetAccessibilityId());
313     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
314 
315     // 2 provider normal,callback should receive same request id and same info as provider
316     ohAccessibilityProvider->providerMockResult_.Reset();
317     jsInteractionOperation->FocusMoveSearch(
318         elementId, direction, requestId, operatorCallback);
319     EXPECT_EQ(operatorCallback.mockInfo_.GetAccessibilityId(),
320         ohAccessibilityProvider->providerMockResult_.nextFocusElementInfo_.GetElementId());
321     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
322 }
323 
324 /**
325  * @tc.name: JsThirdProviderInteractionOperationTest006
326  * @tc.desc: ExecuteAction
327  * @tc.type: FUNC
328  */
329 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest006, TestSize.Level1)
330 {
331     auto ohAccessibilityProvider
332         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
333     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
334     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
335     auto context = NG::PipelineContext::GetCurrentContext();
336     jsAccessibilityManager->SetPipelineContext(context);
337     jsAccessibilityManager->Register(true);
338 
339     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
340         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
341     jsInteractionOperation->SetBelongTreeId(0);
342     int64_t elementId = 0;
343     int32_t requestId = 2;
344     int32_t action = -1;
345     std::map<std::string, std::string> actionArguments =
346         ohAccessibilityProvider->providerMockResult_.originActionArguments_;
347 
348     MockAccessibilityElementOperatorCallback operatorCallback;
349 
350     // 1 FindAccessibilityNode abnormal, callback should receive same request id and false
351     ohAccessibilityProvider->SetInjectResult(-1);
352     operatorCallback.mockSucceeded_ = true;
353     jsInteractionOperation->ExecuteAction(
354         elementId, action, actionArguments, requestId, operatorCallback);
355     EXPECT_EQ(operatorCallback.mockSucceeded_, false);
356     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
357 
358     // 2 ExecuteAccessibilityAction abnormal, callback should receive same request id and false
359     ohAccessibilityProvider->providerMockResult_.Reset();
360     ohAccessibilityProvider->SetInjectActionResult(-1);
361     operatorCallback.mockSucceeded_ = true;
362     jsInteractionOperation->ExecuteAction(
363         elementId, action, actionArguments, requestId, operatorCallback);
364     EXPECT_EQ(operatorCallback.mockSucceeded_, false);
365     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
366 
367     // 3 ExecuteAccessibilityAction normal, callback should receive same request id and true
368     ohAccessibilityProvider->providerMockResult_.Reset();
369     jsInteractionOperation->ExecuteAction(
370         elementId, action, actionArguments, requestId, operatorCallback);
371     EXPECT_EQ(operatorCallback.mockSucceeded_, true);
372     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
373 }
374 
375 /**
376  * @tc.name: JsThirdProviderInteractionOperationTest007
377  * @tc.desc: GetCursorPosition
378  * @tc.type: FUNC
379  */
380 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest007, TestSize.Level1)
381 {
382     auto ohAccessibilityProvider
383         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
384     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
385     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
386     auto context = NG::PipelineContext::GetCurrentContext();
387     jsAccessibilityManager->SetPipelineContext(context);
388     jsAccessibilityManager->Register(true);
389 
390     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
391         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
392     jsInteractionOperation->SetBelongTreeId(0);
393 
394     int64_t elementId = -1;
395     int32_t requestId = 2;
396     MockAccessibilityElementOperatorCallback operatorCallback;
397 
398     // 1 provider abnormal, callback should receive same request id and CursorPosition default
399     ohAccessibilityProvider->SetInjectResult(-1);
400     jsInteractionOperation->GetCursorPosition(
401         elementId, requestId, operatorCallback);
402     EXPECT_EQ(operatorCallback.mockCursorPosition_, -1);
403     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
404 
405     // 2 provider normal,callback should receive same request id and same CursorPosition as provider
406     ohAccessibilityProvider->providerMockResult_.Reset();
407     jsInteractionOperation->GetCursorPosition(
408         elementId, requestId, operatorCallback);
409     EXPECT_EQ(operatorCallback.mockCursorPosition_, SPECIAL_CURSOR_POSTION);
410     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
411 }
412 
413 /**
414  * @tc.name: JsThirdProviderInteractionOperationTest008
415  * @tc.desc: GetCursorPosition
416  * @tc.type: FUNC
417  */
418 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest008, TestSize.Level1)
419 {
420     auto ohAccessibilityProvider
421         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
422     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
423     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
424     auto context = NG::PipelineContext::GetCurrentContext();
425     jsAccessibilityManager->SetPipelineContext(context);
426     jsAccessibilityManager->Register(true);
427 
428     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
429         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
430     jsInteractionOperation->SetBelongTreeId(0);
431 
432     ArkUI_AccessibilityEventInfo event;
433 
434     event.SetEventType(ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ACCESSIBILITY_FOCUSED);
435     event.SetPageId(1);
436     int32_t requestFocusId = 0;
437     event.SetRequestFocusId(requestFocusId);
438     ArkUI_AccessibilityElementInfo elementInfo;
439     event.SetElementInfo(&elementInfo);
440     std::string textAnnouncedForAccessibility = "textAnnouncedForAccessibility";
441     event.SetTextAnnouncedForAccessibility(textAnnouncedForAccessibility);
442 
443     g_mockErrorCode = -1;
444 
__anon3a5707160202(int32_t errorCode) 445     auto callback = [](int32_t errorCode) { g_mockErrorCode = errorCode; };
446 
447     // 1 send event  and callback receive 0
448     jsInteractionOperation->SendAccessibilityAsyncEvent(
449         event, callback);
450 
451     EXPECT_EQ(g_mockErrorCode, 0);
452 }
453 
454 /**
455  * @tc.name: JsThirdProviderInteractionOperationTest009
456  * @tc.desc: element info transform by host node's info
457  * @tc.type: FUNC
458  */
459 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest009, TestSize.Level1)
460 {
461     auto ohAccessibilityProvider
462         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
463     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
464     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
465     auto context = NG::PipelineContext::GetCurrentContext();
466     jsAccessibilityManager->SetPipelineContext(context);
467     jsAccessibilityManager->Register(true);
468 
469     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
470         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
471 
472     int32_t treeId = 0;
473     jsInteractionOperation->SetBelongTreeId(treeId);
474     int32_t pageId = 4;
475     frameNode->SetHostPageId(pageId);
476     int32_t windowId = 5;
477     context->SetRealHostWindowId(windowId);
478     std::string bundleName = "com.example.myapplication";
479     AceApplicationInfo::GetInstance().SetPackageName(bundleName);
480 
481     int64_t elementId = -1;
482     int32_t requestId = 2;
483     int32_t mode = 8; // search tree
484 
485     MockAccessibilityElementOperatorCallback operatorCallback;
486 
487     // 1 provider normal,callback should receive same request id and info's detail is transformed by host node's detail
488     ohAccessibilityProvider->providerMockResult_.Reset();
489     jsInteractionOperation->SearchElementInfoByAccessibilityId(
490         elementId, requestId,
491         operatorCallback, mode);
492     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
493     EXPECT_EQ(operatorCallback.mockInfos_.size(),
494         ohAccessibilityProvider->providerMockResult_.elementInfosList_.size());
495 
496     std::vector<Accessibility::AccessibilityElementInfo> mockInfosVector;
497     for (Accessibility::AccessibilityElementInfo &elementInfo : operatorCallback.mockInfos_) {
498         mockInfosVector.push_back(elementInfo);
499     }
500     for (int32_t i = 0; i < operatorCallback.mockInfos_.size(); i++) {
501         int64_t splitElementId = Accessibility::AccessibilityElementInfo::UNDEFINED_ACCESSIBILITY_ID;
502         int32_t splitTreeId = Accessibility::AccessibilityElementInfo::UNDEFINED_TREE_ID;
503 
504         Accessibility::AccessibilitySystemAbilityClient::GetTreeIdAndElementIdBySplitElementId(
505              mockInfosVector[i].GetAccessibilityId(), splitElementId, splitTreeId);
506         EXPECT_EQ(splitTreeId, treeId);
507         EXPECT_EQ(splitElementId,
508             ohAccessibilityProvider->providerMockResult_.elementInfosList_[i].GetElementId());
509         EXPECT_EQ(mockInfosVector[i].GetBelongTreeId(), treeId);
510         EXPECT_EQ(mockInfosVector[i].GetPageId(), pageId);
511         EXPECT_EQ(mockInfosVector[i].GetWindowId(), windowId);
512         EXPECT_EQ(mockInfosVector[i].GetParentWindowId(), windowId);
513         EXPECT_EQ(mockInfosVector[i].GetBundleName(), bundleName);
514     }
515 }
516 
517 /**
518  * @tc.name: JsThirdProviderInteractionOperationTest010
519  * @tc.desc: SendAccessibilityAsyncEventForThird
520  * @tc.type: FUNC
521  */
522 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest010, TestSize.Level1)
523 {
524     auto ohAccessibilityProvider
525         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
526     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
527     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
528     auto context = NG::PipelineContext::GetCurrentContext();
529     jsAccessibilityManager->SetPipelineContext(context);
530     jsAccessibilityManager->Register(true);
531 
532     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
533         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
534     jsInteractionOperation->SetBelongTreeId(0);
535 
536     int32_t ret = 0;
537 
538     int64_t thirdElementId = 1;
539     Accessibility::EventType eventType = Accessibility::EventType::TYPE_VIEW_ACCESSIBILITY_FOCUSED_EVENT;
540 
541     // 1 provider abnormal, return -1
542     ohAccessibilityProvider->SetInjectResult(-1);
543     ret = jsInteractionOperation->SendAccessibilityAsyncEventForThird(
544         thirdElementId, eventType);
545     EXPECT_EQ(ret, -1);
546     // 2 provider normal ; TBM check  send  client 's event is right
547     ohAccessibilityProvider->providerMockResult_.Reset();
548     ret = jsInteractionOperation->SendAccessibilityAsyncEventForThird(
549         thirdElementId, eventType);
550     EXPECT_EQ(ret, 0);
551 }
552 
553 /**
554  * @tc.name: JsThirdProviderInteractionOperationTest011
555  * @tc.desc: HandleEventByFramework ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_FOCUS_NODE_UPDATE
556  * @tc.type: FUNC
557  */
558 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest011, TestSize.Level1)
559 {
560     auto ohAccessibilityProvider
561         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
562     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
563     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
564     auto context = NG::PipelineContext::GetCurrentContext();
565     jsAccessibilityManager->SetPipelineContext(context);
566     jsAccessibilityManager->Register(true);
567 
568     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
569         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
570     jsInteractionOperation->SetBelongTreeId(0);
571 
572     ArkUI_AccessibilityEventInfo event;
573 
574     event.SetEventType(ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_FOCUS_NODE_UPDATE);
575     event.SetPageId(1);
576     int32_t requestFocusId = 0;
577     event.SetRequestFocusId(requestFocusId);
578     ArkUI_AccessibilityElementInfo elementInfo;
579     event.SetElementInfo(&elementInfo);
580     std::string textAnnouncedForAccessibility = "textAnnouncedForAccessibility";
581     event.SetTextAnnouncedForAccessibility(textAnnouncedForAccessibility);
582 
583     g_mockErrorCode = -1;
584 
__anon3a5707160302(int32_t errorCode) 585     auto callback = [](int32_t errorCode) { g_mockErrorCode = errorCode; };
586 
587     // TBM check not send event to client
588     jsInteractionOperation->SendAccessibilityAsyncEvent(
589         event, callback);
590 
591     EXPECT_EQ(g_mockErrorCode, 0);
592 }
593 
594 /**
595  * @tc.name: SearchElementInfoBySpecificProperty001
596  * @tc.desc: SearchElementInfoBySpecificProperty
597  * @tc.type: FUNC
598  */
599 HWTEST_F(JsThirdProviderInteractionOperationTest, SearchElementInfoBySpecificProperty001, TestSize.Level1)
600 {
601     auto ohAccessibilityProvider
602         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
603     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
604     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
605     auto context = NG::PipelineContext::GetCurrentContext();
606     jsAccessibilityManager->SetPipelineContext(context);
607     jsAccessibilityManager->Register(true);
608 
609     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
610         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
611     jsInteractionOperation->SetBelongTreeId(0);
612 
613     int64_t elementId = -1;
614     int32_t requestId = 2;
615     int32_t mode = 8; // search tree
616     SpecificPropertyParam param;
617     MockAccessibilityElementOperatorCallback operatorCallback;
618 
619     // 1 provider abnormal, callback should receive same request id and empty infos
620     ohAccessibilityProvider->SetInjectResult(-1);
621     jsInteractionOperation->SearchElementInfoBySpecificProperty(elementId, param, requestId, operatorCallback);
622 
623     EXPECT_EQ(operatorCallback.mockInfos_.size(), 0);
624     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
625 }
626 
627 /**
628  * @tc.name: FrameNodeAccessibilityVisible01
629  * @tc.desc: Test the function accessibilityVisible
630  * @tc.type: FUNC
631  */
632 HWTEST_F(JsThirdProviderInteractionOperationTest, FrameNodeAccessibilityVisible01, TestSize.Level1)
633 {
634     /**
635      * @tc.steps: step1. create frameNode.
636      */
637     auto frameNode = FrameNode::CreateFrameNode("page", 1, AceType::MakeRefPtr<PagePattern>(nullptr), true);
638     EXPECT_NE(frameNode->pattern_, nullptr);
639     frameNode->isActive_ = false;
640     auto pattern = frameNode->GetPattern<PagePattern>();
641     pattern->isOnShow_ = true;
642     auto pipeline = frameNode->GetContext();
643     auto overlayManager = pipeline->GetOverlayManager();
644 
645     /**
646      * @tc.steps: step2. Bind keyboard.
647      */
648     auto keyboardThd = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, 1, AceType::MakeRefPtr<Pattern>());
649     overlayManager->BindKeyboardWithNode(keyboardThd, frameNode->GetId());
650     overlayManager->UpdateCustomKeyboardPosition();
651     overlayManager->AvoidCustomKeyboard(1, 1.0);
652 
653     /**
654      * @tc.steps: step3. create childNode.
655      */
656     auto childNode = FrameNode::CreateFrameNode(
657     "child", ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<Pattern>());
658     auto nodeGeometry = frameNode->GetGeometryNode();
659     NG::RectF testRect = { 10.0f, nodeGeometry->GetFrameRect().Height() - 10.0f, 10.0f, 10.0f };
660     auto layoutProperty = AceType::MakeRefPtr<LayoutProperty>();
661     layoutProperty->SetLayoutRect(testRect);
662     childNode->SetLayoutProperty(layoutProperty);
663     frameNode->AddChild(childNode);
664 
665     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
666     auto context = NG::PipelineContext::GetCurrentContext();
667     jsAccessibilityManager->SetPipelineContext(context);
668     jsAccessibilityManager->Register(true);
669     RefPtr<NG::PipelineContext> ngPipeline;
670     ngPipeline = AceType::DynamicCast<NG::PipelineContext>(pipeline);
671     std::list<AccessibilityElementInfo> extensionElementInfos;
672     jsAccessibilityManager->SearchElementInfoByAccessibilityIdNG(
673         childNode->GetAccessibilityId(), 1, extensionElementInfos, ngPipeline, 1);
674     for (auto& extensionElementInfo : extensionElementInfos) {
675         if (childNode->GetAccessibilityId() == extensionElementInfo.GetAccessibilityId()) {
676             EXPECT_FALSE(childNode->GetAccessibilityVisible());
677         }
678     }
679 
680     /**
681      * @tc.steps: step4. close Keyboard.
682      */
683     overlayManager->CloseKeyboard(frameNode->GetId());
684 }
685 
686 /**
687  * @tc.name: GetNodeConfig01
688  * @tc.desc: Test the function GetNodeConfig
689  * @tc.type: FUNC
690  */
691 HWTEST_F(JsThirdProviderInteractionOperationTest, GetNodeConfig01, TestSize.Level1)
692 {
693     /**
694     * @tc.steps: step1. create jsInteractionOperation.
695     */
696     auto ohAccessibilityProvider
697         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
698     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
699     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
700     auto context = NG::PipelineContext::GetCurrentContext();
701     jsAccessibilityManager->SetPipelineContext(context);
702     jsAccessibilityManager->Register(true);
703     frameNode->SetHostPageId(10);
704     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
705         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
706 
707     /**
708      * @tc.steps: step2. test func .
709      */
710     Framework::NodeConfig config;
711     jsInteractionOperation->GetNodeConfig(config);
712     EXPECT_EQ(config.pageId, 10);
713 }
714 
715 /**
716  * @tc.name: JsThirdProviderInteractionOperationTest012
717  * @tc.desc: ExecuteAction
718  * @tc.type: FUNC
719  */
720 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest012, TestSize.Level1)
721 {
722     auto ohAccessibilityProvider
723         = AceType::MakeRefPtr<MockOhAccessibilityProvider>();
724     auto frameNode = FrameNode::CreateFrameNode("framenode", 1, AceType::MakeRefPtr<Pattern>(), true);
725     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
726     auto context = NG::PipelineContext::GetCurrentContext();
727     jsAccessibilityManager->SetPipelineContext(context);
728     jsAccessibilityManager->Register(true);
729 
730     auto jsInteractionOperation = AceType::MakeRefPtr<Framework::JsThirdProviderInteractionOperation>(
731         ohAccessibilityProvider, jsAccessibilityManager, frameNode);
732     jsInteractionOperation->SetBelongTreeId(0);
733     int64_t elementId = 0;
734     int32_t requestId = 2;
735     int32_t action = static_cast<int32_t>(ActionType::ACCESSIBILITY_ACTION_CLICK);
736     std::map<std::string, std::string> actionArguments =
737         ohAccessibilityProvider->providerMockResult_.originActionArguments_;
738     std::string hmacTest = "test";
739     uint64_t timeTest = 123456;
740     MockAccessibilityElementOperatorCallback operatorCallback;
741 
742     // 3 ExecuteAccessibilityAction normal, callback should receive same request id and true
743     ohAccessibilityProvider->providerMockResult_.Reset();
744     jsInteractionOperation->ExecuteAction(
745         elementId, action, actionArguments, requestId, operatorCallback);
746     EXPECT_EQ(operatorCallback.mockSucceeded_, true);
747     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
748 
749     auto& resultActionArguments = ohAccessibilityProvider->providerMockResult_.resultActionArguments_;
750 
751     auto it = resultActionArguments.find(ACTION_ARGU_CLICK_ENHANCE_DATA);
752     ASSERT_FALSE(it != resultActionArguments.end());
753     it = resultActionArguments.find(ACTION_ARGU_CLICK_TIMESTAMP);
754     ASSERT_FALSE(it != resultActionArguments.end());
755 
756     // 3 ExecuteAccessibilityAction normal, callback should receive same request id and true
757     actionArguments[ACTION_ARGU_CLICK_ENHANCE_DATA] = hmacTest;
758     actionArguments[ACTION_ARGU_CLICK_TIMESTAMP] = std::to_string(timeTest);
759     actionArguments["testNotFiltered"] = "testNotFiltered";
760     ohAccessibilityProvider->providerMockResult_.Reset();
761     jsInteractionOperation->ExecuteAction(
762         elementId, action, actionArguments, requestId, operatorCallback);
763     EXPECT_EQ(operatorCallback.mockSucceeded_, true);
764     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
765 
766     // click filter security click arguments
767     it = resultActionArguments.find(ACTION_ARGU_CLICK_ENHANCE_DATA);
768     ASSERT_FALSE(it != resultActionArguments.end());
769     it = resultActionArguments.find(ACTION_ARGU_CLICK_TIMESTAMP);
770     ASSERT_FALSE(it != resultActionArguments.end());
771     it = resultActionArguments.find("testNotFiltered");
772     ASSERT_TRUE(it != resultActionArguments.end());
773 }
774 
775 /**
776  * @tc.name: JsThirdProviderInteractionOperationTest013
777  * @tc.desc: SearchElementInfoByAccessibilityId
778  * @tc.type: FUNC
779  */
780 HWTEST_F(JsThirdProviderInteractionOperationTest, JsThirdProviderInteractionOperationTest013, TestSize.Level1)
781 {
782     /**
783     * @tc.steps: step1. create jsAccessibilityManager.
784     */
785     auto jsAccessibilityManager = AceType::MakeRefPtr<Framework::JsAccessibilityManager>();
786     auto context = NG::PipelineContext::GetCurrentContext();
787     jsAccessibilityManager->SetPipelineContext(context);
788     jsAccessibilityManager->Register(true);
789 
790     int64_t elementId = -1;
791     int32_t requestId = 2;
792     int32_t mode = 8; // search tree
793     int32_t windowId = 1;
794     jsAccessibilityManager->SetWindowId(windowId);
795 
796     MockAccessibilityElementOperatorCallback operatorCallback;
797 
798     jsAccessibilityManager->SearchElementInfoByAccessibilityId(
799         elementId, requestId,
800         operatorCallback, mode, windowId);
801 
802     EXPECT_EQ(operatorCallback.mockInfos_.size(), 1);
803     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
804 
805     jsAccessibilityManager->SearchElementInfoByAccessibilityId(
806         elementId, requestId,
807         operatorCallback, mode, 2);
808     EXPECT_EQ(operatorCallback.mockRequestId, requestId);
809 }
810 } // namespace OHOS::Ace::NG
811