Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Side by Side Diff: chrome/browser/resources/shared/js/cr/ui/list.js

Issue 10376003: Improve accessibility of user image selection screen. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase, simplify change so it doesn't affect other uses of Grid/List Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // require: array_data_model.js 5 // require: array_data_model.js
6 // require: list_selection_model.js 6 // require: list_selection_model.js
7 // require: list_selection_controller.js 7 // require: list_selection_controller.js
8 // require: list_item.js 8 // require: list_item.js
9 9
10 /** 10 /**
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 remainingSpace_: true, 84 remainingSpace_: true,
85 85
86 /** 86 /**
87 * Function used to create grid items. 87 * Function used to create grid items.
88 * @type {function(): !ListItem} 88 * @type {function(): !ListItem}
89 * @private 89 * @private
90 */ 90 */
91 itemConstructor_: cr.ui.ListItem, 91 itemConstructor_: cr.ui.ListItem,
92 92
93 /** 93 /**
94 * The prefix to use when giving each item a unique id.
95 * @type {string}
96 * @private
97 */
98 uniqueIdPrefix_: 'list',
99
100 /**
101 * The next id suffix to use when giving each item an unique id.
102 * @type {number}
103 * @private
104 */
105 nextUniqueIdSuffix_: 0,
Ivan Korotkov 2012/08/03 01:00:23 Don't put them into prototype: that makes them sha
dmazzoni 2012/08/03 22:59:01 Moved to decorate(), or did you have something els
Ivan Korotkov 2012/08/03 23:19:37 decorate is OK
106
107 /**
94 * Function used to create grid items. 108 * Function used to create grid items.
95 * @type {function(): !ListItem} 109 * @type {function(): !ListItem}
96 */ 110 */
97 get itemConstructor() { 111 get itemConstructor() {
98 return this.itemConstructor_; 112 return this.itemConstructor_;
99 }, 113 },
100 set itemConstructor(func) { 114 set itemConstructor(func) {
101 if (func != this.itemConstructor_) { 115 if (func != this.itemConstructor_) {
102 this.itemConstructor_ = func; 116 this.itemConstructor_ = func;
103 this.cachedItems_ = {}; 117 this.cachedItems_ = {};
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 var length = this.dataModel ? this.dataModel.length : 0; 326 var length = this.dataModel ? this.dataModel.length : 0;
313 this.selectionModel = new ListSelectionModel(length); 327 this.selectionModel = new ListSelectionModel(length);
314 328
315 this.addEventListener('dblclick', this.handleDoubleClickOrTap_); 329 this.addEventListener('dblclick', this.handleDoubleClickOrTap_);
316 this.addEventListener('mousedown', this.handlePointerDownUp_); 330 this.addEventListener('mousedown', this.handlePointerDownUp_);
317 this.addEventListener('mouseup', this.handlePointerDownUp_); 331 this.addEventListener('mouseup', this.handlePointerDownUp_);
318 this.addEventListener('keydown', this.handleKeyDown); 332 this.addEventListener('keydown', this.handleKeyDown);
319 this.addEventListener('focus', this.handleElementFocus_, true); 333 this.addEventListener('focus', this.handleElementFocus_, true);
320 this.addEventListener('blur', this.handleElementBlur_, true); 334 this.addEventListener('blur', this.handleElementBlur_, true);
321 this.addEventListener('scroll', this.handleScroll.bind(this)); 335 this.addEventListener('scroll', this.handleScroll.bind(this));
322 this.setAttribute('role', 'listbox'); 336 this.setAttribute('role', 'list');
323 337
324 this.touchHandler_ = new cr.ui.TouchHandler(this); 338 this.touchHandler_ = new cr.ui.TouchHandler(this);
325 this.addEventListener(cr.ui.TouchHandler.EventType.TOUCH_START, 339 this.addEventListener(cr.ui.TouchHandler.EventType.TOUCH_START,
326 this.handlePointerDownUp_); 340 this.handlePointerDownUp_);
327 this.addEventListener(cr.ui.TouchHandler.EventType.TOUCH_END, 341 this.addEventListener(cr.ui.TouchHandler.EventType.TOUCH_END,
328 this.handlePointerDownUp_); 342 this.handlePointerDownUp_);
329 this.addEventListener(cr.ui.TouchHandler.EventType.TAP, 343 this.addEventListener(cr.ui.TouchHandler.EventType.TAP,
330 this.handleDoubleClickOrTap_); 344 this.handleDoubleClickOrTap_);
331 this.touchHandler_.enable(false, false); 345 this.touchHandler_.enable(false, false);
332 // Make list focusable 346 // Make list focusable
333 if (!this.hasAttribute('tabindex')) 347 if (!this.hasAttribute('tabindex'))
334 this.tabIndex = 0; 348 this.tabIndex = 0;
349
350 // Try to get an unique id prefix from the id of this element or the
351 // nearest ancestor with an id.
352 var element = this;
353 while (element && !element.id)
354 element = element.parentElement;
355 if (element && element.id)
356 this.uniqueIdPrefix_ = element.id;
335 }, 357 },
336 358
337 /** 359 /**
338 * @param {ListItem=} item The list item to measure. 360 * @param {ListItem=} item The list item to measure.
339 * @return {number} The height of the given item. If the fixed height on CSS 361 * @return {number} The height of the given item. If the fixed height on CSS
340 * is set by 'px', uses that value as height. Otherwise, measures the size. 362 * is set by 'px', uses that value as height. Otherwise, measures the size.
341 * @private 363 * @private
342 */ 364 */
343 measureItemHeight_: function(item) { 365 measureItemHeight_: function(item) {
344 var height = item.style.height; 366 var height = item.style.height;
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 597
576 /** 598 /**
577 * Callback from the selection model. We dispatch {@code change} events 599 * Callback from the selection model. We dispatch {@code change} events
578 * when the selection changes. 600 * when the selection changes.
579 * @param {!cr.Event} e Event with change info. 601 * @param {!cr.Event} e Event with change info.
580 * @private 602 * @private
581 */ 603 */
582 handleOnChange_: function(ce) { 604 handleOnChange_: function(ce) {
583 ce.changes.forEach(function(change) { 605 ce.changes.forEach(function(change) {
584 var listItem = this.getListItemByIndex(change.index); 606 var listItem = this.getListItemByIndex(change.index);
585 if (listItem) 607 if (listItem) {
586 listItem.selected = change.selected; 608 listItem.selected = change.selected;
609 if (change.selected)
610 this.setAttribute('aria-activedescendant', listItem.id);
Ivan Korotkov 2012/08/03 01:00:23 Indentation.
dmazzoni 2012/08/03 22:59:01 Done.
611 }
587 }, this); 612 }, this);
588 613
589 cr.dispatchSimpleEvent(this, 'change'); 614 cr.dispatchSimpleEvent(this, 'change');
590 }, 615 },
591 616
592 /** 617 /**
593 * Handles a change of the lead item from the selection model. 618 * Handles a change of the lead item from the selection model.
594 * @param {Event} pe The property change event. 619 * @param {Event} pe The property change event.
595 * @private 620 * @private
596 */ 621 */
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 }, 834 },
810 835
811 /** 836 /**
812 * Creates a new list item. 837 * Creates a new list item.
813 * @param {*} value The value to use for the item. 838 * @param {*} value The value to use for the item.
814 * @return {!ListItem} The newly created list item. 839 * @return {!ListItem} The newly created list item.
815 */ 840 */
816 createItem: function(value) { 841 createItem: function(value) {
817 var item = new this.itemConstructor_(value); 842 var item = new this.itemConstructor_(value);
818 item.label = value; 843 item.label = value;
844 item.id = this.uniqueIdPrefix_ + '-' + this.nextUniqueIdSuffix_++;
819 if (typeof item.decorate == 'function') 845 if (typeof item.decorate == 'function')
820 item.decorate(); 846 item.decorate();
821 return item; 847 return item;
822 }, 848 },
823 849
824 /** 850 /**
825 * Creates the selection controller to use internally. 851 * Creates the selection controller to use internally.
826 * @param {cr.ui.ListSelectionModel} sm The underlying selection model. 852 * @param {cr.ui.ListSelectionModel} sm The underlying selection model.
827 * @return {!cr.ui.ListSelectionController} The newly created selection 853 * @return {!cr.ui.ListSelectionController} The newly created selection
828 * controller. 854 * controller.
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 * because list items can contain controls that can be focused, and for some 1291 * because list items can contain controls that can be focused, and for some
1266 * purposes (e.g., styling), the list can still be conceptually focused at 1292 * purposes (e.g., styling), the list can still be conceptually focused at
1267 * that point even though it doesn't actually have the page focus. 1293 * that point even though it doesn't actually have the page focus.
1268 */ 1294 */
1269 cr.defineProperty(List, 'hasElementFocus', cr.PropertyKind.BOOL_ATTR); 1295 cr.defineProperty(List, 'hasElementFocus', cr.PropertyKind.BOOL_ATTR);
1270 1296
1271 return { 1297 return {
1272 List: List 1298 List: List
1273 }; 1299 };
1274 }); 1300 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698