Chromium Code Reviews| Index: chrome/browser/resources/history/history.js |
| diff --git a/chrome/browser/resources/history/history.js b/chrome/browser/resources/history/history.js |
| index a71592de4ee5d70587681b99c7b513c00db04f3a..fe3b580e6a19865fea81720c52b148dc63c75d2b 100644 |
| --- a/chrome/browser/resources/history/history.js |
| +++ b/chrome/browser/resources/history/history.js |
| @@ -250,6 +250,8 @@ Visit.prototype.getResultDOM = function(propertyBag) { |
| e.preventDefault(); |
| }.bind(this)); |
| } |
| + if (focusless) |
| + bookmarkSection.tabIndex = -1; |
| entryBox.appendChild(bookmarkSection); |
| var visitEntryWrapper = /** @type {HTMLElement} */( |
| @@ -895,22 +897,43 @@ function HistoryFocusObserver() {} |
| HistoryFocusObserver.prototype = { |
| /** @override */ |
| onActivate: function(row) { |
| - this.getActiveRowElement_(row).classList.add('active'); |
| + row.getRowElement().classList.add('active'); |
| }, |
| /** @override */ |
| onDeactivate: function(row) { |
| - this.getActiveRowElement_(row).classList.remove('active'); |
| + row.getRowElement().classList.remove('active'); |
| }, |
| /** |
| - * @param {cr.ui.FocusRow} row The row to find an element for. |
| + * @param {Element} item The row item to find a a row element for. |
| * @return {Element} |row|'s "active" element. |
| - * @private |
| + * @override |
| */ |
| - getActiveRowElement_: function(row) { |
| - return findAncestorByClass(row.items[0], 'entry') || |
| - findAncestorByClass(row.items[0], 'site-domain-wrapper'); |
| + getRowElement: function(item) { |
| + return findAncestorByClass(item, 'entry') || |
| + findAncestorByClass(item, 'site-domain-wrapper'); |
| + }, |
| + |
| + /** @override */ |
| + onElementIdMiss: function(row, expectedId) { |
| + // Clickable titles. |
| + if (expectedId == 'domain') |
| + return 'title'; |
| + if (expectedId == 'title') |
| + return 'domain'; |
| + |
| + // Select the title or the domain if there is no bookmarked star. |
| + if (expectedId == 'star') { |
| + if (row.elementIds.indexOf('title') != -1) |
| + return 'title'; |
| + return 'domain'; |
| + } |
| + |
| + if (expectedId == 'menu') |
| + return row.elementIds[row.elementIds.length - 1]; |
| + |
| + return null; |
| }, |
| }; |
| @@ -1204,7 +1227,7 @@ HistoryView.prototype.onBeforeRemove = function(visit) { |
| var row = this.focusGrid_.rows[pos.row + 1] || |
| this.focusGrid_.rows[pos.row - 1]; |
| if (row) |
| - row.focusIndex(Math.min(pos.col, row.items.length - 1)); |
| + row.setFocusId(pos.elementId); |
| }; |
| /** @param {Visit} visit The visit about to be unstarred. */ |
| @@ -1214,7 +1237,7 @@ HistoryView.prototype.onBeforeUnstarred = function(visit) { |
| var pos = this.focusGrid_.getPositionForTarget(document.activeElement); |
| var row = this.focusGrid_.rows[pos.row]; |
| - row.focusIndex(Math.min(pos.col + 1, row.items.length - 1)); |
| + row.setFocusId(pos.elementId); |
| }; |
| /** @param {Visit} visit The visit that was just unstarred. */ |
| @@ -1674,26 +1697,44 @@ var focusGridRowSelector = [ |
| '.site-domain-wrapper' |
| ].join(', '); |
| -var focusGridColumnSelector = [ |
| - '.entry-box input', |
| - '.bookmark-section.starred', |
| - '.title a', |
| - '.drop-down', |
| - '.domain-checkbox', |
| - '[is="action-link"]', |
| -].join(', '); |
| +/** |
| + * Add a column to |focusRow| if it exists in |row|. |
| + * @param {Element} row The row that should contain the element. |
| + * @param {cr.ui.FocusRow} focusRow The focus row to add the element to. |
| + * @param {string} query A query to select the appropriate element in |row|. |
| + * @param {string} elementId The elementId to use in |focusRow|. |
| + * @private |
| + */ |
| +HistoryView.prototype.addFocusRow_ = function(row, focusRow, query, elementId) { |
| + var element = row.querySelectorAll(query); |
| + |
| + // There should only be 0 or 1 matches. |
| + if (element.length == 1) |
| + focusRow.setFocusableElementId(element[0], elementId); |
| + else |
| + assert(element.length == 0); |
| +}; |
| /** @private */ |
| HistoryView.prototype.updateFocusGrid_ = function() { |
| var rows = this.resultDiv_.querySelectorAll(focusGridRowSelector); |
| - var grid = []; |
| + this.focusGrid_.destroy(); |
| for (var i = 0; i < rows.length; ++i) { |
| assert(rows[i].parentNode); |
| - grid.push(rows[i].querySelectorAll(focusGridColumnSelector)); |
| - } |
| + var focusRow = this.focusGrid_.createRow(); |
| + |
| + // These 2 buttons are mutually exclusive, but visually the same. |
|
dmazzoni
2015/01/15 19:38:19
I don't quite understand this comment.
hcarmona
2015/01/16 21:39:06
Done.
|
| + this.addFocusRow_(rows[i], focusRow, '.entry-box input', 'checkbox'); |
| + this.addFocusRow_(rows[i], focusRow, '.domain-checkbox', 'checkbox'); |
| - this.focusGrid_.setGrid(grid); |
| + this.addFocusRow_(rows[i], focusRow, '.bookmark-section.starred', 'star'); |
| + this.addFocusRow_(rows[i], focusRow, '[is="action-link"]', 'domain'); |
| + this.addFocusRow_(rows[i], focusRow, '.title a', 'title'); |
| + this.addFocusRow_(rows[i], focusRow, '.drop-down', 'menu'); |
| + |
| + this.focusGrid_.addRow(focusRow); |
| + } |
| }; |
| /** |