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