blob: 71eea39b7d60bdcaabc5937174bfffba2cab4d6d [file] [log] [blame]
// Copyright 2015 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 "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h"
#include "ash/public/interfaces/constants.mojom.h"
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/accessibility/event_handler_common.h"
#include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
#include "content/public/browser/native_web_keyboard_event.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/service_manager_connection.h"
#include "extensions/browser/extension_host.h"
#include "extensions/common/constants.h"
#include "services/service_manager/public/cpp/connector.h"
#include "ui/events/event.h"
SpokenFeedbackEventRewriterDelegate::SpokenFeedbackEventRewriterDelegate()
: binding_(this) {
content::ServiceManagerConnection* connection =
content::ServiceManagerConnection::GetForProcess();
connection->GetConnector()->BindInterface(ash::mojom::kServiceName,
&event_rewriter_controller_ptr_);
// Set this object as the SpokenFeedbackEventRewriterDelegate.
ash::mojom::SpokenFeedbackEventRewriterDelegatePtr ptr;
binding_.Bind(mojo::MakeRequest(&ptr));
event_rewriter_controller_ptr_->SetSpokenFeedbackEventRewriterDelegate(
std::move(ptr));
}
SpokenFeedbackEventRewriterDelegate::~SpokenFeedbackEventRewriterDelegate() {}
void SpokenFeedbackEventRewriterDelegate::DispatchKeyEventToChromeVox(
std::unique_ptr<ui::Event> event,
bool capture) {
extensions::ExtensionHost* host = chromeos::GetAccessibilityExtensionHost(
extension_misc::kChromeVoxExtensionId);
if (!host)
return;
// Listen for any unhandled keyboard events from ChromeVox's background page
// when capturing keys to reinject.
host->host_contents()->SetDelegate(capture ? this : nullptr);
// Forward the event to ChromeVox's background page.
chromeos::ForwardKeyToExtension(*(event->AsKeyEvent()), host);
}
void SpokenFeedbackEventRewriterDelegate::DispatchMouseEventToChromeVox(
std::unique_ptr<ui::Event> event) {
if (event->type() == ui::ET_MOUSE_MOVED) {
AutomationManagerAura::GetInstance()->HandleEvent(
ax::mojom::Event::kMouseMoved);
}
}
bool SpokenFeedbackEventRewriterDelegate::ShouldDispatchKeyEventToChromeVox(
const ui::Event* event) const {
chromeos::AccessibilityManager* accessibility_manager =
chromeos::AccessibilityManager::Get();
if (!accessibility_manager->IsSpokenFeedbackEnabled() ||
accessibility_manager->keyboard_listener_extension_id().empty() ||
!chromeos::GetAccessibilityExtensionHost(
extension_misc::kChromeVoxExtensionId)) {
VLOG(1) << "Event sent to Spoken Feedback when disabled or unavailable";
return false;
}
if (!event || !event->IsKeyEvent()) {
NOTREACHED() << "Unexpected event sent to Spoken Feedback";
return false;
}
return true;
}
void SpokenFeedbackEventRewriterDelegate::OnUnhandledSpokenFeedbackEvent(
std::unique_ptr<ui::Event> event) const {
event_rewriter_controller_ptr_->OnUnhandledSpokenFeedbackEvent(
std::move(event));
}
bool SpokenFeedbackEventRewriterDelegate::HandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) {
OnUnhandledSpokenFeedbackEvent(ui::Event::Clone(*event.os_event));
return true;
}