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