Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Updates in flutter/content_handler for the shell refactor (Patch 3). #4831

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions content_handler/flutter_runner/BUILD.gn
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

source_set("flutter_runner") {
sources = [
"accessibility_bridge.cc",
"accessibility_bridge.h",
"application.cc",
"application.h",
"application_runner.cc",
"application_runner.h",
"compositor_context.cc",
"compositor_context.h",
"engine.cc",
"engine.h",
"fuchsia_font_manager.cc",
"fuchsia_font_manager.h",
"isolate_configurator.cc",
"isolate_configurator.h",
"main.cc",
"platform_view.cc",
"platform_view.h",
"session_connection.cc",
"session_connection.h",
"surface.cc",
"surface.h",
"task_observers.cc",
"task_observers.h",
"unique_fdio_ns.h",
"vulkan_surface.cc",
"vulkan_surface.h",
"vulkan_surface_pool.cc",
"vulkan_surface_pool.h",
"vulkan_surface_producer.cc",
"vulkan_surface_producer.h",
]

deps = [
"$flutter_root/fml",
"$flutter_root/shell/common",
"$flutter_root/shell/gpu",
"$flutter_root/third_party/txt",
"$flutter_root/vulkan",
"//garnet/public/lib/app/cpp",
"//garnet/public/lib/fsl",
"//garnet/public/lib/ui/input/fidl",
"//garnet/public/lib/ui/views/fidl",
"//peridot/public/lib/clipboard/fidl",
"//peridot/public/lib/context/fidl",
"//third_party/skia",
"//third_party/skia:gpu",
"//third_party/zlib:minizip",
"//zircon/public/lib/trace-provider",
]
}
4 changes: 4 additions & 0 deletions content_handler/flutter_runner/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Flutter Application Runner
==========================

Implements the `app::ApplicationRunner` FIDL interface to launch and run mutliple Flutter applications within the same process.
81 changes: 81 additions & 0 deletions content_handler/flutter_runner/accessibility_bridge.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "accessibility_bridge.h"

#include <unordered_set>

#include "lib/app/cpp/application_context.h"
#include "lib/context/fidl/context_writer.fidl.h"
#include "third_party/rapidjson/rapidjson/document.h"
#include "third_party/rapidjson/rapidjson/stringbuffer.h"
#include "third_party/rapidjson/rapidjson/writer.h"

namespace flutter {

AccessibilityBridge::AccessibilityBridge(maxwell::ContextWriterPtr writer)
: writer_(std::move(writer)) {}

AccessibilityBridge::~AccessibilityBridge() = default;

void AccessibilityBridge::UpdateSemantics(
const blink::SemanticsNodeUpdates& update) {
for (const auto& update : update) {
const auto& node = update.second;
semantics_nodes_[node.id] = node;
}
std::vector<int> visited_nodes;
UpdateVisitedForNodeAndChildren(0, &visited_nodes);
EraseUnvisitedNodes(visited_nodes);

// The data sent to the Context Service is a JSON formatted list of labels
// for all on screen widgets.
rapidjson::Document nodes_json(rapidjson::kArrayType);
for (const int node_index : visited_nodes) {
const auto& node = semantics_nodes_[node_index];
if (!node.label.empty()) {
rapidjson::Value value;
value.SetString(node.label.data(), node.label.size());
nodes_json.PushBack(value, nodes_json.GetAllocator());
}
}

if (nodes_json.Size() > 0) {
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
nodes_json.Accept(writer);
writer_->WriteEntityTopic("/inferred/accessibility_text",
buffer.GetString());
}
}

void AccessibilityBridge::UpdateVisitedForNodeAndChildren(
const int id,
std::vector<int>* visited_nodes) {
std::map<int, blink::SemanticsNode>::const_iterator it =
semantics_nodes_.find(id);
if (it == semantics_nodes_.end()) {
return;
}

visited_nodes->push_back(id);
for (const int child : it->second.children) {
UpdateVisitedForNodeAndChildren(child, visited_nodes);
}
}

void AccessibilityBridge::EraseUnvisitedNodes(
const std::vector<int>& visited_nodes) {
const std::unordered_set<int> visited_nodes_lookup(visited_nodes.begin(),
visited_nodes.end());
for (auto it = semantics_nodes_.begin(); it != semantics_nodes_.end();) {
if (visited_nodes_lookup.find((*it).first) == visited_nodes_lookup.end()) {
it = semantics_nodes_.erase(it);
} else {
++it;
}
}
}

} // namespace flutter
43 changes: 43 additions & 0 deletions content_handler/flutter_runner/accessibility_bridge.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include <map>

#include "flutter/lib/ui/semantics/semantics_node.h"
#include "lib/context/fidl/context_writer.fidl.h"
#include "lib/fxl/macros.h"

namespace flutter {

// Maintain an up-to-date list of SemanticsNodes on screen, and communicate
// with the Context Service.
class AccessibilityBridge final {
public:
AccessibilityBridge(maxwell::ContextWriterPtr writer);

~AccessibilityBridge();

// Update the internal representation of the semantics nodes, and write the
// semantics to Context Service.
void UpdateSemantics(const blink::SemanticsNodeUpdates& update);

private:
maxwell::ContextWriterPtr writer_;
std::map<int, blink::SemanticsNode> semantics_nodes_;

// Walk the semantics node tree starting at |id|, and store the id of each
// visited child in |visited_nodes|.
void UpdateVisitedForNodeAndChildren(const int id,
std::vector<int>* visited_nodes);

// Remove any node from |semantics_nodes_| that doesn't have an id in
// |visited_nodes|.
void EraseUnvisitedNodes(const std::vector<int>& visited_nodes);

FXL_DISALLOW_COPY_AND_ASSIGN(AccessibilityBridge);
};

} // namespace flutter
Loading