| Index: chrome/third_party/chromevox/extensions/searchvox/search.js
|
| diff --git a/chrome/third_party/chromevox/extensions/searchvox/search.js b/chrome/third_party/chromevox/extensions/searchvox/search.js
|
| deleted file mode 100644
|
| index 804d51f5c8099a44b0bbc189d86c501a0713efb9..0000000000000000000000000000000000000000
|
| --- a/chrome/third_party/chromevox/extensions/searchvox/search.js
|
| +++ /dev/null
|
| @@ -1,437 +0,0 @@
|
| -// Copyright 2013 Google Inc. All Rights Reserved.
|
| -
|
| -/**
|
| - * @fileoverview Uses ChromeVox API to enhance the search experience.
|
| - * @author peterxiao@google.com (Peter Xiao)
|
| - */
|
| -
|
| -goog.provide('cvox.Search');
|
| -
|
| -goog.require('cvox.ChromeVox');
|
| -goog.require('cvox.SearchConstants');
|
| -goog.require('cvox.SearchResults');
|
| -goog.require('cvox.SearchUtil');
|
| -goog.require('cvox.UnknownResult');
|
| -
|
| -/**
|
| - * @constructor
|
| - */
|
| -cvox.Search = function() {
|
| -};
|
| -
|
| -/**
|
| - * Selectors to match results.
|
| - * @type {Object.<string, string>}
|
| - */
|
| -cvox.Search.selectors = {};
|
| -
|
| -/**
|
| - * Selectors for web results.
|
| - */
|
| -cvox.Search.webSelectors = {
|
| - /* Topstuff typically contains important messages to be added first. */
|
| - TOPSTUFF_SELECT: '#topstuff',
|
| - SPELL_SUGG_SELECT: '.ssp',
|
| - SPELL_CORRECTION_SELECT: '.sp_cnt',
|
| - KNOW_PANEL_SELECT: '.knop',
|
| - RESULT_SELECT: 'li.g',
|
| - RELATED_SELECT: '#brs'
|
| -};
|
| -
|
| -/**
|
| - * Selectors for image results.
|
| - */
|
| -cvox.Search.imageSelectors = {
|
| - IMAGE_CATEGORIES_SELECT: '#ifbc .rg_fbl',
|
| - IMAGE_RESULT_SELECT: '#rg_s .rg_di'
|
| -};
|
| -
|
| -/**
|
| - * Index of the currently synced result.
|
| - * @type {number}
|
| - */
|
| -cvox.Search.index;
|
| -
|
| -/**
|
| - * Array of the search results.
|
| - * @type {Array.<Element>}
|
| - */
|
| -cvox.Search.results = [];
|
| -
|
| -/**
|
| - * Array of the navigation panes.
|
| - * @type {Array.<Element>}
|
| - */
|
| -cvox.Search.panes = [];
|
| -
|
| -/**
|
| - * Index of the currently synced pane.
|
| - * @type {number}
|
| - */
|
| -cvox.Search.paneIndex;
|
| -
|
| -/**
|
| - * If currently synced item is a pane.
|
| - */
|
| -cvox.Search.isPane = false;
|
| -
|
| -/**
|
| - * Class of a selected pane.
|
| - */
|
| -cvox.Search.SELECTED_PANE_CLASS = 'hdtb_mitem hdtb_msel';
|
| -
|
| -
|
| -/**
|
| - * Speak and sync.
|
| - * @private
|
| - */
|
| -cvox.Search.speakSync_ = function() {
|
| - var result = cvox.Search.results[cvox.Search.index];
|
| - var resultType = cvox.Search.getResultType(result);
|
| - var isSpoken = resultType.speak(result);
|
| - cvox.ChromeVox.syncToNode(resultType.getSyncNode(result), !isSpoken);
|
| - cvox.Search.isPane = false;
|
| -};
|
| -
|
| -/**
|
| - * Sync the search result index to ChromeVox.
|
| - */
|
| -cvox.Search.syncToIndex = function() {
|
| - cvox.ChromeVox.tts.stop();
|
| - var prop = { endCallback: cvox.Search.speakSync_ };
|
| - if (cvox.Search.index === 0) {
|
| - cvox.ChromeVox.tts.speak('First result', 1, prop);
|
| - } else if (cvox.Search.index === cvox.Search.results.length - 1) {
|
| - cvox.ChromeVox.tts.speak('Last result', 1, prop);
|
| - } else {
|
| - cvox.Search.speakSync_();
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Sync the current pane index to ChromeVox.
|
| - */
|
| -cvox.Search.syncPaneToIndex = function() {
|
| - var pane = cvox.Search.panes[cvox.Search.paneIndex];
|
| - var anchor = pane.querySelector('a');
|
| - if (anchor) {
|
| - cvox.ChromeVox.syncToNode(anchor, true);
|
| - } else {
|
| - cvox.ChromeVox.syncToNode(pane, true);
|
| - }
|
| - cvox.Search.isPane = true;
|
| -};
|
| -
|
| -/**
|
| - * Get the type of the result such as Knowledge Panel, Weather, etc.
|
| - * @param {Element} result Result to be classified.
|
| - * @return {cvox.AbstractResult} Type of the result.
|
| - */
|
| -cvox.Search.getResultType = function(result) {
|
| - for (var i = 0; i < cvox.SearchResults.RESULT_TYPES.length; i++) {
|
| - var resultType = new cvox.SearchResults.RESULT_TYPES[i]();
|
| - if (resultType.isType(result)) {
|
| - return resultType;
|
| - }
|
| - }
|
| - return new cvox.UnknownResult();
|
| -};
|
| -
|
| -/**
|
| - * Get the page number associated with the url.
|
| - * @param {string} url Url of search page.
|
| - * @return {number} Page number.
|
| - */
|
| -cvox.Search.getPageNumber = function(url) {
|
| - var PAGE_ANCHOR_SELECTOR = '#nav .fl';
|
| - var pageAnchors = document.querySelectorAll(PAGE_ANCHOR_SELECTOR);
|
| - for (var i = 0; i < pageAnchors.length; i++) {
|
| - var pageAnchor = pageAnchors.item(i);
|
| - if (pageAnchor.href === url) {
|
| - return parseInt(pageAnchor.innerText, 10);
|
| - }
|
| - }
|
| - return NaN;
|
| -};
|
| -
|
| -/**
|
| - * Navigate to the next / previous page.
|
| - * @param {boolean} next True for the next page, false for the previous.
|
| - */
|
| -cvox.Search.navigatePage = function(next) {
|
| - /* NavEnd contains previous / next page links. */
|
| - var NAV_END_CLASS = 'navend';
|
| - var navEnds = document.getElementsByClassName(NAV_END_CLASS);
|
| - var navEnd = next ? navEnds[1] : navEnds[0];
|
| - var url = cvox.SearchUtil.extractURL(navEnd);
|
| - var navToUrl = function() {
|
| - window.location = url;
|
| - };
|
| - var prop = { endCallback: navToUrl };
|
| - if (url) {
|
| - var pageNumber = cvox.Search.getPageNumber(url);
|
| - if (!isNaN(pageNumber)) {
|
| - cvox.ChromeVox.tts.speak('Page ' + pageNumber, 0, prop);
|
| - } else {
|
| - cvox.ChromeVox.tts.speak('Unknown page.', 0, prop);
|
| - }
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Navigates to the currently synced pane.
|
| - */
|
| -cvox.Search.goToPane = function() {
|
| - var pane = cvox.Search.panes[cvox.Search.paneIndex];
|
| - if (pane.className === cvox.Search.SELECTED_PANE_CLASS) {
|
| - cvox.ChromeVox.tts.speak('You are already on that page.');
|
| - return;
|
| - }
|
| - var anchor = pane.querySelector('a');
|
| - cvox.ChromeVox.tts.speak(anchor.textContent);
|
| - var url = cvox.SearchUtil.extractURL(pane);
|
| - if (url) {
|
| - window.location = url;
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Follow the link to the current result.
|
| - */
|
| -cvox.Search.goToResult = function() {
|
| - var result = cvox.Search.results[cvox.Search.index];
|
| - var resultType = cvox.Search.getResultType(result);
|
| - var url = resultType.getURL(result);
|
| - if (url) {
|
| - window.location = url;
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Handle the keyboard.
|
| - * @param {Event} evt Keydown event.
|
| - * @return {boolean} True if key was handled, false otherwise.
|
| - */
|
| -cvox.Search.keyhandler = function(evt) {
|
| - var SEARCH_INPUT_ID = 'gbqfq';
|
| - var searchInput = document.getElementById(SEARCH_INPUT_ID);
|
| - var result = cvox.Search.results[cvox.Search.index];
|
| - var ret = false;
|
| -
|
| - /* TODO(peterxiao): Add cvox api call to determine cvox key. */
|
| - if (evt.shiftKey || evt.altKey || evt.ctrlKey) {
|
| - return false;
|
| - }
|
| -
|
| - /* Do not handle if search input has focus, or if the search widget
|
| - * has focus.
|
| - */
|
| - if (document.activeElement !== searchInput &&
|
| - !cvox.SearchUtil.isSearchWidgetActive()) {
|
| - switch (evt.keyCode) {
|
| - case cvox.SearchConstants.KeyCode.UP:
|
| - /* Add results.length because JS Modulo is silly. */
|
| - cvox.Search.index = cvox.SearchUtil.subOneWrap(cvox.Search.index,
|
| - cvox.Search.results.length);
|
| - if (cvox.Search.index === cvox.Search.results.length - 1) {
|
| - cvox.ChromeVox.earcons.playEarconByName('WRAP');
|
| - }
|
| - cvox.Search.syncToIndex();
|
| - break;
|
| -
|
| - case cvox.SearchConstants.KeyCode.DOWN:
|
| - cvox.Search.index = cvox.SearchUtil.addOneWrap(cvox.Search.index,
|
| - cvox.Search.results.length);
|
| - if (cvox.Search.index === 0) {
|
| - cvox.ChromeVox.earcons.playEarconByName('WRAP');
|
| - }
|
| - cvox.Search.syncToIndex();
|
| - break;
|
| -
|
| - case cvox.SearchConstants.KeyCode.PAGE_UP:
|
| - cvox.Search.navigatePage(false);
|
| - break;
|
| -
|
| - case cvox.SearchConstants.KeyCode.PAGE_DOWN:
|
| - cvox.Search.navigatePage(true);
|
| - break;
|
| -
|
| - case cvox.SearchConstants.KeyCode.LEFT:
|
| - cvox.Search.paneIndex = cvox.SearchUtil.subOneWrap(cvox.Search.paneIndex,
|
| - cvox.Search.panes.length);
|
| - cvox.Search.syncPaneToIndex();
|
| - break;
|
| -
|
| - case cvox.SearchConstants.KeyCode.RIGHT:
|
| - cvox.Search.paneIndex = cvox.SearchUtil.addOneWrap(cvox.Search.paneIndex,
|
| - cvox.Search.panes.length);
|
| - cvox.Search.syncPaneToIndex();
|
| - break;
|
| -
|
| - case cvox.SearchConstants.KeyCode.ENTER:
|
| - if (cvox.Search.isPane) {
|
| - cvox.Search.goToPane();
|
| - } else {
|
| - cvox.Search.goToResult();
|
| - }
|
| - break;
|
| -
|
| - default:
|
| - return false;
|
| - }
|
| - evt.preventDefault();
|
| - evt.stopPropagation();
|
| - return true;
|
| - }
|
| - return false;
|
| -};
|
| -
|
| -/**
|
| - * Adds the elements that match the selector to results.
|
| - * @param {string} selector Selector of element to add.
|
| - */
|
| -cvox.Search.addToResultsBySelector = function(selector) {
|
| - var nodes = document.querySelectorAll(selector);
|
| - for (var i = 0; i < nodes.length; i++) {
|
| - var node = nodes.item(i);
|
| - /* Do not add if empty. */
|
| - if (node.innerHTML !== '') {
|
| - cvox.Search.results.push(nodes.item(i));
|
| - }
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Populates the panes array.
|
| - */
|
| -cvox.Search.populatePanes = function() {
|
| - cvox.Search.panes = [];
|
| - var PANE_SELECT = '.hdtb_mitem';
|
| - var paneElems = document.querySelectorAll(PANE_SELECT);
|
| - for (var i = 0; i < paneElems.length; i++) {
|
| - cvox.Search.panes.push(paneElems.item(i));
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Populates the results with results.
|
| - */
|
| -cvox.Search.populateResults = function() {
|
| - for (var prop in cvox.Search.selectors) {
|
| - cvox.Search.addToResultsBySelector(cvox.Search.selectors[prop]);
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Populates the results with ad results.
|
| - */
|
| -cvox.Search.populateAdResults = function() {
|
| - cvox.Search.results = [];
|
| - var ADS_SELECT = '.ads-ad';
|
| - cvox.Search.addToResultsBySelector(ADS_SELECT);
|
| -};
|
| -
|
| -/**
|
| - * Observes mutations and updates results accordingly.
|
| - */
|
| -cvox.Search.observeMutation = function() {
|
| - var SEARCH_AREA_SELECT = '#rg_s';
|
| - var target = document.querySelector(SEARCH_AREA_SELECT);
|
| -
|
| - var observer = new MutationObserver(function(mutations) {
|
| - cvox.Search.results = [];
|
| - cvox.Search.populateResults();
|
| - });
|
| -
|
| - var config =
|
| - /** @type MutationObserverInit */
|
| - ({ attributes: true, childList: true, characterData: true });
|
| - observer.observe(target, config);
|
| -};
|
| -
|
| -/**
|
| - * Get the current selected pane's index.
|
| - * @return {number} Index of selected pane.
|
| - */
|
| -cvox.Search.getSelectedPaneIndex = function() {
|
| - var panes = cvox.Search.panes;
|
| - for (var i = 0; i < panes.length; i++) {
|
| - if (panes[i].className === cvox.Search.SELECTED_PANE_CLASS) {
|
| - return i;
|
| - }
|
| - }
|
| - return 0;
|
| -};
|
| -
|
| -/**
|
| - * Get the ancestor of node that is a result.
|
| - * @param {Node} node Node.
|
| - * @return {Node} Result ancestor.
|
| - */
|
| -cvox.Search.getAncestorResult = function(node) {
|
| - var curr = node;
|
| - while (curr) {
|
| - for (var prop in cvox.Search.selectors) {
|
| - var selector = cvox.Search.selectors[prop];
|
| - if (curr.webkitMatchesSelector && curr.webkitMatchesSelector(selector)) {
|
| - return curr;
|
| - }
|
| - }
|
| - curr = curr.parentNode;
|
| - }
|
| - return null;
|
| -};
|
| -
|
| -/**
|
| - * Sync to the correct initial node.
|
| - */
|
| -cvox.Search.initialSync = function() {
|
| - var currNode = cvox.ChromeVox.navigationManager.getCurrentNode();
|
| - var result = cvox.Search.getAncestorResult(currNode);
|
| - cvox.Search.index = cvox.Search.results.indexOf(result);
|
| - if (cvox.Search.index === -1) {
|
| - cvox.Search.index = 0;
|
| - }
|
| -
|
| - if (cvox.Search.results.length > 0) {
|
| - cvox.Search.syncToIndex();
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Initialize Search.
|
| - */
|
| -cvox.Search.init = function() {
|
| - cvox.Search.index = 0;
|
| -
|
| - /* Flush out anything that may have been speaking. */
|
| - cvox.ChromeVox.tts.stop();
|
| -
|
| - /* Determine the type of search. */
|
| - var SELECTED_CLASS = 'hdtb_msel';
|
| - var selected = document.getElementsByClassName(SELECTED_CLASS)[0];
|
| - if (!selected) {
|
| - return;
|
| - }
|
| -
|
| - var selectedHTML = selected.innerHTML;
|
| - switch (selectedHTML) {
|
| - case 'Web':
|
| - case 'News':
|
| - cvox.Search.selectors = cvox.Search.webSelectors;
|
| - break;
|
| - case 'Images':
|
| - cvox.Search.selectors = cvox.Search.imageSelectors;
|
| - cvox.Search.observeMutation();
|
| - break;
|
| - default:
|
| - return;
|
| - }
|
| -
|
| - cvox.Search.populateResults();
|
| - cvox.Search.populatePanes();
|
| - cvox.Search.paneIndex = cvox.Search.getSelectedPaneIndex();
|
| -
|
| - cvox.Search.initialSync();
|
| -
|
| -};
|
|
|