blob: 34f3fda0aa5d6c8ad50e349079d9c9613f7dc9bb [file] [log] [blame]
// Copyright 2020 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.
/**
* This class handles interactions with editable text fields.
*/
class EditableTextNode extends BasicNode {
/**
* @param {!AutomationNode} baseNode
* @param {?SARootNode} parent
*/
constructor(baseNode, parent) {
super(baseNode, parent);
}
// ================= Getters and setters =================
/** @override */
get actions() {
const actions = super.actions;
// The SELECT action is used to press buttons, etc. For text inputs, the
// equivalent action is KEYBOARD, which focuses the input and opens the
// keyboard.
const selectIndex = actions.indexOf(SwitchAccessMenuAction.SELECT);
if (selectIndex >= 0) {
actions.splice(selectIndex, 1);
}
actions.unshift(
SwitchAccessMenuAction.KEYBOARD, SwitchAccessMenuAction.DICTATION);
if (SwitchAccess.instance.improvedTextInputEnabled()) {
actions.push(
SwitchAccessMenuAction.MOVE_CURSOR,
SwitchAccessMenuAction.JUMP_TO_BEGINNING_OF_TEXT,
SwitchAccessMenuAction.JUMP_TO_END_OF_TEXT,
SwitchAccessMenuAction.MOVE_BACKWARD_ONE_CHAR_OF_TEXT,
SwitchAccessMenuAction.MOVE_FORWARD_ONE_CHAR_OF_TEXT,
SwitchAccessMenuAction.MOVE_BACKWARD_ONE_WORD_OF_TEXT,
SwitchAccessMenuAction.MOVE_FORWARD_ONE_WORD_OF_TEXT,
SwitchAccessMenuAction.MOVE_DOWN_ONE_LINE_OF_TEXT,
SwitchAccessMenuAction.MOVE_UP_ONE_LINE_OF_TEXT);
actions.push(SwitchAccessMenuAction.START_TEXT_SELECTION);
if (TextNavigationManager.currentlySelecting()) {
actions.push(SwitchAccessMenuAction.END_TEXT_SELECTION);
}
if (TextNavigationManager.selectionExists) {
actions.push(SwitchAccessMenuAction.CUT, SwitchAccessMenuAction.COPY);
}
if (TextNavigationManager.clipboardHasData) {
actions.push(SwitchAccessMenuAction.PASTE);
}
}
return actions;
}
// ================= General methods =================
/** @override */
doDefaultAction() {
this.performAction(SwitchAccessMenuAction.KEYBOARD);
}
/** @override */
performAction(action) {
switch (action) {
case SwitchAccessMenuAction.KEYBOARD:
NavigationManager.enterKeyboard();
return SAConstants.ActionResponse.CLOSE_MENU;
case SwitchAccessMenuAction.DICTATION:
if (this.automationNode.state[chrome.automation.StateType.FOCUSED]) {
chrome.accessibilityPrivate.toggleDictation();
} else {
new EventHandler(
this.automationNode, chrome.automation.EventType.FOCUS,
() => chrome.accessibilityPrivate.toggleDictation(),
{exactMatch: true, listenOnce: true})
.start();
this.automationNode.focus();
}
return SAConstants.ActionResponse.CLOSE_MENU;
case SwitchAccessMenuAction.MOVE_CURSOR:
return SAConstants.ActionResponse.OPEN_TEXT_NAVIGATION_MENU;
case SwitchAccessMenuAction.CUT:
EventGenerator.sendKeyPress(KeyCode.X, {ctrl: true});
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.COPY:
EventGenerator.sendKeyPress(KeyCode.C, {ctrl: true});
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.PASTE:
EventGenerator.sendKeyPress(KeyCode.V, {ctrl: true});
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.START_TEXT_SELECTION:
TextNavigationManager.saveSelectStart();
return SAConstants.ActionResponse.OPEN_TEXT_NAVIGATION_MENU;
case SwitchAccessMenuAction.END_TEXT_SELECTION:
TextNavigationManager.saveSelectEnd();
return SAConstants.ActionResponse.RELOAD_MENU;
case SwitchAccessMenuAction.JUMP_TO_BEGINNING_OF_TEXT:
TextNavigationManager.jumpToBeginning();
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.JUMP_TO_END_OF_TEXT:
TextNavigationManager.jumpToEnd();
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.MOVE_BACKWARD_ONE_CHAR_OF_TEXT:
TextNavigationManager.moveBackwardOneChar();
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.MOVE_BACKWARD_ONE_WORD_OF_TEXT:
TextNavigationManager.moveBackwardOneWord();
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.MOVE_DOWN_ONE_LINE_OF_TEXT:
TextNavigationManager.moveDownOneLine();
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.MOVE_FORWARD_ONE_CHAR_OF_TEXT:
TextNavigationManager.moveForwardOneChar();
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.MOVE_UP_ONE_LINE_OF_TEXT:
TextNavigationManager.moveUpOneLine();
return SAConstants.ActionResponse.REMAIN_OPEN;
case SwitchAccessMenuAction.MOVE_FORWARD_ONE_WORD_OF_TEXT:
TextNavigationManager.moveForwardOneWord();
return SAConstants.ActionResponse.REMAIN_OPEN;
}
return super.performAction(action);
}
}