1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @fileoverview Uses ChromeVox API to enhance the search experience. 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.provide('cvox.Search'); 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.ChromeVox'); 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.SearchConstants'); 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.SearchResults'); 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.SearchUtil'); 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.UnknownResult'); 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @constructor 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search = function() { 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Selectors to match results. 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Object.<string, string>} 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.selectors = {}; 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Selectors for web results. 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.webSelectors = { 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /* Topstuff typically contains important messages to be added first. */ 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TOPSTUFF_SELECT: '#topstuff', 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SPELL_SUGG_SELECT: '.ssp', 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SPELL_CORRECTION_SELECT: '.sp_cnt', 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) KNOW_PANEL_SELECT: '.knop', 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RESULT_SELECT: 'li.g', 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RELATED_SELECT: '#brs' 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Selectors for image results. 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.imageSelectors = { 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IMAGE_CATEGORIES_SELECT: '#ifbc .rg_fbl', 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IMAGE_RESULT_SELECT: '#rg_s .rg_di' 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Index of the currently synced result. 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {number} 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.index; 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Array of the search results. 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Array.<Element>} 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.results = []; 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Array of the navigation panes. 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Array.<Element>} 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.panes = []; 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Index of the currently synced pane. 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {number} 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.paneIndex; 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * If currently synced item is a pane. 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.isPane = false; 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Class of a selected pane. 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.SELECTED_PANE_CLASS = 'hdtb_mitem hdtb_msel'; 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Speak and sync. 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.speakSync_ = function() { 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var result = cvox.Search.results[cvox.Search.index]; 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var resultType = cvox.Search.getResultType(result); 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var isSpoken = resultType.speak(result); 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.syncToNode(resultType.getSyncNode(result), !isSpoken); 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.isPane = false; 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Sync the search result index to ChromeVox. 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.syncToIndex = function() { 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.tts.stop(); 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var prop = { endCallback: cvox.Search.speakSync_ }; 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (cvox.Search.index === 0) { 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.tts.speak('First result', 1, prop); 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (cvox.Search.index === cvox.Search.results.length - 1) { 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.tts.speak('Last result', 1, prop); 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.speakSync_(); 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Sync the current pane index to ChromeVox. 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.syncPaneToIndex = function() { 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var pane = cvox.Search.panes[cvox.Search.paneIndex]; 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var anchor = pane.querySelector('a'); 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (anchor) { 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.syncToNode(anchor, true); 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.syncToNode(pane, true); 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.isPane = true; 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Get the type of the result such as Knowledge Panel, Weather, etc. 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Element} result Result to be classified. 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {cvox.AbstractResult} Type of the result. 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.getResultType = function(result) { 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = 0; i < cvox.SearchResults.RESULT_TYPES.length; i++) { 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var resultType = new cvox.SearchResults.RESULT_TYPES[i](); 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (resultType.isType(result)) { 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return resultType; 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return new cvox.UnknownResult(); 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Get the page number associated with the url. 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} url Url of search page. 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {number} Page number. 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.getPageNumber = function(url) { 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var PAGE_ANCHOR_SELECTOR = '#nav .fl'; 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var pageAnchors = document.querySelectorAll(PAGE_ANCHOR_SELECTOR); 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = 0; i < pageAnchors.length; i++) { 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var pageAnchor = pageAnchors.item(i); 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pageAnchor.href === url) { 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return parseInt(pageAnchor.innerText, 10); 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NaN; 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Navigate to the next / previous page. 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {boolean} next True for the next page, false for the previous. 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.navigatePage = function(next) { 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /* NavEnd contains previous / next page links. */ 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var NAV_END_CLASS = 'navend'; 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var navEnds = document.getElementsByClassName(NAV_END_CLASS); 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var navEnd = next ? navEnds[1] : navEnds[0]; 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var url = cvox.SearchUtil.extractURL(navEnd); 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var navToUrl = function() { 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window.location = url; 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var prop = { endCallback: navToUrl }; 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (url) { 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var pageNumber = cvox.Search.getPageNumber(url); 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!isNaN(pageNumber)) { 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.tts.speak('Page ' + pageNumber, 0, prop); 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.tts.speak('Unknown page.', 0, prop); 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Navigates to the currently synced pane. 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.goToPane = function() { 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var pane = cvox.Search.panes[cvox.Search.paneIndex]; 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pane.className === cvox.Search.SELECTED_PANE_CLASS) { 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.tts.speak('You are already on that page.'); 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var anchor = pane.querySelector('a'); 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.tts.speak(anchor.textContent); 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var url = cvox.SearchUtil.extractURL(pane); 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (url) { 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window.location = url; 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Follow the link to the current result. 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.goToResult = function() { 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var result = cvox.Search.results[cvox.Search.index]; 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var resultType = cvox.Search.getResultType(result); 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var url = resultType.getURL(result); 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (url) { 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window.location = url; 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Handle the keyboard. 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Event} evt Keydown event. 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} True if key was handled, false otherwise. 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.keyhandler = function(evt) { 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var SEARCH_INPUT_ID = 'gbqfq'; 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var searchInput = document.getElementById(SEARCH_INPUT_ID); 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var result = cvox.Search.results[cvox.Search.index]; 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var ret = false; 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /* TODO(peterxiao): Add cvox api call to determine cvox key. */ 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (evt.shiftKey || evt.altKey || evt.ctrlKey) { 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /* Do not handle if search input has focus, or if the search widget 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * has focus. 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (document.activeElement !== searchInput && 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !cvox.SearchUtil.isSearchWidgetActive()) { 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (evt.keyCode) { 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case cvox.SearchConstants.KeyCode.UP: 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /* Add results.length because JS Modulo is silly. */ 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.index = cvox.SearchUtil.subOneWrap(cvox.Search.index, 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.results.length); 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (cvox.Search.index === cvox.Search.results.length - 1) { 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.earcons.playEarconByName('WRAP'); 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.syncToIndex(); 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case cvox.SearchConstants.KeyCode.DOWN: 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.index = cvox.SearchUtil.addOneWrap(cvox.Search.index, 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.results.length); 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (cvox.Search.index === 0) { 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.earcons.playEarconByName('WRAP'); 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.syncToIndex(); 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case cvox.SearchConstants.KeyCode.PAGE_UP: 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.navigatePage(false); 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case cvox.SearchConstants.KeyCode.PAGE_DOWN: 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.navigatePage(true); 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case cvox.SearchConstants.KeyCode.LEFT: 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.paneIndex = cvox.SearchUtil.subOneWrap(cvox.Search.paneIndex, 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.panes.length); 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.syncPaneToIndex(); 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case cvox.SearchConstants.KeyCode.RIGHT: 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.paneIndex = cvox.SearchUtil.addOneWrap(cvox.Search.paneIndex, 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.panes.length); 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.syncPaneToIndex(); 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case cvox.SearchConstants.KeyCode.ENTER: 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (cvox.Search.isPane) { 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.goToPane(); 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.goToResult(); 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default: 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) evt.preventDefault(); 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) evt.stopPropagation(); 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Adds the elements that match the selector to results. 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} selector Selector of element to add. 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.addToResultsBySelector = function(selector) { 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var nodes = document.querySelectorAll(selector); 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = 0; i < nodes.length; i++) { 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var node = nodes.item(i); 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /* Do not add if empty. */ 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (node.innerHTML !== '') { 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.results.push(nodes.item(i)); 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Populates the panes array. 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.populatePanes = function() { 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.panes = []; 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var PANE_SELECT = '.hdtb_mitem'; 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var paneElems = document.querySelectorAll(PANE_SELECT); 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = 0; i < paneElems.length; i++) { 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.panes.push(paneElems.item(i)); 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Populates the results with results. 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.populateResults = function() { 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var prop in cvox.Search.selectors) { 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.addToResultsBySelector(cvox.Search.selectors[prop]); 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Populates the results with ad results. 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.populateAdResults = function() { 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.results = []; 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var ADS_SELECT = '.ads-ad'; 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.addToResultsBySelector(ADS_SELECT); 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Observes mutations and updates results accordingly. 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.observeMutation = function() { 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var SEARCH_AREA_SELECT = '#rg_s'; 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var target = document.querySelector(SEARCH_AREA_SELECT); 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var observer = new MutationObserver(function(mutations) { 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.results = []; 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.populateResults(); 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }); 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var config = 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** @type MutationObserverInit */ 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ({ attributes: true, childList: true, characterData: true }); 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observer.observe(target, config); 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Get the current selected pane's index. 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {number} Index of selected pane. 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.getSelectedPaneIndex = function() { 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var panes = cvox.Search.panes; 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = 0; i < panes.length; i++) { 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (panes[i].className === cvox.Search.SELECTED_PANE_CLASS) { 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return i; 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 0; 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Get the ancestor of node that is a result. 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Node} node Node. 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {Node} Result ancestor. 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.getAncestorResult = function(node) { 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var curr = node; 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (curr) { 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var prop in cvox.Search.selectors) { 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var selector = cvox.Search.selectors[prop]; 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (curr.webkitMatchesSelector && curr.webkitMatchesSelector(selector)) { 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return curr; 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curr = curr.parentNode; 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return null; 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Sync to the correct initial node. 389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.initialSync = function() { 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var currNode = cvox.ChromeVox.navigationManager.getCurrentNode(); 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var result = cvox.Search.getAncestorResult(currNode); 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.index = cvox.Search.results.indexOf(result); 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (cvox.Search.index === -1) { 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.index = 0; 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (cvox.Search.results.length > 0) { 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.syncToIndex(); 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Initialize Search. 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.init = function() { 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.index = 0; 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /* Flush out anything that may have been speaking. */ 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.ChromeVox.tts.stop(); 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /* Determine the type of search. */ 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var SELECTED_CLASS = 'hdtb_msel'; 414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var selected = document.getElementsByClassName(SELECTED_CLASS)[0]; 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!selected) { 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var selectedHTML = selected.innerHTML; 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (selectedHTML) { 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case 'Web': 422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case 'News': 423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.selectors = cvox.Search.webSelectors; 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case 'Images': 426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.selectors = cvox.Search.imageSelectors; 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.observeMutation(); 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default: 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.populateResults(); 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.populatePanes(); 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.paneIndex = cvox.Search.getSelectedPaneIndex(); 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cvox.Search.initialSync(); 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 440