| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 cr.define('downloads', function() { | 5 cr.define('downloads', function() { |
| 6 /** | 6 /** |
| 7 * Provides an implementation for a single column grid. | 7 * Provides an implementation for a single column grid. |
| 8 * @constructor | 8 * @constructor |
| 9 * @extends {cr.ui.FocusRow} | 9 * @extends {cr.ui.FocusRow} |
| 10 */ | 10 */ |
| 11 function FocusRow() {} | 11 function FocusRow() {} |
| 12 | 12 |
| 13 /** | 13 /** |
| 14 * Decorates |focusRow| so that it can be treated as a FocusRow. | 14 * Decorates |focusRow| so that it can be treated as a FocusRow. |
| 15 * @param {Element} focusRow The element that has all the columns represented | 15 * @param {Element} focusRow The element that has all the columns represented |
| 16 * by |itemView|. | 16 * by |itemView|. |
| 17 * @param {!downloads.ItemView} itemView The item view this row cares about. | 17 * @param {!downloads.ItemView} itemView The item view this row cares about. |
| 18 * @param {Node} boundary Focus events are ignored outside of this node. | 18 * @param {Node} boundary Focus events are ignored outside of this node. |
| 19 */ | 19 */ |
| 20 FocusRow.decorate = function(focusRow, itemView, boundary) { | 20 FocusRow.decorate = function(focusRow, itemView, boundary) { |
| 21 focusRow.__proto__ = FocusRow.prototype; | 21 focusRow.__proto__ = FocusRow.prototype; |
| 22 focusRow.decorate(boundary); | 22 focusRow.decorate(boundary); |
| 23 focusRow.addFocusableElements_(); | 23 focusRow.addFocusableElements_(); |
| 24 }; | 24 }; |
| 25 | 25 |
| 26 /** |
| 27 * Determines if element should be focusable. |
| 28 * @param {Element} element |
| 29 * @return {boolean} |
| 30 */ |
| 31 FocusRow.shouldFocus = function(element) { |
| 32 if (!element) |
| 33 return false; |
| 34 |
| 35 // Hidden elements are not focusable. |
| 36 var style = window.getComputedStyle(element); |
| 37 if (style.visibility == 'hidden' || style.display == 'none') |
| 38 return false; |
| 39 |
| 40 // Verify all ancestors are focusable. |
| 41 return !element.parentElement || |
| 42 FocusRow.shouldFocus(element.parentElement); |
| 43 }; |
| 44 |
| 26 FocusRow.prototype = { | 45 FocusRow.prototype = { |
| 27 __proto__: cr.ui.FocusRow.prototype, | 46 __proto__: cr.ui.FocusRow.prototype, |
| 28 | 47 |
| 29 /** @override */ | 48 /** @override */ |
| 30 getEquivalentElement: function(element) { | 49 getEquivalentElement: function(element) { |
| 31 if (this.focusableElements.indexOf(element) > -1) | 50 if (this.focusableElements.indexOf(element) > -1) |
| 32 return assert(element); | 51 return assert(element); |
| 33 | 52 |
| 34 // All elements default to another element with the same type. | 53 // All elements default to another element with the same type. |
| 35 var columnType = element.getAttribute('column-type'); | 54 var columnType = element.getAttribute('column-type'); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 49 | 68 |
| 50 // Return the first focusable element if no equivalent element is found. | 69 // Return the first focusable element if no equivalent element is found. |
| 51 return assert(equivalent || this.focusableElements[0]); | 70 return assert(equivalent || this.focusableElements[0]); |
| 52 }, | 71 }, |
| 53 | 72 |
| 54 /** @private */ | 73 /** @private */ |
| 55 addFocusableElements_: function() { | 74 addFocusableElements_: function() { |
| 56 var possiblyFocusableElements = this.querySelectorAll('[column-type]'); | 75 var possiblyFocusableElements = this.querySelectorAll('[column-type]'); |
| 57 for (var i = 0; i < possiblyFocusableElements.length; ++i) { | 76 for (var i = 0; i < possiblyFocusableElements.length; ++i) { |
| 58 var possiblyFocusableElement = possiblyFocusableElements[i]; | 77 var possiblyFocusableElement = possiblyFocusableElements[i]; |
| 59 if (this.shouldFocus_(possiblyFocusableElement)) | 78 if (FocusRow.shouldFocus(possiblyFocusableElement)) |
| 60 this.addFocusableElement(possiblyFocusableElement); | 79 this.addFocusableElement(possiblyFocusableElement); |
| 61 } | 80 } |
| 62 }, | 81 }, |
| 63 | |
| 64 /** | |
| 65 * Determines if element should be focusable. | |
| 66 * @param {Element} element | |
| 67 * @return {boolean} | |
| 68 * @private | |
| 69 */ | |
| 70 shouldFocus_: function(element) { | |
| 71 if (!element) | |
| 72 return false; | |
| 73 | |
| 74 // Hidden elements are not focusable. | |
| 75 var style = window.getComputedStyle(element); | |
| 76 if (style.visibility == 'hidden' || style.display == 'none') | |
| 77 return false; | |
| 78 | |
| 79 // Verify all ancestors are focusable. | |
| 80 return !element.parentElement || this.shouldFocus_(element.parentElement); | |
| 81 }, | |
| 82 }; | 82 }; |
| 83 | 83 |
| 84 return {FocusRow: FocusRow}; | 84 return {FocusRow: FocusRow}; |
| 85 }); | 85 }); |
| OLD | NEW |