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