diff options
Diffstat (limited to 'chromium/chrome/browser/resources/chromeos/chromevox/extensions/searchvox/search_tools.js')
-rw-r--r-- | chromium/chrome/browser/resources/chromeos/chromevox/extensions/searchvox/search_tools.js | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/extensions/searchvox/search_tools.js b/chromium/chrome/browser/resources/chromeos/chromevox/extensions/searchvox/search_tools.js new file mode 100644 index 00000000000..8ed3bdb151c --- /dev/null +++ b/chromium/chrome/browser/resources/chromeos/chromevox/extensions/searchvox/search_tools.js @@ -0,0 +1,208 @@ +// Copyright 2014 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. + + +/** + * @fileoverview Uses ChromeVox API to access the search tools menu. + */ + +goog.provide('cvox.SearchTool'); + +goog.require('cvox.ChromeVox'); +goog.require('cvox.DomUtil'); +goog.require('cvox.Search'); +goog.require('cvox.SearchConstants'); +goog.require('cvox.SearchUtil'); + +/** + * @constructor + */ +cvox.SearchTool = function() { +}; + +/** + * Index of the current menu in focus. + * @type {number} + */ +cvox.SearchTool.menuIndex; + +/** + * Array of menus. + * @type {Array.<Node>} + */ +cvox.SearchTool.menus = []; + +/** + * Index of the current menu item in focus. + * @type {number} + */ +cvox.SearchTool.menuItemIndex; + +/** + * Array of menu items for the current menu. + * @type {Array.<Node>} + */ +cvox.SearchTool.menuItems = []; + +/** + * Id of the clear button. + * @type {string} + */ +cvox.SearchTool.CLEAR_ID = 'hdtb_rst'; + +/** + * Toggles a menu open / close by simulating a click. + */ +cvox.SearchTool.toggleMenu = function() { + var menu = cvox.SearchTool.menus[cvox.SearchTool.menuIndex]; + var menuDiv = menu.previousSibling; + cvox.DomUtil.clickElem(menuDiv, false, false, false); +}; + +/** + * Syncs the first item in the current menu to ChromeVox. + */ +cvox.SearchTool.syncToMenu = function() { + cvox.SearchTool.menuItemIndex = 0; + cvox.SearchTool.toggleMenu(); + cvox.SearchTool.populateMenuItems(); + cvox.SearchTool.syncToMenuItem(); +}; + +/** + * Syncs the current menu item to ChromeVox. + */ +cvox.SearchTool.syncToMenuItem = function() { + var menuItem = cvox.SearchTool.menuItems[cvox.SearchTool.menuItemIndex]; + cvox.ChromeVox.syncToNode(menuItem, true); +}; + +/** + * Fills in menuItems with the current menu's items. + */ +cvox.SearchTool.populateMenuItems = function() { + var menu = cvox.SearchTool.menus[cvox.SearchTool.menuIndex]; + cvox.SearchTool.menuItems = []; + /* For now, we just special case on the clear button. */ + if (menu.id !== cvox.SearchTool.CLEAR_ID) { + var MENU_ITEM_SELECTOR = '.hdtbItm'; + var menuItemNodeList = menu.querySelectorAll(MENU_ITEM_SELECTOR); + for (var i = 0; i < menuItemNodeList.length; i++) { + cvox.SearchTool.menuItems.push(menuItemNodeList.item(i)); + } + } else { + cvox.SearchTool.menuItems = []; + cvox.SearchTool.menuItems.push(menu); + } +}; + +/** + * Fills in menus with the menus of the page. + */ +cvox.SearchTool.populateMenus = function() { + var MENU_SELECTOR = '.hdtbU'; + var menuDivs = document.querySelectorAll(MENU_SELECTOR); + for (var i = 0; i < menuDivs.length; i++) { + cvox.SearchTool.menus.push(menuDivs.item(i)); + } + + var clearDiv = document.getElementById(cvox.SearchTool.CLEAR_ID); + if (clearDiv) { + cvox.SearchTool.menus.push(clearDiv); + } +}; + +/** + * Switches focus to the tools interface, giving keyboard access. + */ +cvox.SearchTool.activateTools = function() { + var MENU_BAR_SELECTOR = '#hdtbMenus'; + var menuBar = document.querySelector(MENU_BAR_SELECTOR); + var MENUS_OPEN_CLASS = 'hdtb-td-o'; + menuBar.className = MENUS_OPEN_CLASS; + + cvox.SearchTool.populateMenus(); + cvox.SearchTool.menuIndex = 0; + cvox.SearchTool.syncToMenu(); +}; + +/** + * Goes to the link of the current menu item action. + */ +cvox.SearchTool.gotoMenuItem = function() { + var menuItem = cvox.SearchTool.menuItems[cvox.SearchTool.menuItemIndex]; + var LOCATION_INPUT_ID = '#lc-input'; + var input = menuItem.querySelector(LOCATION_INPUT_ID); + /* Special case for setting location. */ + if (input) { + input.focus(); + return; + } + + /* Custom Date Range. */ + var CDR_ID = 'cdr_opt'; + switch (menuItem.id) { + case cvox.SearchTool.CLEAR_ID: + window.location = menuItem.dataset.url; + break; + case CDR_ID: + var CDR_LINK_SELECTOR = '#cdrlnk'; + var cdrLink = menuItem.querySelector(CDR_LINK_SELECTOR); + cvox.DomUtil.clickElem(cdrLink, false, false, false); + cvox.SearchTool.toggleMenu(); + break; + default: + window.location = cvox.SearchUtil.extractURL(menuItem); + break; + } +}; + +/** + * Handles key events for the tools interface. + * @param {Event} evt Keydown event. + * @return {boolean} True if key was handled, false otherwise. + */ +cvox.SearchTool.keyhandler = function(evt) { + if (cvox.SearchUtil.isSearchWidgetActive()) { + return false; + } + + switch (evt.keyCode) { + case cvox.SearchConstants.KeyCode.UP: + cvox.SearchTool.menuItemIndex = cvox.SearchUtil.subOneWrap( + cvox.SearchTool.menuItemIndex, cvox.SearchTool.menuItems.length); + cvox.SearchTool.syncToMenuItem(); + break; + + case cvox.SearchConstants.KeyCode.DOWN: + cvox.SearchTool.menuItemIndex = cvox.SearchUtil.addOneWrap( + cvox.SearchTool.menuItemIndex, cvox.SearchTool.menuItems.length); + cvox.SearchTool.syncToMenuItem(); + break; + + case cvox.SearchConstants.KeyCode.LEFT: + cvox.SearchTool.toggleMenu(); + cvox.SearchTool.menuIndex = cvox.SearchUtil.subOneWrap( + cvox.SearchTool.menuIndex, cvox.SearchTool.menus.length); + cvox.SearchTool.syncToMenu(); + break; + + case cvox.SearchConstants.KeyCode.RIGHT: + cvox.SearchTool.toggleMenu(); + cvox.SearchTool.menuIndex = cvox.SearchUtil.addOneWrap( + cvox.SearchTool.menuIndex, cvox.SearchTool.menus.length); + cvox.SearchTool.syncToMenu(); + break; + + case cvox.SearchConstants.KeyCode.ENTER: + cvox.SearchTool.gotoMenuItem(); + break; + + default: + return false; + } + evt.preventDefault(); + evt.stopPropagation(); + return true; +}; |