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

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

Issue 976173003: Fix bug where |i| was reused in a nested loop. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « no previous file | no next file » | 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) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 /** 5 /**
6 * @fileoverview The section of the history page that shows tabs from sessions 6 * @fileoverview The section of the history page that shows tabs from sessions
7 on other devices. 7 on other devices.
8 */ 8 */
9 9
10 /////////////////////////////////////////////////////////////////////////////// 10 ///////////////////////////////////////////////////////////////////////////////
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 // Device, Public: ------------------------------------------------------------ 160 // Device, Public: ------------------------------------------------------------
161 161
162 /** 162 /**
163 * Get the DOM node to display this device. 163 * Get the DOM node to display this device.
164 * @param {int} maxNumTabs The maximum number of tabs to display. 164 * @param {int} maxNumTabs The maximum number of tabs to display.
165 * @param {int} row The row in which this device is displayed. 165 * @param {int} row The row in which this device is displayed.
166 * @return {Object} A DOM node to draw the device. 166 * @return {Object} A DOM node to draw the device.
167 */ 167 */
168 Device.prototype.getDOMNode = function(maxNumTabs, row) { 168 Device.prototype.getDOMNode = function(maxNumTabs, row) {
169 var deviceDiv = createElementWithClassName('div', 'device'); 169 var deviceDiv = createElementWithClassName('div', 'device');
170 this.focusGrid_ = new cr.ui.FocusGrid();
170 this.row_ = row; 171 this.row_ = row;
171 if (!this.session_) 172 if (!this.session_)
172 return deviceDiv; 173 return deviceDiv;
173 174
174 // Name heading 175 // Name heading
175 var heading = document.createElement('h3'); 176 var heading = document.createElement('h3');
176 var name = heading.appendChild( 177 var name = heading.appendChild(
177 createElementWithClassName('span', 'device-name')); 178 createElementWithClassName('span', 'device-name'));
178 name.textContent = this.session_.name; 179 name.textContent = this.session_.name;
179 heading.sessionData_ = this.session_; 180 heading.sessionData_ = this.session_;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 238
238 // Device, Private ------------------------------------------------------------ 239 // Device, Private ------------------------------------------------------------
239 240
240 /** 241 /**
241 * Create the DOM tree representing the tabs and windows of this device. 242 * Create the DOM tree representing the tabs and windows of this device.
242 * @param {int} maxNumTabs The maximum number of tabs to display. 243 * @param {int} maxNumTabs The maximum number of tabs to display.
243 * @return {Element} A single div containing the list of tabs & windows. 244 * @return {Element} A single div containing the list of tabs & windows.
244 * @private 245 * @private
245 */ 246 */
246 Device.prototype.createSessionContents_ = function(maxNumTabs) { 247 Device.prototype.createSessionContents_ = function(maxNumTabs) {
247 var contents = createElementWithClassName('ol', 'device-contents'); 248 var contents = createElementWithClassName('div', '');
249
250 // |list| will be used as the boundary for the DevicesViewFocusRows.
251 var list = createElementWithClassName('ol', 'device-contents');
252 contents.appendChild(list);
248 253
249 var sessionTag = this.session_.tag; 254 var sessionTag = this.session_.tag;
250 var numTabsShown = 0; 255 var numTabsShown = 0;
251 var numTabsHidden = 0; 256 var numTabsHidden = 0;
252 for (var i = 0; i < this.session_.windows.length; i++) { 257 for (var i = 0; i < this.session_.windows.length; i++) {
253 var win = this.session_.windows[i]; 258 var win = this.session_.windows[i];
254 if (win.hidden) 259 if (win.hidden)
255 continue; 260 continue;
256 261
257 // Show a separator between multiple windows in the same session. 262 // Show a separator between multiple windows in the same session.
258 if (i > 0 && numTabsShown < maxNumTabs) 263 if (i > 0 && numTabsShown < maxNumTabs)
259 contents.appendChild(document.createElement('hr')); 264 list.appendChild(document.createElement('hr'));
260 265
261 for (var j = 0; j < win.tabs.length; j++) { 266 for (var j = 0; j < win.tabs.length; j++) {
262 var tab = win.tabs[j]; 267 var tab = win.tabs[j];
263 if (tab.hidden) 268 if (tab.hidden)
264 continue; 269 continue;
265 270
266 if (numTabsShown < maxNumTabs) { 271 if (numTabsShown < maxNumTabs) {
267 numTabsShown++; 272 numTabsShown++;
268 var a = createElementWithClassName('a', 'device-tab-entry'); 273 var a = createElementWithClassName('a', 'device-tab-entry');
269 a.href = tab.url; 274 a.href = tab.url;
(...skipping 10 matching lines...) Expand all
280 return function(e) { 285 return function(e) {
281 recordUmaEvent_(HISTOGRAM_EVENT.LINK_CLICKED); 286 recordUmaEvent_(HISTOGRAM_EVENT.LINK_CLICKED);
282 chrome.send('openForeignSession', [sessionTag, windowId, tabId, 287 chrome.send('openForeignSession', [sessionTag, windowId, tabId,
283 e.button, e.altKey, e.ctrlKey, e.metaKey, e.shiftKey]); 288 e.button, e.altKey, e.ctrlKey, e.metaKey, e.shiftKey]);
284 e.preventDefault(); 289 e.preventDefault();
285 }; 290 };
286 }; 291 };
287 a.addEventListener('click', makeClickHandler(sessionTag, 292 a.addEventListener('click', makeClickHandler(sessionTag,
288 String(win.sessionId), 293 String(win.sessionId),
289 String(tab.sessionId))); 294 String(tab.sessionId)));
290 contents.appendChild(a); 295 list.appendChild(a);
296 DevicesViewFocusRow.decorate(a, list);
297 this.focusGrid_.addRow(a);
291 } else { 298 } else {
292 numTabsHidden++; 299 numTabsHidden++;
293 } 300 }
294 } 301 }
295 } 302 }
296 303
297 if (numTabsHidden > 0) { 304 if (numTabsHidden > 0) {
298 var moreLink = document.createElement('a', 'action-link'); 305 var moreLink = document.createElement('a', 'action-link');
299 moreLink.classList.add('device-show-more-tabs'); 306 moreLink.classList.add('device-show-more-tabs');
300 moreLink.addEventListener('click', this.view_.increaseRowHeight.bind( 307 moreLink.addEventListener('click', this.view_.increaseRowHeight.bind(
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 352
346 /** 353 /**
347 * Functions and state for populating the page with HTML. 354 * Functions and state for populating the page with HTML.
348 * @constructor 355 * @constructor
349 */ 356 */
350 function DevicesView() { 357 function DevicesView() {
351 this.devices_ = []; // List of individual devices. 358 this.devices_ = []; // List of individual devices.
352 this.resultDiv_ = $('other-devices'); 359 this.resultDiv_ = $('other-devices');
353 this.searchText_ = ''; 360 this.searchText_ = '';
354 this.rowHeights_ = [NB_ENTRIES_FIRST_ROW_COLUMN]; 361 this.rowHeights_ = [NB_ENTRIES_FIRST_ROW_COLUMN];
355 this.focusGrids_ = [];
356 this.updateSignInState(loadTimeData.getBoolean('isUserSignedIn')); 362 this.updateSignInState(loadTimeData.getBoolean('isUserSignedIn'));
357 recordUmaEvent_(HISTOGRAM_EVENT.INITIALIZED); 363 recordUmaEvent_(HISTOGRAM_EVENT.INITIALIZED);
358 } 364 }
359 365
360 // DevicesView, public: ------------------------------------------------------- 366 // DevicesView, public: -------------------------------------------------------
361 367
362 /** 368 /**
363 * Updates our sign in state by clearing the view is not signed in or sending 369 * Updates our sign in state by clearing the view is not signed in or sending
364 * a request to get the data to display otherwise. 370 * a request to get the data to display otherwise.
365 * @param {boolean} signedIn Whether the user is signed in or not. 371 * @param {boolean} signedIn Whether the user is signed in or not.
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 // width, and the nodeValue could contain sub nodes for highlighting, which 501 // width, and the nodeValue could contain sub nodes for highlighting, which
496 // makes it harder to extract the text data here. 502 // makes it harder to extract the text data here.
497 tabs = document.getElementsByClassName('device-tab-entry'); 503 tabs = document.getElementsByClassName('device-tab-entry');
498 for (var i = 0; i < tabs.length; i++) { 504 for (var i = 0; i < tabs.length; i++) {
499 if (tabs[i].scrollWidth <= tabs[i].clientWidth) 505 if (tabs[i].scrollWidth <= tabs[i].clientWidth)
500 tabs[i].title = ''; 506 tabs[i].title = '';
501 } 507 }
502 508
503 this.resultDiv_.appendChild( 509 this.resultDiv_.appendChild(
504 createElementWithClassName('div', 'other-devices-bottom')); 510 createElementWithClassName('div', 'other-devices-bottom'));
505
506 this.focusGrids_.forEach(function(grid) { grid.destroy(); });
507 this.focusGrids_.length = 0;
508
509 var devices = this.resultDiv_.querySelectorAll('.device-contents');
510 for (var i = 0; i < devices.length; ++i) {
511 var rows = devices[i].querySelectorAll('.device-tab-entry, button');
512 if (!rows.length)
513 continue;
514
515 var grid = new cr.ui.FocusGrid();
516 for (var i = 0; i < rows.length; ++i) {
Dan Beam 2015/03/05 02:25:56 oh, this is the problem? i'd just change i -> j h
517 DevicesViewFocusRow.decorate(rows[i], devices[i]);
518 grid.addRow(rows[i]);
519 }
520 this.focusGrids_.push(grid);
521 }
522 }; 511 };
523 512
524 /** 513 /**
525 * Sets the menu model data. An empty list means that either there are no 514 * Sets the menu model data. An empty list means that either there are no
526 * foreign sessions, or tab sync is disabled for this profile. 515 * foreign sessions, or tab sync is disabled for this profile.
527 * |isTabSyncEnabled| makes it possible to distinguish between the cases. 516 * |isTabSyncEnabled| makes it possible to distinguish between the cases.
528 * 517 *
529 * @param {Array} sessionList Array of objects describing the sessions 518 * @param {Array} sessionList Array of objects describing the sessions
530 * from other devices. 519 * from other devices.
531 * @param {boolean} isTabSyncEnabled Is tab sync enabled for this profile? 520 * @param {boolean} isTabSyncEnabled Is tab sync enabled for this profile?
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 567
579 var doSearch = function(e) { 568 var doSearch = function(e) {
580 devicesView.setSearchText($('search-field').value); 569 devicesView.setSearchText($('search-field').value);
581 }; 570 };
582 $('search-field').addEventListener('search', doSearch); 571 $('search-field').addEventListener('search', doSearch);
583 $('search-button').addEventListener('click', doSearch); 572 $('search-button').addEventListener('click', doSearch);
584 } 573 }
585 574
586 // Add handlers to HTML elements. 575 // Add handlers to HTML elements.
587 document.addEventListener('DOMContentLoaded', load); 576 document.addEventListener('DOMContentLoaded', load);
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698