7#include <fuchsia/ui/views/cpp/fidl.h>
8#include <lib/async-loop/cpp/loop.h>
9#include <lib/async-loop/default.h>
10#include <lib/async/cpp/executor.h>
11#include <lib/fidl/cpp/binding_set.h>
12#include <lib/fidl/cpp/interface_request.h>
13#include <lib/inspect/cpp/hierarchy.h>
14#include <lib/inspect/cpp/inspector.h>
15#include <lib/inspect/cpp/reader.h>
16#include <lib/sys/cpp/testing/service_directory_provider.h>
17#include <lib/zx/eventpair.h>
18#include <zircon/status.h>
19#include <zircon/types.h>
23#include "flutter/lib/ui/semantics/semantics_node.h"
24#include "gtest/gtest.h"
32void ExpectNodeHasRole(
33 const fuchsia::accessibility::semantics::Node& node,
34 const std::unordered_map<uint32_t, fuchsia::accessibility::semantics::Role>
36 ASSERT_TRUE(node.has_node_id());
37 ASSERT_NE(roles_by_node_id.find(node.node_id()), roles_by_node_id.end());
39 EXPECT_EQ(node.role(), roles_by_node_id.at(node.node_id()));
53 std::vector<std::pair<int32_t, flutter::SemanticsAction>>
actions;
62 : loop_(&kAsyncLoopConfigAttachToCurrentThread),
63 services_provider_(loop_.dispatcher()),
64 executor_(loop_.dispatcher()) {
65 services_provider_.AddService(
67 SemanticsManager::Name_);
77 executor_.schedule_task(
78 std::move(promise).and_then([&
done]() {
done =
true; }));
79 while (loop_.GetState() == ASYNC_LOOP_RUNNABLE) {
85 loop_.Run(zx::deadline_after(zx::duration::infinite()),
true);
93 fuchsia::accessibility::semantics::SemanticsManagerHandle semantics_manager;
94 zx_status_t semantics_status =
95 services_provider_.service_directory()
96 ->Connect<fuchsia::accessibility::semantics::SemanticsManager>(
97 semantics_manager.NewRequest());
98 if (semantics_status != ZX_OK) {
100 <<
"fuchsia::accessibility::semantics::SemanticsManager connection "
102 << zx_status_get_string(semantics_status);
106 inspector_ = std::make_unique<inspect::Inspector>();
108 set_semantics_enabled_callback = [
this](
bool enabled) {
112 dispatch_semantics_action_callback =
117 fuchsia::ui::views::ViewRefControl view_ref_control;
118 fuchsia::ui::views::ViewRef view_ref;
120 0u, &view_ref_control.reference, &view_ref.reference);
121 ASSERT_EQ(status, ZX_OK);
122 view_ref_control.reference.replace(
123 ZX_DEFAULT_EVENTPAIR_RIGHTS & (~ZX_RIGHT_DUPLICATE),
124 &view_ref_control.reference);
125 view_ref.reference.replace(ZX_RIGHTS_BASIC, &view_ref.reference);
127 std::make_unique<flutter_runner::AccessibilityBridge>(
128 std::move(set_semantics_enabled_callback),
129 std::move(dispatch_semantics_action_callback),
130 std::move(semantics_manager), std::move(view_ref),
131 inspector_->GetRoot().CreateChild(
"test_node"));
146 sys::testing::ServiceDirectoryProvider services_provider_;
148 async::Executor executor_;
152 EXPECT_TRUE(semantics_manager_.RegisterViewCalled());
156 EXPECT_FALSE(accessibility_delegate_.enabled());
157 std::unique_ptr<fuchsia::accessibility::semantics::SemanticListener> listener(
158 accessibility_bridge_.release());
159 listener->OnSemanticsModeChanged(
true,
nullptr);
164 accessibility_bridge_->RequestAnnounce(
"message");
167 auto& last_events = semantics_manager_.GetLastEvents();
168 ASSERT_EQ(last_events.size(), 1u);
169 ASSERT_TRUE(last_events[0].is_announce());
170 EXPECT_EQ(last_events[0].announce().
message(),
"message");
178 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
181 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
182 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
183 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
185 EXPECT_TRUE(fuchsia_node.attributes().is_keyboard_key());
196 updates.emplace(0, node0);
203 updates.emplace(1, node1);
210 updates.emplace(2, node2);
217 updates.emplace(3, node3);
224 updates.emplace(4, node4);
231 updates.emplace(5, node5);
240 updates.emplace(6, node6);
247 updates.emplace(7, node7);
254 updates.emplace(7, node8);
256 accessibility_bridge_->AddSemanticsNodeUpdate(std::move(updates), 1.f);
259 std::unordered_map<uint32_t, fuchsia::accessibility::semantics::Role>
261 {0u, fuchsia::accessibility::semantics::Role::BUTTON},
263 {2u, fuchsia::accessibility::semantics::Role::IMAGE},
264 {3u, fuchsia::accessibility::semantics::Role::TEXT_FIELD},
265 {4u, fuchsia::accessibility::semantics::Role::SLIDER},
266 {5u, fuchsia::accessibility::semantics::Role::LINK},
267 {6u, fuchsia::accessibility::semantics::Role::RADIO_BUTTON},
268 {7u, fuchsia::accessibility::semantics::Role::CHECK_BOX},
269 {8u, fuchsia::accessibility::semantics::Role::TOGGLE_SWITCH}};
271 EXPECT_EQ(0, semantics_manager_.DeleteCount());
272 EXPECT_EQ(1, semantics_manager_.UpdateCount());
273 EXPECT_EQ(1, semantics_manager_.CommitCount());
274 EXPECT_EQ(8u, semantics_manager_.LastUpdatedNodes().size());
275 for (
const auto& node : semantics_manager_.LastUpdatedNodes()) {
276 ExpectNodeHasRole(node, roles_by_node_id);
279 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
280 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
298 accessibility_bridge_->AddSemanticsNodeUpdate(
307 EXPECT_EQ(0, semantics_manager_.DeleteCount());
308 EXPECT_EQ(1, semantics_manager_.UpdateCount());
309 EXPECT_EQ(1, semantics_manager_.CommitCount());
310 EXPECT_EQ(3U, semantics_manager_.LastUpdatedNodes().size());
311 EXPECT_EQ(0
U, semantics_manager_.LastDeletedNodeIds().size());
312 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
313 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
318 accessibility_bridge_->AddSemanticsNodeUpdate(
325 EXPECT_EQ(1, semantics_manager_.DeleteCount());
326 EXPECT_EQ(2, semantics_manager_.UpdateCount());
327 EXPECT_EQ(2, semantics_manager_.CommitCount());
328 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
329 ASSERT_EQ(std::vector<uint32_t>({1, 2}),
330 semantics_manager_.LastDeletedNodeIds());
331 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
332 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
340 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
343 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
344 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
345 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
347 EXPECT_EQ(fuchsia_node.role(),
348 fuchsia::accessibility::semantics::Role::BUTTON);
356 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
359 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
360 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
361 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
363 EXPECT_EQ(fuchsia_node.role(),
364 fuchsia::accessibility::semantics::Role::IMAGE);
372 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
375 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
376 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
377 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
379 EXPECT_EQ(fuchsia_node.role(),
380 fuchsia::accessibility::semantics::Role::SLIDER);
388 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
391 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
392 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
393 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
395 EXPECT_EQ(fuchsia_node.role(),
407 node0.
value =
"value";
409 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
412 EXPECT_EQ(0, semantics_manager_.DeleteCount());
413 EXPECT_EQ(1, semantics_manager_.UpdateCount());
414 EXPECT_EQ(1, semantics_manager_.CommitCount());
415 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
416 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
417 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
419 const auto& states = fuchsia_node.states();
421 EXPECT_EQ(states.checked_state(),
422 fuchsia::accessibility::semantics::CheckedState::CHECKED);
424 EXPECT_FALSE(states.selected());
426 EXPECT_EQ(states.value(), node0.
value);
428 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
429 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
440 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
443 EXPECT_EQ(0, semantics_manager_.DeleteCount());
444 EXPECT_EQ(1, semantics_manager_.UpdateCount());
445 EXPECT_EQ(1, semantics_manager_.CommitCount());
446 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
447 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
448 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
450 const auto& states = fuchsia_node.states();
452 EXPECT_EQ(states.checked_state(),
453 fuchsia::accessibility::semantics::CheckedState::NONE);
457 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
458 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
467 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
470 EXPECT_EQ(0, semantics_manager_.DeleteCount());
471 EXPECT_EQ(1, semantics_manager_.UpdateCount());
472 EXPECT_EQ(1, semantics_manager_.CommitCount());
473 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
474 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
475 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
477 const auto& states = fuchsia_node.states();
479 EXPECT_EQ(states.toggled_state(),
480 fuchsia::accessibility::semantics::ToggledState::ON);
482 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
483 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
493 node0.
value =
"value";
495 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
498 EXPECT_EQ(0, semantics_manager_.DeleteCount());
499 EXPECT_EQ(1, semantics_manager_.UpdateCount());
500 EXPECT_EQ(1, semantics_manager_.CommitCount());
501 EXPECT_EQ(1U, semantics_manager_.LastUpdatedNodes().size());
502 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
503 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
505 const auto& states = fuchsia_node.states();
507 EXPECT_EQ(states.enabled_state(),
508 fuchsia::accessibility::semantics::EnabledState::ENABLED);
510 EXPECT_EQ(states.value(), node0.
value);
512 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
513 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
521 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.25f);
523 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
524 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
525 EXPECT_EQ(fuchsia_node.transform().matrix[0], 0.8f);
526 EXPECT_EQ(fuchsia_node.transform().matrix[5], 0.8f);
527 EXPECT_EQ(fuchsia_node.transform().matrix[10], 1.f);
541 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
544 EXPECT_EQ(0, semantics_manager_.DeleteCount());
545 EXPECT_EQ(1, semantics_manager_.UpdateCount());
546 EXPECT_EQ(1, semantics_manager_.CommitCount());
547 EXPECT_EQ(1u, semantics_manager_.LastUpdatedNodes().size());
548 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
549 EXPECT_EQ(fuchsia_node.node_id(),
static_cast<unsigned int>(node0.
id));
551 const auto& states = fuchsia_node.states();
553 EXPECT_EQ(states.checked_state(),
554 fuchsia::accessibility::semantics::CheckedState::NONE);
556 EXPECT_FALSE(states.selected());
557 EXPECT_FALSE(states.has_hidden());
559 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
560 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
572 accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}, 1.f);
575 EXPECT_EQ(0, semantics_manager_.DeleteCount());
576 EXPECT_EQ(1, semantics_manager_.UpdateCount());
577 EXPECT_EQ(1, semantics_manager_.CommitCount());
578 EXPECT_EQ(1u, semantics_manager_.LastUpdatedNodes().size());
579 const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
580 EXPECT_EQ(fuchsia_node.actions().size(), 5u);
581 EXPECT_EQ(fuchsia_node.actions().at(0u),
582 fuchsia::accessibility::semantics::Action::DEFAULT);
583 EXPECT_EQ(fuchsia_node.actions().at(1u),
584 fuchsia::accessibility::semantics::Action::SECONDARY);
585 EXPECT_EQ(fuchsia_node.actions().at(2u),
586 fuchsia::accessibility::semantics::Action::SHOW_ON_SCREEN);
587 EXPECT_EQ(fuchsia_node.actions().at(3u),
588 fuchsia::accessibility::semantics::Action::INCREMENT);
589 EXPECT_EQ(fuchsia_node.actions().at(4u),
590 fuchsia::accessibility::semantics::Action::DECREMENT);
604 std::string(fuchsia::accessibility::semantics::MAX_LABEL_SIZE + 1,
'2');
609 accessibility_bridge_->AddSemanticsNodeUpdate(
619 EXPECT_EQ(0, semantics_manager_.DeleteCount());
620 EXPECT_EQ(1, semantics_manager_.UpdateCount());
621 EXPECT_EQ(1, semantics_manager_.CommitCount());
622 EXPECT_EQ(3U, semantics_manager_.LastUpdatedNodes().size());
624 std::find_if(semantics_manager_.LastUpdatedNodes().begin(),
625 semantics_manager_.LastUpdatedNodes().end(),
626 [
id =
static_cast<uint32_t
>(bad_node.
id)](
627 fuchsia::accessibility::semantics::Node
const& node) {
628 return node.node_id() == id;
630 ASSERT_NE(trimmed_node, semantics_manager_.LastUpdatedNodes().end());
631 ASSERT_TRUE(trimmed_node->has_attributes());
633 trimmed_node->attributes().label(),
634 std::string(fuchsia::accessibility::semantics::MAX_LABEL_SIZE,
'2'));
635 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
636 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
650 std::string(fuchsia::accessibility::semantics::MAX_LABEL_SIZE + 1,
'2');
655 accessibility_bridge_->AddSemanticsNodeUpdate(
665 EXPECT_EQ(0, semantics_manager_.DeleteCount());
666 EXPECT_EQ(1, semantics_manager_.UpdateCount());
667 EXPECT_EQ(1, semantics_manager_.CommitCount());
668 EXPECT_EQ(3U, semantics_manager_.LastUpdatedNodes().size());
670 std::find_if(semantics_manager_.LastUpdatedNodes().begin(),
671 semantics_manager_.LastUpdatedNodes().end(),
672 [
id =
static_cast<uint32_t
>(bad_node.
id)](
673 fuchsia::accessibility::semantics::Node
const& node) {
674 return node.node_id() == id;
676 ASSERT_NE(trimmed_node, semantics_manager_.LastUpdatedNodes().end());
677 ASSERT_TRUE(trimmed_node->has_attributes());
679 trimmed_node->attributes().secondary_label(),
680 std::string(fuchsia::accessibility::semantics::MAX_LABEL_SIZE,
'2'));
681 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
682 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
696 std::string(fuchsia::accessibility::semantics::MAX_VALUE_SIZE + 1,
'2');
701 accessibility_bridge_->AddSemanticsNodeUpdate(
710 EXPECT_EQ(0, semantics_manager_.DeleteCount());
711 EXPECT_EQ(1, semantics_manager_.UpdateCount());
712 EXPECT_EQ(1, semantics_manager_.CommitCount());
713 EXPECT_EQ(3U, semantics_manager_.LastUpdatedNodes().size());
715 std::find_if(semantics_manager_.LastUpdatedNodes().begin(),
716 semantics_manager_.LastUpdatedNodes().end(),
717 [
id =
static_cast<uint32_t
>(bad_node.
id)](
718 fuchsia::accessibility::semantics::Node
const& node) {
719 return node.node_id() == id;
721 ASSERT_NE(trimmed_node, semantics_manager_.LastUpdatedNodes().end());
722 ASSERT_TRUE(trimmed_node->has_states());
724 trimmed_node->states().value(),
725 std::string(fuchsia::accessibility::semantics::MAX_VALUE_SIZE,
'2'));
726 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
727 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
738 std::string(fuchsia::accessibility::semantics::MAX_LABEL_SIZE,
'1');
751 std::string(fuchsia::accessibility::semantics::MAX_VALUE_SIZE,
'4');
758 accessibility_bridge_->AddSemanticsNodeUpdate(
770 EXPECT_EQ(0, semantics_manager_.DeleteCount());
771 EXPECT_EQ(2, semantics_manager_.UpdateCount());
772 EXPECT_EQ(1, semantics_manager_.CommitCount());
773 EXPECT_EQ(2U, semantics_manager_.LastUpdatedNodes().size());
774 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
775 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
784 accessibility_bridge_->AddSemanticsNodeUpdate(
791 EXPECT_EQ(0, semantics_manager_.DeleteCount());
792 EXPECT_EQ(1, semantics_manager_.UpdateCount());
793 EXPECT_EQ(1, semantics_manager_.CommitCount());
794 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
795 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
803 accessibility_bridge_->AddSemanticsNodeUpdate(
811 EXPECT_EQ(0, semantics_manager_.DeleteCount());
812 EXPECT_EQ(2, semantics_manager_.UpdateCount());
813 EXPECT_EQ(2, semantics_manager_.CommitCount());
814 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
815 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
825 const int32_t child_nodes = 100;
826 const int32_t leaf_nodes = 100;
827 for (int32_t
i = 1;
i < child_nodes + 1;
i++) {
832 for (int32_t j = 0; j < leaf_nodes; j++) {
834 int id = (
i * child_nodes) + ((j + 1) * leaf_nodes);
836 leaf_node.
label =
"A relatively simple label";
839 update.insert(std::make_pair(
id, std::move(leaf_node)));
841 update.insert(std::make_pair(
i, std::move(node)));
844 update.insert(std::make_pair(0, std::move(node0)));
849 semantics_manager_.SetShouldHoldCommitResponse(
true);
850 accessibility_bridge_->AddSemanticsNodeUpdate(
update, 1.f);
853 EXPECT_EQ(0, semantics_manager_.DeleteCount());
855 EXPECT_TRUE(6 <= semantics_manager_.UpdateCount() &&
856 semantics_manager_.UpdateCount() <= 12);
857 EXPECT_EQ(1, semantics_manager_.CommitCount());
858 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
859 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
861 int next_update_count = semantics_manager_.UpdateCount() + 1;
865 accessibility_bridge_->AddSemanticsNodeUpdate(
873 EXPECT_EQ(0, semantics_manager_.DeleteCount());
875 semantics_manager_.InvokeCommitCallback();
878 EXPECT_EQ(1, semantics_manager_.DeleteCount());
879 EXPECT_EQ(next_update_count, semantics_manager_.UpdateCount());
880 EXPECT_EQ(2, semantics_manager_.CommitCount());
881 EXPECT_FALSE(semantics_manager_.DeleteOverflowed());
882 EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
901 node2.
label =
"label";
919 accessibility_bridge_->AddSemanticsNodeUpdate(
930 uint32_t hit_node_id;
931 auto callback = [&hit_node_id](fuchsia::accessibility::semantics::Hit hit) {
933 hit_node_id = hit.node_id();
942 accessibility_bridge_->HitTest({1, 1},
callback);
943 EXPECT_EQ(hit_node_id, 0u);
944 accessibility_bridge_->HitTest({15, 15},
callback);
945 EXPECT_EQ(hit_node_id, 1u);
946 accessibility_bridge_->HitTest({30, 15},
callback);
947 EXPECT_EQ(hit_node_id, 2u);
948 accessibility_bridge_->HitTest({15, 30},
callback);
949 EXPECT_EQ(hit_node_id, 3u);
950 accessibility_bridge_->HitTest({30, 30},
callback);
951 EXPECT_EQ(hit_node_id, 4u);
969 accessibility_bridge_->AddSemanticsNodeUpdate(
980 uint32_t hit_node_id;
981 auto callback = [&hit_node_id](fuchsia::accessibility::semantics::Hit hit) {
983 hit_node_id = hit.node_id();
985 accessibility_bridge_->HitTest({15, 15},
callback);
986 EXPECT_EQ(hit_node_id, 0u);
1006 accessibility_bridge_->AddSemanticsNodeUpdate(
1015 uint32_t hit_node_id;
1016 auto callback = [&hit_node_id](fuchsia::accessibility::semantics::Hit hit) {
1018 hit_node_id = hit.node_id();
1021 accessibility_bridge_->HitTest({55, 55},
callback);
1022 EXPECT_EQ(hit_node_id, 2u);
1046 accessibility_bridge_->AddSemanticsNodeUpdate(
1055 uint32_t hit_node_id;
1056 auto callback = [&hit_node_id](fuchsia::accessibility::semantics::Hit hit) {
1058 hit_node_id = hit.node_id();
1061 accessibility_bridge_->HitTest({30, 15},
callback);
1062 EXPECT_EQ(hit_node_id, 2u);
1075 accessibility_bridge_->AddSemanticsNodeUpdate(
1083 auto handled_callback = [](
bool handled) {
EXPECT_TRUE(handled); };
1084 auto unhandled_callback = [](
bool handled) { EXPECT_FALSE(handled); };
1086 accessibility_bridge_->OnAccessibilityActionRequested(
1087 0u, fuchsia::accessibility::semantics::Action::DEFAULT, handled_callback);
1088 EXPECT_EQ(accessibility_delegate_.actions.size(), 1u);
1089 EXPECT_EQ(accessibility_delegate_.actions.back(),
1092 accessibility_bridge_->OnAccessibilityActionRequested(
1093 0u, fuchsia::accessibility::semantics::Action::SECONDARY,
1095 EXPECT_EQ(accessibility_delegate_.actions.size(), 2u);
1096 EXPECT_EQ(accessibility_delegate_.actions.back(),
1099 accessibility_bridge_->OnAccessibilityActionRequested(
1100 0u, fuchsia::accessibility::semantics::Action::SET_FOCUS,
1101 unhandled_callback);
1102 EXPECT_EQ(accessibility_delegate_.actions.size(), 2u);
1104 accessibility_bridge_->OnAccessibilityActionRequested(
1105 0u, fuchsia::accessibility::semantics::Action::SET_VALUE,
1106 unhandled_callback);
1107 EXPECT_EQ(accessibility_delegate_.actions.size(), 2u);
1109 accessibility_bridge_->OnAccessibilityActionRequested(
1110 0u, fuchsia::accessibility::semantics::Action::SHOW_ON_SCREEN,
1112 EXPECT_EQ(accessibility_delegate_.actions.size(), 3u);
1113 EXPECT_EQ(accessibility_delegate_.actions.back(),
1116 accessibility_bridge_->OnAccessibilityActionRequested(
1117 2u, fuchsia::accessibility::semantics::Action::DEFAULT,
1118 unhandled_callback);
1119 EXPECT_EQ(accessibility_delegate_.actions.size(), 3u);
1121 accessibility_bridge_->OnAccessibilityActionRequested(
1122 0u, fuchsia::accessibility::semantics::Action::INCREMENT,
1124 EXPECT_EQ(accessibility_delegate_.actions.size(), 4u);
1125 EXPECT_EQ(accessibility_delegate_.actions.back(),
1128 accessibility_bridge_->OnAccessibilityActionRequested(
1129 0u, fuchsia::accessibility::semantics::Action::DECREMENT,
1131 EXPECT_EQ(accessibility_delegate_.actions.size(), 5u);
1132 EXPECT_EQ(accessibility_delegate_.actions.back(),
1141 node0.
label =
"node0";
1142 node0.
hint =
"node0_hint";
1143 node0.
value =
"value";
1148 updates.emplace(0, node0);
1155 updates.emplace(1, node1);
1157 accessibility_bridge_->AddSemanticsNodeUpdate(std::move(updates), 1.f);
1160 fpromise::result<inspect::Hierarchy> hierarchy;
1161 ASSERT_FALSE(hierarchy.is_ok());
1162 RunPromiseToCompletion(
1163 inspect::ReadFromInspector(*inspector_)
1164 .then([&hierarchy](fpromise::result<inspect::Hierarchy>&
result) {
1165 hierarchy = std::move(
result);
1167 ASSERT_TRUE(hierarchy.is_ok());
1169 auto tree_inspect_hierarchy = hierarchy.value().GetByPath({
"test_node"});
1170 ASSERT_NE(tree_inspect_hierarchy,
nullptr);
1176 const auto&
root = tree_inspect_hierarchy->children();
1177 ASSERT_EQ(
root.size(), 1u);
1178 EXPECT_EQ(
root[0].
name(),
"semantic_tree_root");
1179 const auto& child =
root[0].children();
1180 ASSERT_EQ(child.size(), 1u);
1181 EXPECT_EQ(child[0].
name(),
"node_1");
static void done(const char *config, const char *src, const char *srcOptions, const char *name)
SkM44 & setTranslate(SkScalar x, SkScalar y, SkScalar z=0)
std::function< void(bool)> SetSemanticsEnabledCallback
std::function< void(int32_t, flutter::SemanticsAction)> DispatchSemanticsActionCallback
std::vector< std::pair< int32_t, flutter::SemanticsAction > > actions
void DispatchSemanticsAction(int32_t node_id, flutter::SemanticsAction action)
void SetSemanticsEnabled(bool enabled)
AccessibilityBridgeTestDelegate accessibility_delegate_
MockSemanticsManager semantics_manager_
std::unique_ptr< inspect::Inspector > inspector_
AccessibilityBridgeTest()
std::unique_ptr< flutter_runner::AccessibilityBridge > accessibility_bridge_
void RunPromiseToCompletion(fpromise::promise<> promise)
fidl::InterfaceRequestHandler< SemanticsManager > GetHandler(async_dispatcher_t *dispatcher)
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
#define FML_LOG(severity)
TEST_F(AccessibilityBridgeTest, RegistersViewRef)
@ kIsInMutuallyExclusiveGroup
std::unordered_map< int32_t, SemanticsNode > SemanticsNodeUpdates
DEF_SWITCHES_START aot vmservice shared library name
static constexpr const char HEADER[]
void setLTRB(float left, float top, float right, float bottom)
std::vector< int32_t > childrenInHitTestOrder
std::vector< int32_t > childrenInTraversalOrder
#define EXPECT_TRUE(handle)