Commit e7efdd73 authored by Mike West's avatar Mike West Committed by Commit Bot

Revert "Reland "[Fuchsia] Send Chrome a11y updates to Fuchsia SemanticsManager""

This reverts commit 845f18e1.

Reason for revert: 

Both `AccessibilityBridgeTest.CorrectDataSent and AccessibilityBridgeTest.DataSentWithBatching are flakily timing out.
See https://ci.chromium.org/p/chromium/builders/ci/Fuchsia%20x64 starting around 44416 (e.g. https://ci.chromium.org/p/chromium/builders/ci/Fuchsia%20x64/44418).

Original change's description:
> Reland "[Fuchsia] Send Chrome a11y updates to Fuchsia SemanticsManager"
> 
> This is a reland of fc5589ac
> 
> A BUILD.gn dep has been added back, which was causing linker failures.
> 
> Control flow in AccessibilityBridgeBrowsertests has been updated so
> tests are no longer failing.
> 
> Original change's description:
> > [Fuchsia] Send Chrome a11y updates to Fuchsia SemanticsManager
> >
> > This change adds functionality to the Accessibility Bridge:
> > * Listens for change in AccessibilityMode from Fuchsia
> > * Gets the semantic tree from Chrome accessibility and sends it to the
> > SemanticsManager
> > * Sends live updates when nodes are added, updated or removed
> >
> > To send updates, this change includes the following:
> > * Creates a ViewRefPair and registers it with the SemanticsManager
> > * Initialize an AccessibilityBridge
> > * Listen for changes in the Chrome Accessibility tree, serializes them
> > to Fuchsia data structures and sends that data to the Fuchsia
> > SemanticsManager
> >
> > Testing: Added AccessibilityBridge browsertests.
> >
> > Bug: 973095
> > Change-Id: I89658288b846b6b9ce84a04e49434ec266b84dfc
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1787171
> > Commit-Queue: Sharon Yang <yangsharon@chromium.org>
> > Reviewed-by: Kevin Marshall <kmarshall@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#714588}
> 
> Bug: 973095
> Change-Id: Ie6eeb74146682838efaefb0e1051d3e9442f0d86
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1913569
> Reviewed-by: Kevin Marshall <kmarshall@chromium.org>
> Commit-Queue: Kevin Marshall <kmarshall@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#715126}

TBR=dtseng@chromium.org,kmarshall@chromium.org,yangsharon@chromium.org

Change-Id: Ib78d563cbbf468aaf03f1e6f00f616dc03b758a7
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 973095, 1024745
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1916120Reviewed-by: default avatarMike West <mkwst@chromium.org>
Commit-Queue: Mike West <mkwst@chromium.org>
Cr-Commit-Position: refs/heads/master@{#715212}
parent d2a8ed84
......@@ -11,7 +11,6 @@
"zero"
],
"services": [
"fuchsia.accessibility.semantics.SemanticsManager",
"fuchsia.device.NameProvider",
"fuchsia.deprecatedtimezone.Timezone",
"fuchsia.fonts.Provider",
......
......@@ -97,7 +97,6 @@ component("web_engine_core") {
"//third_party/fuchsia-sdk/sdk:ui_gfx",
"//third_party/fuchsia-sdk/sdk:web",
"//third_party/widevine/cdm:headers",
"//ui/accessibility",
"//ui/aura",
"//ui/base",
"//ui/base/ime",
......@@ -224,15 +223,10 @@ fuchsia_package_runner("web_engine_runner") {
source_set("browsertest_core") {
testonly = true
sources = [
"test/test_data.cc",
"test/test_data.h",
"test/web_engine_browser_test.cc",
"test/web_engine_browser_test.h",
"test/web_engine_test_launcher.cc",
]
data = [
"test/data",
]
deps = [
":web_engine_core",
"//content/public/browser",
......@@ -246,13 +240,15 @@ source_set("browsertest_core") {
test("web_engine_browsertests") {
sources = [
"browser/accessibility_bridge_browsertest.cc",
"browser/content_directory_browsertest.cc",
"browser/context_impl_browsertest.cc",
"browser/frame_impl_browsertest.cc",
"browser/media_browsertest.cc",
]
defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
data = [
"test/data",
]
deps = [
":browsertest_core",
":switches",
......@@ -264,7 +260,6 @@ test("web_engine_browsertests") {
"//net:test_support",
"//testing/gmock",
"//testing/gtest",
"//third_party/fuchsia-sdk/sdk:accessibility_semantics",
"//third_party/fuchsia-sdk/sdk:scenic_cpp",
"//ui/ozone",
]
......@@ -272,6 +267,7 @@ test("web_engine_browsertests") {
test("web_engine_unittests") {
sources = [
"browser/accessibility_bridge_unittest.cc",
"browser/ax_tree_converter_unittest.cc",
"browser/cookie_manager_impl_unittest.cc",
"browser/frame_impl_unittest.cc",
......
......@@ -4,116 +4,18 @@
#include "fuchsia/engine/browser/accessibility_bridge.h"
#include <lib/sys/cpp/component_context.h>
#include <lib/ui/scenic/cpp/view_ref_pair.h>
#include <sys/types.h>
#include "base/fuchsia/fuchsia_logging.h"
#include "base/logging.h"
#include "fuchsia/engine/browser/ax_tree_converter.h"
using fuchsia::accessibility::semantics::SemanticTree;
namespace {
constexpr uint32_t kSemanticNodeRootId = 0;
// TODO(https://crbug.com/973095): Update this value based on average and
// maximum sizes of serialized Semantic Nodes.
constexpr size_t kMaxNodesPerUpdate = 16;
// Template function to handle batching and sending of FIDL messages when
// updating or deleting nodes.
template <typename T>
void SendBatches(std::vector<T> pending_items,
base::RepeatingCallback<void(std::vector<T>)> callback) {
std::vector<T> nodes_to_send;
for (size_t i = 0; i < pending_items.size(); i++) {
nodes_to_send.push_back(std::move(pending_items.at(i)));
if (nodes_to_send.size() == kMaxNodesPerUpdate) {
callback.Run(std::move(nodes_to_send));
nodes_to_send.clear();
}
}
if (!nodes_to_send.empty()) {
callback.Run(std::move(nodes_to_send));
}
}
} // namespace
AccessibilityBridge::AccessibilityBridge(
fuchsia::accessibility::semantics::SemanticsManagerPtr semantics_manager,
fuchsia::ui::views::ViewRef view_ref,
content::WebContents* web_contents)
: binding_(this), web_contents_(web_contents) {
DCHECK(web_contents_);
Observe(web_contents_);
tree_.AddObserver(this);
fuchsia::ui::views::ViewRef view_ref)
: binding_(this) {
semantics_manager->RegisterViewForSemantics(
std::move(view_ref), binding_.NewBinding(), tree_ptr_.NewRequest());
tree_ptr_.set_error_handler([](zx_status_t status) {
ZX_LOG_IF(ERROR, status != ZX_ERR_PEER_CLOSED, status)
<< "Semantic Tree disconnected.";
});
}
AccessibilityBridge::~AccessibilityBridge() = default;
void AccessibilityBridge::TryCommit() {
if (commit_inflight_ || (to_send_.empty() && to_delete_.empty()))
return;
if (!to_send_.empty()) {
SendBatches<fuchsia::accessibility::semantics::Node>(
std::move(to_send_),
base::BindRepeating(
[](SemanticTree* tree,
std::vector<fuchsia::accessibility::semantics::Node> nodes) {
tree->UpdateSemanticNodes(std::move(nodes));
},
base::Unretained(tree_ptr_.get())));
}
if (!to_delete_.empty()) {
SendBatches<uint32_t>(
std::move(to_delete_),
base::BindRepeating(
[](SemanticTree* tree, std::vector<uint32_t> nodes) {
tree->DeleteSemanticNodes(std::move(nodes));
},
base::Unretained(tree_ptr_.get())));
}
tree_ptr_->CommitUpdates(
fit::bind_member(this, &AccessibilityBridge::OnCommitComplete));
commit_inflight_ = true;
}
void AccessibilityBridge::OnCommitComplete() {
commit_inflight_ = false;
}
uint32_t AccessibilityBridge::ConvertToFuchsiaNodeId(int32_t ax_node_id) {
if (ax_node_id == root_id_) {
// On the Fuchsia side, the root node is indicated by id
// |kSemanticNodeRootId|, which is 0.
return kSemanticNodeRootId;
} else {
// AXNode ids are signed, Semantic Node ids are unsigned.
return bit_cast<uint32_t>(ax_node_id);
}
}
void AccessibilityBridge::AccessibilityEventReceived(
const content::AXEventNotificationDetails& details) {
for (const ui::AXTreeUpdate& update : details.updates) {
tree_.Unserialize(update);
}
}
void AccessibilityBridge::OnAccessibilityActionRequested(
uint32_t node_id,
fuchsia::accessibility::semantics::Action action,
......@@ -129,45 +31,5 @@ void AccessibilityBridge::HitTest(fuchsia::math::PointF local_point,
void AccessibilityBridge::OnSemanticsModeChanged(
bool updates_enabled,
OnSemanticsModeChangedCallback callback) {
if (updates_enabled) {
// The first call to AccessibilityEventReceived after this call will be the
// entire semantic tree.
web_contents_->EnableWebContentsOnlyAccessibilityMode();
} else {
// The SemanticsManager will clear all state in this case, which is mirrored
// here.
to_send_.clear();
to_delete_.clear();
commit_inflight_ = false;
}
// Notify the SemanticsManager that SemanticsMode has been updated.
callback();
}
void AccessibilityBridge::OnNodeWillBeDeleted(ui::AXTree* tree,
ui::AXNode* node) {
to_delete_.push_back(ConvertToFuchsiaNodeId(node->id()));
TryCommit();
}
void AccessibilityBridge::OnAtomicUpdateFinished(
ui::AXTree* tree,
bool root_changed,
const std::vector<ui::AXTreeObserver::Change>& changes) {
root_id_ = tree_.root()->id();
for (const ui::AXTreeObserver::Change& change : changes) {
// Reparent changes aren't included here because they consist of a delete
// and create change, which are already being handled.
if (change.type == ui::AXTreeObserver::NODE_CREATED ||
change.type == ui::AXTreeObserver::SUBTREE_CREATED ||
change.type == ui::AXTreeObserver::NODE_CHANGED) {
ui::AXNodeData ax_data = change.node->data();
if (change.node->id() == root_id_) {
ax_data.id = kSemanticNodeRootId;
}
to_send_.push_back(AXNodeDataToSemanticNode(ax_data));
}
}
TryCommit();
NOTIMPLEMENTED();
}
......@@ -10,19 +10,8 @@
#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include "base/callback.h"
#include "base/macros.h"
#include "content/public/browser/ax_event_notification_details.h"
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_contents_observer.h"
#include "fuchsia/engine/web_engine_export.h"
#include "ui/accessibility/ax_serializable_tree.h"
#include "ui/accessibility/ax_tree_id.h"
#include "ui/accessibility/ax_tree_observer.h"
namespace content {
class WebContents;
} // namespace content
// This class is the intermediate for accessibility between Chrome and Fuchsia.
// It handles registration to the Fuchsia Semantics Manager, translating events
......@@ -32,38 +21,14 @@ class WebContents;
// View created by FrameImpl. This class refers to the View via the
// caller-supplied ViewRef.
class WEB_ENGINE_EXPORT AccessibilityBridge
: public content::WebContentsObserver,
public fuchsia::accessibility::semantics::SemanticListener,
public ui::AXTreeObserver {
: public fuchsia::accessibility::semantics::SemanticListener {
public:
// |web_contents| is required to exist for the duration of |this|.
AccessibilityBridge(
fuchsia::accessibility::semantics::SemanticsManagerPtr semantics_manager,
fuchsia::ui::views::ViewRef view_ref,
content::WebContents* web_contents);
fuchsia::ui::views::ViewRef view_ref);
~AccessibilityBridge() final;
void set_semantic_tree_for_test(
fidl::InterfaceRequest<fuchsia::accessibility::semantics::SemanticTree>
tree_request);
private:
FRIEND_TEST_ALL_PREFIXES(AccessibilityBridgeTest, OnSemanticsModeChanged);
// Handles batching of semantic nodes and committing them to the SemanticTree.
void TryCommit();
// Callback for SemanticTree::CommitUpdates.
void OnCommitComplete();
// Converts AXNode ids to Semantic Node ids, and handles special casing of the
// root.
uint32_t ConvertToFuchsiaNodeId(int32_t ax_node_id);
// content::WebContentsObserver implementation.
void AccessibilityEventReceived(
const content::AXEventNotificationDetails& details) override;
// fuchsia::accessibility::semantics::SemanticListener implementation.
void OnAccessibilityActionRequested(
uint32_t node_id,
......@@ -74,24 +39,8 @@ class WEB_ENGINE_EXPORT AccessibilityBridge
void OnSemanticsModeChanged(bool updates_enabled,
OnSemanticsModeChangedCallback callback) final;
// ui::AXTreeObserver implementation.
void OnNodeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override;
void OnAtomicUpdateFinished(
ui::AXTree* tree,
bool root_changed,
const std::vector<ui::AXTreeObserver::Change>& changes) override;
fuchsia::accessibility::semantics::SemanticTreePtr tree_ptr_;
fidl::Binding<fuchsia::accessibility::semantics::SemanticListener> binding_;
content::WebContents* web_contents_;
ui::AXSerializableTree tree_;
std::vector<fuchsia::accessibility::semantics::Node> to_send_;
std::vector<uint32_t> to_delete_;
bool commit_inflight_ = false;
// The root id of |tree_|.
int32_t root_id_ = 0;
DISALLOW_COPY_AND_ASSIGN(AccessibilityBridge);
};
......
// Copyright 2019 The Chromium 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 <fuchsia/accessibility/semantics/cpp/fidl.h>
#include <fuchsia/accessibility/semantics/cpp/fidl_test_base.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/ui/scenic/cpp/view_token_pair.h>
#include <zircon/types.h>
#include "base/fuchsia/default_context.h"
#include "base/fuchsia/scoped_service_binding.h"
#include "base/fuchsia/service_directory_client.h"
#include "base/logging.h"
#include "base/test/bind_test_util.h"
#include "content/public/browser/web_contents_observer.h"
#include "fuchsia/base/frame_test_util.h"
#include "fuchsia/base/result_receiver.h"
#include "fuchsia/base/test_navigation_listener.h"
#include "fuchsia/engine/browser/accessibility_bridge.h"
#include "fuchsia/engine/browser/frame_impl.h"
#include "fuchsia/engine/test/test_data.h"
#include "fuchsia/engine/test/web_engine_browser_test.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gtest/include/gtest/gtest.h"
using fuchsia::accessibility::semantics::Node;
using fuchsia::accessibility::semantics::SemanticListener;
using fuchsia::accessibility::semantics::SemanticsManager;
using fuchsia::accessibility::semantics::SemanticTree;
namespace {
const char kPage1Path[] = "/ax1.html";
const char kPage2Path[] = "/batching.html";
const char kPage1Title[] = "accessibility 1";
const char kPage2Title[] = "lots of nodes!";
const char kButtonName[] = "a button";
const char kNodeName[] = "last node";
const char kParagraphName[] = "a paragraph";
const size_t kPage1NodeCount = 3;
const size_t kPage2NodeCount = 50;
class FakeSemanticTree
: public fuchsia::accessibility::semantics::testing::SemanticTree_TestBase {
public:
FakeSemanticTree() = default;
~FakeSemanticTree() override = default;
// fuchsia::accessibility::semantics::SemanticTree implementation.
void UpdateSemanticNodes(std::vector<Node> nodes) final {
for (auto& node : nodes) {
nodes_.push_back(std::move(node));
}
}
void DeleteSemanticNodes(std::vector<uint32_t> node_ids) final {
for (auto id : node_ids) {
for (uint i = 0; i < nodes_.size(); i++) {
if (nodes_.at(i).node_id() == id) {
nodes_.erase(nodes_.begin() + i);
}
}
}
}
void CommitUpdates(CommitUpdatesCallback callback) final {
if (on_commit_updates_) {
std::move(on_commit_updates_).Run();
}
callback();
}
void NotImplemented_(const std::string& name) final {
NOTIMPLEMENTED() << name;
}
void RunUntilNodeCountAtLeast(size_t count) {
DCHECK(!on_commit_updates_);
// Spin the RunLoop until the expected conditions are met.
while (nodes_.size() < count) {
base::RunLoop run_loop;
on_commit_updates_ = base::BindLambdaForTesting(
[this, count, quit = run_loop.QuitClosure()]() {
if (nodes_.size() >= count) {
quit.Run();
}
});
run_loop.Run();
}
}
bool HasNodeWithLabel(base::StringPiece name) {
for (auto& node : nodes_) {
if (node.has_attributes() && node.attributes().has_label() &&
node.attributes().label() == name) {
return true;
}
}
return false;
}
private:
std::vector<Node> nodes_;
base::OnceClosure on_commit_updates_;
DISALLOW_COPY_AND_ASSIGN(FakeSemanticTree);
};
class FakeSemanticsManager : public fuchsia::accessibility::semantics::testing::
SemanticsManager_TestBase {
public:
FakeSemanticsManager() : semantic_tree_binding_(&semantic_tree_) {}
~FakeSemanticsManager() override = default;
bool is_view_registered() const { return view_ref_.reference.is_valid(); }
bool is_listener_valid() const { return static_cast<bool>(listener_); }
FakeSemanticTree* semantic_tree() { return &semantic_tree_; }
// Directly call the listener to simulate Fuchsia setting the semantics mode.
void SetSemanticsMode(bool is_enabled) {
listener_->OnSemanticsModeChanged(is_enabled, []() {});
}
// fuchsia::accessibility::semantics::SemanticsManager implementation.
void RegisterViewForSemantics(
fuchsia::ui::views::ViewRef view_ref,
fidl::InterfaceHandle<SemanticListener> listener,
fidl::InterfaceRequest<SemanticTree> semantic_tree_request) final {
view_ref_ = std::move(view_ref);
listener_ = listener.Bind();
semantic_tree_binding_.Bind(std::move(semantic_tree_request));
}
void NotImplemented_(const std::string& name) final {
NOTIMPLEMENTED() << name;
}
private:
fuchsia::ui::views::ViewRef view_ref_;
fuchsia::accessibility::semantics::SemanticListenerPtr listener_;
FakeSemanticTree semantic_tree_;
fidl::Binding<SemanticTree> semantic_tree_binding_;
DISALLOW_COPY_AND_ASSIGN(FakeSemanticsManager);
};
} // namespace
class AccessibilityBridgeTest : public cr_fuchsia::WebEngineBrowserTest {
public:
AccessibilityBridgeTest() : semantics_manager_binding_(&semantics_manager_) {
cr_fuchsia::WebEngineBrowserTest::set_test_server_root(
base::FilePath(cr_fuchsia::kTestServerRoot));
}
~AccessibilityBridgeTest() override = default;
void SetUpOnMainThread() override {
fuchsia::accessibility::semantics::SemanticsManagerPtr
semantics_manager_ptr;
semantics_manager_binding_.Bind(semantics_manager_ptr.NewRequest());
frame_ptr_ =
cr_fuchsia::WebEngineBrowserTest::CreateFrame(&navigation_listener_);
frame_impl_ = context_impl()->GetFrameImplForTest(&frame_ptr_);
frame_impl_->set_semantics_manager_for_test(
std::move(semantics_manager_ptr));
// Call CreateView to trigger creation of accessibility bridge.
auto view_tokens = scenic::NewViewTokenPair();
frame_ptr_->CreateView(std::move(view_tokens.first));
base::RunLoop().RunUntilIdle();
}
protected:
fuchsia::web::FramePtr frame_ptr_;
FrameImpl* frame_impl_;
FakeSemanticsManager semantics_manager_;
fidl::Binding<SemanticsManager> semantics_manager_binding_;
cr_fuchsia::TestNavigationListener navigation_listener_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityBridgeTest);
};
// Test registration to the SemanticsManager and accessibility mode on
// WebContents is set correctly.
IN_PROC_BROWSER_TEST_F(AccessibilityBridgeTest, RegisterViewRef) {
// Check that setup is successful.
EXPECT_TRUE(semantics_manager_.is_view_registered());
EXPECT_TRUE(semantics_manager_.is_listener_valid());
// Change the accessibility mode on the Fuchsia side and check that it is
// propagated correctly.
EXPECT_FALSE(frame_impl_->web_contents_for_test()
->IsWebContentsOnlyAccessibilityModeForTesting());
semantics_manager_.SetSemanticsMode(true);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(frame_impl_->web_contents_for_test()
->IsWebContentsOnlyAccessibilityModeForTesting());
}
IN_PROC_BROWSER_TEST_F(AccessibilityBridgeTest, CorrectDataSent) {
fuchsia::web::NavigationControllerPtr controller;
frame_ptr_->GetNavigationController(controller.NewRequest());
ASSERT_TRUE(embedded_test_server()->Start());
GURL title1(embedded_test_server()->GetURL(kPage1Path));
semantics_manager_.SetSemanticsMode(true);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
controller.get(), fuchsia::web::LoadUrlParams(), title1.spec()));
navigation_listener_.RunUntilUrlAndTitleEquals(title1, kPage1Title);
// Check that the data values are correct in the FakeSemanticTree.
// TODO(fxb/18796): Test more fields once Chrome to Fuchsia conversions are
// available.
semantics_manager_.semantic_tree()->RunUntilNodeCountAtLeast(kPage1NodeCount);
EXPECT_TRUE(
semantics_manager_.semantic_tree()->HasNodeWithLabel(kPage1Title));
EXPECT_TRUE(
semantics_manager_.semantic_tree()->HasNodeWithLabel(kButtonName));
EXPECT_TRUE(
semantics_manager_.semantic_tree()->HasNodeWithLabel(kParagraphName));
}
// Batching is performed when the number of nodes to send or delete exceeds the
// maximum, as set on the Fuchsia side. Check that all nodes are received by the
// Semantic Tree when batching is performed.
IN_PROC_BROWSER_TEST_F(AccessibilityBridgeTest, DataSentWithBatching) {
fuchsia::web::NavigationControllerPtr controller;
frame_ptr_->GetNavigationController(controller.NewRequest());
ASSERT_TRUE(embedded_test_server()->Start());
GURL title2(embedded_test_server()->GetURL(kPage2Path));
semantics_manager_.SetSemanticsMode(true);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
controller.get(), fuchsia::web::LoadUrlParams(), title2.spec()));
navigation_listener_.RunUntilUrlAndTitleEquals(title2, kPage2Title);
// Run until we expect more than a batch's worth of nodes to be present.
semantics_manager_.semantic_tree()->RunUntilNodeCountAtLeast(kPage2NodeCount);
EXPECT_TRUE(semantics_manager_.semantic_tree()->HasNodeWithLabel(kNodeName));
}
// Copyright 2019 The Chromium 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 "fuchsia/engine/browser/accessibility_bridge.h"
#include <fuchsia/accessibility/semantics/cpp/fidl.h>
#include <fuchsia/accessibility/semantics/cpp/fidl_test_base.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/ui/scenic/cpp/view_ref_pair.h>
#include <zircon/types.h>
#include "base/fuchsia/default_context.h"
#include "base/fuchsia/scoped_service_binding.h"
#include "base/fuchsia/service_directory_client.h"
#include "base/logging.h"
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
using fuchsia::accessibility::semantics::SemanticListener;
using fuchsia::accessibility::semantics::SemanticsManager;
namespace {
class FakeSemanticsManager : public fuchsia::accessibility::semantics::testing::
SemanticsManager_TestBase {
public:
explicit FakeSemanticsManager() = default;
~FakeSemanticsManager() override = default;
// fuchsia::accessibility::semantics::SemanticsManager implementation.
void RegisterViewForSemantics(
fuchsia::ui::views::ViewRef view_ref,
fidl::InterfaceHandle<SemanticListener> listener,
fidl::InterfaceRequest<fuchsia::accessibility::semantics::SemanticTree>
semantic_tree) final {
view_ref_ = std::move(view_ref);
listener_ = std::move(listener);
semantic_tree_ = std::move(semantic_tree);
}
bool is_view_registered() const { return view_ref_.reference.is_valid(); }
bool is_listener_handle_valid() const { return listener_.is_valid(); }
bool is_semantic_tree_handle_valid() const {
return semantic_tree_.is_valid();
}
void NotImplemented_(const std::string& name) final {
NOTIMPLEMENTED() << name;
}
private:
fuchsia::ui::views::ViewRef view_ref_;
fidl::InterfaceHandle<SemanticListener> listener_;
fidl::InterfaceRequest<fuchsia::accessibility::semantics::SemanticTree>
semantic_tree_;
DISALLOW_COPY_AND_ASSIGN(FakeSemanticsManager);
};
} // namespace
class AccessibilityBridgeTest : public testing::Test {
public:
AccessibilityBridgeTest()
: task_environment_(base::test::TaskEnvironment::MainThreadType::IO),
semantics_manager_binding_(&semantics_manager_) {}
~AccessibilityBridgeTest() override = default;
void CreateAccessibilityBridge() {
auto view_ref_pair = scenic::ViewRefPair::New();
control_ref_ = std::move(view_ref_pair.control_ref);
fuchsia::accessibility::semantics::SemanticsManagerPtr
semantics_manager_ptr;
semantics_manager_binding_.Bind(semantics_manager_ptr.NewRequest());
accessibility_bridge_ = std::make_unique<AccessibilityBridge>(
std::move(semantics_manager_ptr), std::move(view_ref_pair.view_ref));
}
protected:
base::test::SingleThreadTaskEnvironment task_environment_;
std::unique_ptr<AccessibilityBridge> accessibility_bridge_;
FakeSemanticsManager semantics_manager_;
fidl::Binding<fuchsia::accessibility::semantics::SemanticsManager>
semantics_manager_binding_;
fuchsia::ui::views::ViewRefControl control_ref_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityBridgeTest);
};
// Test registration to the SemanticsManager.
TEST_F(AccessibilityBridgeTest, RegisterViewRef) {
CreateAccessibilityBridge();
// Run loop so FIDL registration requests are processed.
task_environment_.RunUntilIdle();
EXPECT_TRUE(semantics_manager_.is_view_registered());
EXPECT_TRUE(semantics_manager_.is_listener_handle_valid());
EXPECT_TRUE(semantics_manager_.is_semantic_tree_handle_valid());
}
......@@ -4,12 +4,10 @@
#include "fuchsia/engine/browser/frame_impl.h"
#include <lib/sys/cpp/component_context.h>
#include <lib/ui/scenic/cpp/view_ref_pair.h>
#include <limits>
#include "base/bind_helpers.h"
#include "base/fuchsia/default_context.h"
#include "base/fuchsia/fuchsia_logging.h"
#include "base/json/json_writer.h"
#include "base/strings/strcat.h"
......@@ -26,7 +24,6 @@
#include "content/public/common/was_activated_option.mojom.h"
#include "fuchsia/base/mem_buffer_util.h"
#include "fuchsia/base/message_port.h"
#include "fuchsia/engine/browser/accessibility_bridge.h"
#include "fuchsia/engine/browser/context_impl.h"
#include "fuchsia/engine/browser/web_engine_devtools_controller.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
......@@ -468,27 +465,6 @@ void FrameImpl::CreateView(fuchsia::ui::views::ViewToken view_token) {
properties.view_token = std::move(view_token);
properties.view_ref_pair = scenic::ViewRefPair::New();
// Create a ViewRef and register it to the Fuchsia SemanticsManager.
fuchsia::ui::views::ViewRef accessibility_view_ref;
zx_status_t status = properties.view_ref_pair.view_ref.reference.duplicate(
ZX_RIGHT_SAME_RIGHTS, &accessibility_view_ref.reference);
if (status == ZX_OK) {
fuchsia::accessibility::semantics::SemanticsManagerPtr semantics_manager;
if (test_semantics_manager_ptr_) {
semantics_manager = std::move(test_semantics_manager_ptr_);
} else {
semantics_manager =
base::fuchsia::ComponentContextForCurrentProcess()
->svc()
->Connect<fuchsia::accessibility::semantics::SemanticsManager>();
}
accessibility_bridge_ = std::make_unique<AccessibilityBridge>(
std::move(semantics_manager), std::move(accessibility_view_ref),
web_contents_.get());
} else {
ZX_LOG(ERROR, status) << "zx_object_duplicate";
}
window_tree_host_ =
std::make_unique<FrameWindowTreeHost>(std::move(properties));
window_tree_host_->InitHost();
......
......@@ -20,7 +20,6 @@
#include "base/memory/platform_shared_memory_region.h"
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_contents_observer.h"
#include "fuchsia/engine/browser/accessibility_bridge.h"
#include "fuchsia/engine/browser/discarding_event_filter.h"
#include "fuchsia/engine/browser/navigation_controller_impl.h"
#include "fuchsia/engine/browser/url_request_rewrite_rules_manager.h"
......@@ -58,14 +57,6 @@ class FrameImpl : public fuchsia::web::Frame,
base::RepeatingCallback<void(base::StringPiece)> hook) {
console_log_message_hook_ = std::move(hook);
}
AccessibilityBridge* accessibility_bridge_for_test() const {
return accessibility_bridge_.get();
}
void set_semantics_manager_for_test(
fuchsia::accessibility::semantics::SemanticsManagerPtr
semantics_manager) {
test_semantics_manager_ptr_ = std::move(semantics_manager);
}
private:
FRIEND_TEST_ALL_PREFIXES(FrameImplTest, DelayedNavigationEventAck);
......@@ -179,9 +170,6 @@ class FrameImpl : public fuchsia::web::Frame,
const std::unique_ptr<content::WebContents> web_contents_;
std::unique_ptr<wm::FocusController> focus_controller_;
ContextImpl* const context_;
std::unique_ptr<AccessibilityBridge> accessibility_bridge_;
fuchsia::accessibility::semantics::SemanticsManagerPtr
test_semantics_manager_ptr_;
DiscardingEventFilter discarding_event_filter_;
NavigationControllerImpl navigation_controller_;
......
......@@ -24,7 +24,6 @@
#include "fuchsia/base/test_navigation_listener.h"
#include "fuchsia/base/url_request_rewrite_test_util.h"
#include "fuchsia/engine/browser/frame_impl.h"
#include "fuchsia/engine/test/test_data.h"
#include "fuchsia/engine/test/web_engine_browser_test.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
......@@ -63,6 +62,7 @@ const char kPage2Title[] = "title 2";
const char kPage3Title[] = "websql not available";
const char kDataUrl[] =
"data:text/html;base64,PGI+SGVsbG8sIHdvcmxkLi4uPC9iPg==";
const char kTestServerRoot[] = FILE_PATH_LITERAL("fuchsia/engine/test/data");
const int64_t kOnLoadScriptId = 0;
MATCHER_P(NavigationHandleUrlEquals,
......@@ -100,7 +100,7 @@ class FrameImplTest : public cr_fuchsia::WebEngineBrowserTest {
FrameImplTest()
: run_timeout_(TestTimeouts::action_timeout(),
base::MakeExpectedNotRunClosure(FROM_HERE)) {
set_test_server_root(base::FilePath(cr_fuchsia::kTestServerRoot));
set_test_server_root(base::FilePath(kTestServerRoot));
}
~FrameImplTest() = default;
......
......@@ -10,17 +10,17 @@
#include "fuchsia/base/frame_test_util.h"
#include "fuchsia/base/test_navigation_listener.h"
#include "fuchsia/engine/switches.h"
#include "fuchsia/engine/test/test_data.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const char kTestServerRoot[] = FILE_PATH_LITERAL("fuchsia/engine/test/data");
class MediaTest : public cr_fuchsia::WebEngineBrowserTest {
public:
MediaTest()
: run_timeout_(TestTimeouts::action_timeout(),
base::MakeExpectedNotRunClosure(FROM_HERE)) {
set_test_server_root(base::FilePath(cr_fuchsia::kTestServerRoot));
set_test_server_root(base::FilePath(kTestServerRoot));
}
~MediaTest() override = default;
......
<html>
<head><title>accessibility 1</title></head>
<body>
<button>a button</button>
<p>a paragraph</p>
</body>
</html>
<html>
<head><title>lots of nodes!</title></head>
<body>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>node</p>
<p>last node</p>
</body>
</html>
// Copyright 2019 The Chromium 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 "fuchsia/engine/test/test_data.h"
#include "base/files/file_path.h"
namespace cr_fuchsia {
const char kTestServerRoot[] = FILE_PATH_LITERAL("fuchsia/engine/test/data");
} // namespace cr_fuchsia
\ No newline at end of file
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FUCHSIA_ENGINE_TEST_TEST_DATA_H_
#define FUCHSIA_ENGINE_TEST_TEST_DATA_H_
namespace cr_fuchsia {
// Path to data used in browsertests.
extern const char kTestServerRoot[];
} // namespace cr_fuchsia
#endif // FUCHSIA_ENGINE_TEST_TEST_DATA_H_
\ No newline at end of file
......@@ -4,7 +4,6 @@
"isolated-persistent-storage"
],
"services": [
"fuchsia.accessibility.semantics.SemanticsManager",
"fuchsia.deprecatedtimezone.Timezone",
"fuchsia.device.NameProvider",
"fuchsia.fonts.Provider",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment