未验证 提交 523c8c88 编写于 作者: A Alexander Brusher 提交者: GitHub

Adds a mechanism for announce events to be forwarded to a11y. (#23499)

上级 2707c21c
......@@ -111,6 +111,7 @@ template("runner_sources") {
"//flutter/lib/ui",
"//flutter/runtime",
"//flutter/shell/common",
"//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper",
]
flutter_deps = [
":fuchsia_gpu_configuration",
......
......@@ -431,6 +431,15 @@ fuchsia::accessibility::semantics::Node AccessibilityBridge::GetRootNodeUpdate(
return root_fuchsia_node;
}
void AccessibilityBridge::RequestAnnounce(const std::string message) {
fuchsia::accessibility::semantics::SemanticEvent semantic_event;
fuchsia::accessibility::semantics::AnnounceEvent announce_event;
announce_event.set_message(message);
semantic_event.set_announce(std::move(announce_event));
tree_ptr_->SendSemanticEvent(std::move(semantic_event), []() {});
}
void AccessibilityBridge::UpdateScreenRects() {
std::unordered_set<int32_t> visited_nodes;
UpdateScreenRects(kRootNodeId, SkM44{}, &visited_nodes);
......
......@@ -85,6 +85,9 @@ class AccessibilityBridge
void AddSemanticsNodeUpdate(const flutter::SemanticsNodeUpdates update,
float view_pixel_ratio);
// Requests a message announcement from the accessibility TTS system.
void RequestAnnounce(const std::string message);
// Notifies the bridge of a 'hover move' touch exploration event.
zx_status_t OnHoverMove(double x, double y);
......
......@@ -103,6 +103,16 @@ TEST_F(AccessibilityBridgeTest, EnableDisable) {
EXPECT_TRUE(accessibility_delegate_.enabled());
}
TEST_F(AccessibilityBridgeTest, RequestAnnounce) {
accessibility_bridge_->RequestAnnounce("message");
RunLoopUntilIdle();
auto& last_events = semantics_manager_.GetLastEvents();
ASSERT_EQ(last_events.size(), 1u);
ASSERT_TRUE(last_events[0].is_announce());
EXPECT_EQ(last_events[0].announce().message(), "message");
}
TEST_F(AccessibilityBridgeTest, UpdatesNodeRoles) {
flutter::SemanticsNodeUpdates updates;
......
......@@ -90,6 +90,18 @@ class MockSemanticsManager
commit_count_++;
}
void SendSemanticEvent(
fuchsia::accessibility::semantics::SemanticEvent semantic_event,
SendSemanticEventCallback callback) override {
last_events_.emplace_back(std::move(semantic_event));
callback();
}
std::vector<fuchsia::accessibility::semantics::SemanticEvent>&
GetLastEvents() {
return last_events_;
}
private:
bool has_view_ref_ = false;
fidl::BindingSet<SemanticsManager> bindings_;
......@@ -102,6 +114,7 @@ class MockSemanticsManager
bool delete_overflowed_;
std::vector<uint32_t> last_deleted_node_ids_;
int commit_count_;
std::vector<fuchsia::accessibility::semantics::SemanticEvent> last_events_;
};
} // namespace flutter_runner_test
......
......@@ -15,6 +15,8 @@
#include "flutter/fml/logging.h"
#include "flutter/lib/ui/window/pointer_data.h"
#include "flutter/lib/ui/window/window.h"
#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/encodable_value.h"
#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/standard_message_codec.h"
#include "third_party/rapidjson/include/rapidjson/document.h"
#include "third_party/rapidjson/include/rapidjson/stringbuffer.h"
#include "third_party/rapidjson/include/rapidjson/writer.h"
......@@ -658,6 +660,25 @@ void PlatformView::UpdateSemantics(
void PlatformView::HandleAccessibilityChannelPlatformMessage(
fml::RefPtr<flutter::PlatformMessage> message) {
FML_DCHECK(message->channel() == kAccessibilityChannel);
const flutter::StandardMessageCodec& standard_message_codec =
flutter::StandardMessageCodec::GetInstance(nullptr);
std::unique_ptr<flutter::EncodableValue> decoded =
standard_message_codec.DecodeMessage(message->data());
flutter::EncodableMap map = std::get<flutter::EncodableMap>(*decoded);
std::string type =
std::get<std::string>(map.at(flutter::EncodableValue("type")));
if (type == "announce") {
flutter::EncodableMap data_map = std::get<flutter::EncodableMap>(
map.at(flutter::EncodableValue("data")));
std::string text =
std::get<std::string>(data_map.at(flutter::EncodableValue("message")));
accessibility_bridge_->RequestAnnounce(text);
}
message->response()->CompleteEmpty();
}
// Channel handler for kFlutterPlatformChannel
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册