blob: 27b5e3155978c7603fdd26edff5c3804810bb76f [file] [log] [blame]
// Copyright 2022 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 CHROME_BROWSER_ASH_ACCESSIBILITY_SERVICE_FAKE_ACCESSIBILITY_SERVICE_H_
#define CHROME_BROWSER_ASH_ACCESSIBILITY_SERVICE_FAKE_ACCESSIBILITY_SERVICE_H_
#include "base/unguessable_token.h"
#include "chrome/browser/accessibility/service/accessibility_service_router.h"
#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"
#include "services/accessibility/public/mojom/accessibility_service.mojom.h"
#include "ui/accessibility/ax_action_data.h"
#include "ui/accessibility/ax_event.h"
#include "ui/accessibility/ax_tree_update.h"
namespace ash {
// A fake Chrome OS Accessibility service to use for Chrome testing.
// This class acts as an AccessibilityServiceRouter in the browser process
// and then implements service mojom to act as a mock service.
class FakeAccessibilityService
: public ax::AccessibilityServiceRouter,
public ax::mojom::Automation,
public ax::mojom::AssistiveTechnologyController {
public:
FakeAccessibilityService();
FakeAccessibilityService(const FakeAccessibilityService&) = delete;
FakeAccessibilityService& operator=(const FakeAccessibilityService&) = delete;
~FakeAccessibilityService() override;
// AccessibilityServiceRouter:
void BindAccessibilityServiceClient(
mojo::PendingRemote<ax::mojom::AccessibilityServiceClient>
accessibility_service_client) override;
void BindAssistiveTechnologyController(
mojo::PendingReceiver<ax::mojom::AssistiveTechnologyController>
at_controller_receiver,
const std::vector<ax::mojom::AssistiveTechnologyType>& enabled_features)
override;
// TODO(crbug.com/1355633): Override from ax::mojom::Automation:
void DispatchTreeDestroyedEvent(const ui::AXTreeID& tree_id);
void DispatchActionResult(const ui::AXActionData& data, bool result);
void DispatchAccessibilityEvents(
const ui::AXTreeID& tree_id,
const std::vector<ui::AXTreeUpdate>& updates,
const gfx::Point& mouse_location,
const std::vector<ui::AXEvent>& events) override;
void DispatchAccessibilityLocationChange(
const ui::AXTreeID& tree_id,
int node_id,
const ui::AXRelativeBounds& bounds) override;
// ax::mojom::AssistiveTechnologyController:
void EnableAssistiveTechnology(
const std::vector<ax::mojom::AssistiveTechnologyType>& enabled_features)
override;
//
// Methods for testing.
//
// Whether the service client remote is bound.
bool IsBound() const;
// Waits for EnableAssistiveTechnology to be called.
void WaitForATChanged();
// Gets the currently enabled assistive technology types.
const std::set<ax::mojom::AssistiveTechnologyType>& GetEnabledATs() const {
return enabled_ATs_;
}
// Allows tests to bind Automation multiple times, mimicking multiple
// V8 instances in the service.
void BindAnotherAutomation();
// Calls ax::mojom::AutomationClient::Enable or ::Disable.
void AutomationClientEnable(bool enabled);
// Whats for Automation events to come in.
void WaitForAutomationEvents();
// Getters for automation events.
std::vector<ui::AXTreeID> tree_destroyed_events() const {
return tree_destroyed_events_;
}
std::vector<std::tuple<ui::AXActionData, bool>> action_results() const {
return action_results_;
}
std::vector<ui::AXTreeID> accessibility_events() const {
return accessibility_events_;
}
std::vector<ui::AXTreeID> location_changes() const {
return location_changes_;
}
private:
base::OnceClosure change_ATs_closure_;
std::set<ax::mojom::AssistiveTechnologyType> enabled_ATs_;
base::OnceClosure automation_events_closure_;
std::vector<ui::AXTreeID> tree_destroyed_events_;
std::vector<std::tuple<ui::AXActionData, bool>> action_results_;
std::vector<ui::AXTreeID> accessibility_events_;
std::vector<ui::AXTreeID> location_changes_;
mojo::ReceiverSet<ax::mojom::Automation> automation_receivers_;
mojo::RemoteSet<ax::mojom::AutomationClient> automation_client_remotes_;
mojo::ReceiverSet<ax::mojom::AssistiveTechnologyController>
at_controller_receivers_;
mojo::Remote<ax::mojom::AccessibilityServiceClient>
accessibility_service_client_remote_;
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_ACCESSIBILITY_SERVICE_FAKE_ACCESSIBILITY_SERVICE_H_