#include "ash/accessibility/accessibility_event_handler_manager.h"
#include "ash/shell.h"
#include "ui/events/event_handler.h"
namespace ash {
AccessibilityEventHandlerManager::AccessibilityEventHandlerManager()
: event_handlers_(static_cast<int>(HandlerType::kMaxValue) + 1, nullptr) {}
AccessibilityEventHandlerManager::~AccessibilityEventHandlerManager() = default;
void AccessibilityEventHandlerManager::AddAccessibilityEventHandler(
ui::EventHandler* handler,
HandlerType type) {
DCHECK(handler);
int index = static_cast<int>(type);
if (event_handlers_[index] == handler)
return;
DCHECK_EQ(event_handlers_[index], nullptr)
<< "Multiple event handlers should not share a priority level.";
event_handlers_[index] = handler;
UpdateEventHandlers();
}
void AccessibilityEventHandlerManager::RemoveAccessibilityEventHandler(
ui::EventHandler* handler) {
DCHECK(handler);
auto it = std::find(event_handlers_.begin(), event_handlers_.end(), handler);
DCHECK(it != event_handlers_.end());
*it = nullptr;
ash::Shell::Get()->RemovePreTargetHandler(handler);
}
void AccessibilityEventHandlerManager::UpdateEventHandlers() {
for (auto* handler : event_handlers_) {
if (handler == nullptr)
continue;
ash::Shell::Get()->RemovePreTargetHandler(handler);
}
for (auto it = event_handlers_.rbegin(); it != event_handlers_.rend(); ++it) {
if (*it == nullptr)
continue;
ash::Shell::Get()->AddPreTargetHandler(
*it, ui::EventTarget::Priority::kAccessibility);
}
}
}