diff options
Diffstat (limited to 'chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/ui/select_widget.js')
-rw-r--r-- | chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/ui/select_widget.js | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/ui/select_widget.js b/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/ui/select_widget.js new file mode 100644 index 00000000000..0090b85bbac --- /dev/null +++ b/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/ui/select_widget.js @@ -0,0 +1,82 @@ +// 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 A widget hosting an HTML <select> element. + * In most cases, the browser's native key-driven usage model works for user + * interaction and manipulation of a <select>. However, on platforms like Mac + * OS X where <select> elements get their own renderer, users can still interact + * with <select> elements via a ChromeVox overlay/context widget. + */ + +goog.provide('cvox.SelectWidget'); + + +goog.require('cvox.OverlayWidget'); + + +/** + * @param {Node} node The select node. + * @constructor + * @extends {cvox.OverlayWidget} + */ +cvox.SelectWidget = function(node) { + goog.base(this, ''); + this.selectNode_ = node; +}; +goog.inherits(cvox.SelectWidget, cvox.OverlayWidget); + + +/** + * @override + */ +cvox.SelectWidget.prototype.show = function() { + goog.base(this, 'show'); + var container = document.createElement('div'); + container.setAttribute('role', 'menu'); + for (var i = 0, item = null; item = this.selectNode_.options[i]; i++) { + var newItem = document.createElement('p'); + newItem.innerHTML = item.innerHTML; + newItem.id = i; + newItem.setAttribute('role', 'menuitem'); + container.appendChild(newItem); + } + this.host_.appendChild(container); + var currentSelection = this.selectNode_.selectedIndex; + if (typeof(currentSelection) == 'number') { + cvox.ChromeVox.syncToNode(container.children[currentSelection], true); + } +}; + + +/** + * @override + */ +cvox.SelectWidget.prototype.hide = function(opt_noSync) { + var evt = document.createEvent('Event'); + evt.initEvent('change', false, false); + this.selectNode_.dispatchEvent(evt); + goog.base(this, 'hide', true); +}; + + +/** + * @override + */ +cvox.SelectWidget.prototype.onNavigate = function() { + var self = this; + cvox.ChromeVoxEventSuspender.withSuspendedEvents(function() { + var selectedIndex = + cvox.ChromeVox.navigationManager.getCurrentNode().parentNode.id; + self.selectNode_.selectedIndex = selectedIndex; + })(); +}; + + +/** + * @override + */ +cvox.SelectWidget.prototype.getNameMsg = function() { + return ['aria_role_menu']; +}; |