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

Side by Side Diff: chrome/browser/resources/history/history.js

Issue 685783003: history: fix more focus oddness. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: arv@ review Created 6 years, 1 month 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
« no previous file with comments | « no previous file | chrome/test/data/webui/history_browsertest.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <include src="../uber/uber_utils.js"> 5 <include src="../uber/uber_utils.js">
6 <include src="history_focus_manager.js"> 6 <include src="history_focus_manager.js">
7 7
8 /////////////////////////////////////////////////////////////////////////////// 8 ///////////////////////////////////////////////////////////////////////////////
9 // Globals: 9 // Globals:
10 /** @const */ var RESULTS_PER_PAGE = 150; 10 /** @const */ var RESULTS_PER_PAGE = 150;
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 this.domain_)); 205 this.domain_));
206 checkbox.addEventListener('click', checkboxClicked); 206 checkbox.addEventListener('click', checkboxClicked);
207 entryBox.appendChild(checkbox); 207 entryBox.appendChild(checkbox);
208 208
209 if (focusless) 209 if (focusless)
210 checkbox.tabIndex = -1; 210 checkbox.tabIndex = -1;
211 211
212 if (!isMobileVersion()) { 212 if (!isMobileVersion()) {
213 // Clicking anywhere in the entryBox will check/uncheck the checkbox. 213 // Clicking anywhere in the entryBox will check/uncheck the checkbox.
214 entryBox.setAttribute('for', checkbox.id); 214 entryBox.setAttribute('for', checkbox.id);
215 entryBox.addEventListener('mousedown', entryBoxMousedown); 215 entryBox.addEventListener('mousedown', this.handleMousedown_.bind(this));
216 entryBox.addEventListener('click', entryBoxClick); 216 entryBox.addEventListener('click', entryBoxClick);
217 entryBox.addEventListener('keydown', this.handleKeydown_.bind(this)); 217 entryBox.addEventListener('keydown', this.handleKeydown_.bind(this));
218 } 218 }
219 } 219 }
220 220
221 // Keep track of the drop down that triggered the menu, so we know 221 // Keep track of the drop down that triggered the menu, so we know
222 // which element to apply the command to. 222 // which element to apply the command to.
223 // TODO(dubroy): Ideally we'd use 'activate', but MenuButton swallows it. 223 // TODO(dubroy): Ideally we'd use 'activate', but MenuButton swallows it.
224 var setActiveVisit = function(e) { 224 var setActiveVisit = function(e) {
225 activeVisit = self; 225 activeVisit = self;
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 * @param {Event} e A keydown event to handle. 492 * @param {Event} e A keydown event to handle.
493 * @private 493 * @private
494 */ 494 */
495 Visit.prototype.handleKeydown_ = function(e) { 495 Visit.prototype.handleKeydown_ = function(e) {
496 // Delete or Backspace should delete the entry if allowed. 496 // Delete or Backspace should delete the entry if allowed.
497 if (e.keyIdentifier == 'U+0008' || e.keyIdentifier == 'U+007F') 497 if (e.keyIdentifier == 'U+0008' || e.keyIdentifier == 'U+007F')
498 this.removeEntryFromHistory_(e); 498 this.removeEntryFromHistory_(e);
499 }; 499 };
500 500
501 /** 501 /**
502 * @param {Event} event A mousedown event.
503 * @private
504 */
505 Visit.prototype.handleMousedown_ = function(event) {
506 // Prevent text selection when shift-clicking to select multiple entries.
507 if (event.shiftKey) {
508 event.preventDefault();
509
510 if (this.model_.getView().isInFocusGrid(event.target))
511 event.target.focus();
512 }
513 };
514
515 /**
502 * Removes a history entry on click or keydown and finds a new entry to focus. 516 * Removes a history entry on click or keydown and finds a new entry to focus.
503 * @param {Event} e A click or keydown event. 517 * @param {Event} e A click or keydown event.
504 * @private 518 * @private
505 */ 519 */
506 Visit.prototype.removeEntryFromHistory_ = function(e) { 520 Visit.prototype.removeEntryFromHistory_ = function(e) {
507 if (!this.model_.deletingHistoryAllowed || this.model_.isDeletingVisits() || 521 if (!this.model_.deletingHistoryAllowed || this.model_.isDeletingVisits() ||
508 this.domNode_.classList.contains('fade-out')) { 522 this.domNode_.classList.contains('fade-out')) {
509 return; 523 return;
510 } 524 }
511 525
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 * @return {Element} |row|'s "active" element. 905 * @return {Element} |row|'s "active" element.
892 * @private 906 * @private
893 */ 907 */
894 getActiveRowElement_: function(row) { 908 getActiveRowElement_: function(row) {
895 return findAncestorByClass(row.items[0], 'entry') || 909 return findAncestorByClass(row.items[0], 'entry') ||
896 findAncestorByClass(row.items[0], 'site-domain-wrapper'); 910 findAncestorByClass(row.items[0], 'site-domain-wrapper');
897 }, 911 },
898 }; 912 };
899 913
900 /////////////////////////////////////////////////////////////////////////////// 914 ///////////////////////////////////////////////////////////////////////////////
915 // HistoryFocusGrid:
916
917 /**
918 * @param {Node=} opt_boundary
919 * @param {cr.ui.FocusRow.Observer=} opt_observer
920 * @constructor
921 * @extends {cr.ui.FocusGrid}
922 */
923 function HistoryFocusGrid(opt_boundary, opt_observer) {
924 cr.ui.FocusGrid.apply(this, arguments);
925 }
926
927 HistoryFocusGrid.prototype = {
928 __proto__: cr.ui.FocusGrid.prototype,
929
930 /** @override */
931 onMousedown: function(row, e) {
932 return !!findAncestorByClass(e.target, 'menu-button');
933 },
934 };
935
936 ///////////////////////////////////////////////////////////////////////////////
901 // HistoryView: 937 // HistoryView:
902 938
903 /** 939 /**
904 * Functions and state for populating the page with HTML. This should one-day 940 * Functions and state for populating the page with HTML. This should one-day
905 * contain the view and use event handlers, rather than pushing HTML out and 941 * contain the view and use event handlers, rather than pushing HTML out and
906 * getting called externally. 942 * getting called externally.
907 * @param {HistoryModel} model The model backing this view. 943 * @param {HistoryModel} model The model backing this view.
908 * @constructor 944 * @constructor
909 */ 945 */
910 function HistoryView(model) { 946 function HistoryView(model) {
911 this.editButtonTd_ = $('edit-button'); 947 this.editButtonTd_ = $('edit-button');
912 this.editingControlsDiv_ = $('editing-controls'); 948 this.editingControlsDiv_ = $('editing-controls');
913 this.resultDiv_ = $('results-display'); 949 this.resultDiv_ = $('results-display');
914 this.focusGrid_ = new cr.ui.FocusGrid(this.resultDiv_, 950 this.focusGrid_ = new HistoryFocusGrid(this.resultDiv_,
915 new HistoryFocusObserver); 951 new HistoryFocusObserver);
916 this.pageDiv_ = $('results-pagination'); 952 this.pageDiv_ = $('results-pagination');
917 this.model_ = model; 953 this.model_ = model;
918 this.pageIndex_ = 0; 954 this.pageIndex_ = 0;
919 this.lastDisplayed_ = []; 955 this.lastDisplayed_ = [];
920 956
921 this.model_.setView(this); 957 this.model_.setView(this);
922 958
923 this.currentVisits_ = []; 959 this.currentVisits_ = [];
924 960
925 // If there is no search button, use the search button label as placeholder 961 // If there is no search button, use the search button label as placeholder
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1247 // If the bar does not fit beside the editing controls, put it into the 1283 // If the bar does not fit beside the editing controls, put it into the
1248 // overflow state. 1284 // overflow state.
1249 if (bar.getBoundingClientRect().top >= 1285 if (bar.getBoundingClientRect().top >=
1250 $('editing-controls').getBoundingClientRect().bottom) { 1286 $('editing-controls').getBoundingClientRect().bottom) {
1251 bar.classList.add('alone'); 1287 bar.classList.add('alone');
1252 } else { 1288 } else {
1253 bar.classList.remove('alone'); 1289 bar.classList.remove('alone');
1254 } 1290 }
1255 }; 1291 };
1256 1292
1293 /**
1294 * @param {Element} el An element to look for.
1295 * @return {boolean} Whether |el| is in |this.focusGrid_|.
1296 */
1297 HistoryView.prototype.isInFocusGrid = function(el) {
1298 return !!this.focusGrid_.getPositionForTarget(el);
1299 };
1300
1257 // HistoryView, private: ------------------------------------------------------ 1301 // HistoryView, private: ------------------------------------------------------
1258 1302
1259 /** 1303 /**
1260 * Clear the results in the view. Since we add results piecemeal, we need 1304 * Clear the results in the view. Since we add results piecemeal, we need
1261 * to clear them out when we switch to a new page or reload. 1305 * to clear them out when we switch to a new page or reload.
1262 * @private 1306 * @private
1263 */ 1307 */
1264 HistoryView.prototype.clear_ = function() { 1308 HistoryView.prototype.clear_ = function() {
1265 var alertOverlay = $('alertOverlay'); 1309 var alertOverlay = $('alertOverlay');
1266 if (alertOverlay && alertOverlay.classList.contains('showing')) 1310 if (alertOverlay && alertOverlay.classList.contains('showing'))
(...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after
2156 2200
2157 var entry = findAncestorByClass(checkbox, 'site-entry'); 2201 var entry = findAncestorByClass(checkbox, 'site-entry');
2158 if (!entry) 2202 if (!entry)
2159 return; 2203 return;
2160 2204
2161 var groupCheckbox = entry.querySelector('.site-domain-wrapper input'); 2205 var groupCheckbox = entry.querySelector('.site-domain-wrapper input');
2162 if (groupCheckbox) 2206 if (groupCheckbox)
2163 groupCheckbox.checked = false; 2207 groupCheckbox.checked = false;
2164 } 2208 }
2165 2209
2166 function entryBoxMousedown(event) {
2167 // Prevent text selection when shift-clicking to select multiple entries.
2168 if (event.shiftKey)
2169 event.preventDefault();
2170 }
2171
2172 /** 2210 /**
2173 * Handle click event for entryBoxes. 2211 * Handle click event for entryBoxes.
2174 * @param {!Event} event A click event. 2212 * @param {!Event} event A click event.
2175 */ 2213 */
2176 function entryBoxClick(event) { 2214 function entryBoxClick(event) {
2177 event = /** @type {!MouseEvent} */(event); 2215 event = /** @type {!MouseEvent} */(event);
2178 // Do nothing if a bookmark star is clicked. 2216 // Do nothing if a bookmark star is clicked.
2179 if (event.defaultPrevented) 2217 if (event.defaultPrevented)
2180 return; 2218 return;
2181 var element = event.target; 2219 var element = event.target;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2282 historyView.reload(); 2320 historyView.reload();
2283 } 2321 }
2284 2322
2285 // Add handlers to HTML elements. 2323 // Add handlers to HTML elements.
2286 document.addEventListener('DOMContentLoaded', load); 2324 document.addEventListener('DOMContentLoaded', load);
2287 2325
2288 // This event lets us enable and disable menu items before the menu is shown. 2326 // This event lets us enable and disable menu items before the menu is shown.
2289 document.addEventListener('canExecute', function(e) { 2327 document.addEventListener('canExecute', function(e) {
2290 e.canExecute = true; 2328 e.canExecute = true;
2291 }); 2329 });
OLDNEW
« no previous file with comments | « no previous file | chrome/test/data/webui/history_browsertest.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698