1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5/** 6 * @fileoverview A widget hosting an HTML <select> element. 7 * In most cases, the browser's native key-driven usage model works for user 8 * interaction and manipulation of a <select>. However, on platforms like Mac 9 * OS X where <select> elements get their own renderer, users can still interact 10 * with <select> elements via a ChromeVox overlay/context widget. 11 */ 12 13goog.provide('cvox.SelectWidget'); 14 15 16goog.require('cvox.OverlayWidget'); 17 18 19/** 20 * @param {Node} node The select node. 21 * @constructor 22 * @extends {cvox.OverlayWidget} 23 */ 24cvox.SelectWidget = function(node) { 25 goog.base(this, ''); 26 this.selectNode_ = node; 27}; 28goog.inherits(cvox.SelectWidget, cvox.OverlayWidget); 29 30 31/** 32 * @override 33 */ 34cvox.SelectWidget.prototype.show = function() { 35 goog.base(this, 'show'); 36 var container = document.createElement('div'); 37 container.setAttribute('role', 'menu'); 38 for (var i = 0, item = null; item = this.selectNode_.options[i]; i++) { 39 var newItem = document.createElement('p'); 40 newItem.innerHTML = item.innerHTML; 41 newItem.id = i; 42 newItem.setAttribute('role', 'menuitem'); 43 container.appendChild(newItem); 44 } 45 this.host_.appendChild(container); 46 var currentSelection = this.selectNode_.selectedIndex; 47 if (typeof(currentSelection) == 'number') { 48 cvox.ChromeVox.syncToNode(container.children[currentSelection], true); 49 } 50}; 51 52 53/** 54 * @override 55 */ 56cvox.SelectWidget.prototype.hide = function(opt_noSync) { 57 var evt = document.createEvent('Event'); 58 evt.initEvent('change', false, false); 59 this.selectNode_.dispatchEvent(evt); 60 goog.base(this, 'hide', true); 61}; 62 63 64/** 65 * @override 66 */ 67cvox.SelectWidget.prototype.onNavigate = function() { 68 var self = this; 69 cvox.ChromeVoxEventSuspender.withSuspendedEvents(function() { 70 var selectedIndex = 71 cvox.ChromeVox.navigationManager.getCurrentNode().parentNode.id; 72 self.selectNode_.selectedIndex = selectedIndex; 73 })(); 74}; 75 76 77/** 78 * @override 79 */ 80cvox.SelectWidget.prototype.getNameMsg = function() { 81 return ['aria_role_menu']; 82}; 83