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

Side by Side Diff: chrome/browser/resources/chromeos/login/user_pod_row.js

Issue 24625003: Delay wallpaper load by 2 * average wallpaper load time. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 7 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
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="wallpaper_loader.js"></include>
6
5 /** 7 /**
6 * @fileoverview User pod row implementation. 8 * @fileoverview User pod row implementation.
7 */ 9 */
8 10
9 cr.define('login', function() { 11 cr.define('login', function() {
10 /** 12 /**
11 * Number of displayed columns depending on user pod count. 13 * Number of displayed columns depending on user pod count.
12 * @type {Array.<number>} 14 * @type {Array.<number>}
13 * @const 15 * @const
14 */ 16 */
15 var COLUMNS = [0, 1, 2, 3, 4, 5, 4, 4, 4, 5, 5, 6, 6, 5, 5, 6, 6, 6, 6]; 17 var COLUMNS = [0, 1, 2, 3, 4, 5, 4, 4, 4, 5, 5, 6, 6, 5, 5, 6, 6, 6, 6];
16 18
17 /** 19 /**
18 * Whether to preselect the first pod automatically on login screen. 20 * Whether to preselect the first pod automatically on login screen.
19 * @type {boolean} 21 * @type {boolean}
20 * @const 22 * @const
21 */ 23 */
22 var PRESELECT_FIRST_POD = true; 24 var PRESELECT_FIRST_POD = true;
23 25
24 /** 26 /**
25 * Wallpaper load delay in milliseconds.
26 * @type {number}
27 * @const
28 */
29 var WALLPAPER_LOAD_DELAY_MS = 500;
30
31 /**
32 * Wallpaper load delay in milliseconds. TODO(nkostylev): Tune this constant.
33 * @type {number}
34 * @const
35 */
36 var WALLPAPER_BOOT_LOAD_DELAY_MS = 100;
37
38 /**
39 * Maximum time for which the pod row remains hidden until all user images 27 * Maximum time for which the pod row remains hidden until all user images
40 * have been loaded. 28 * have been loaded.
41 * @type {number} 29 * @type {number}
42 * @const 30 * @const
43 */ 31 */
44 var POD_ROW_IMAGES_LOAD_TIMEOUT_MS = 3000; 32 var POD_ROW_IMAGES_LOAD_TIMEOUT_MS = 3000;
45 33
46 /** 34 /**
47 * Public session help topic identifier. 35 * Public session help topic identifier.
48 * @type {number} 36 * @type {number}
(...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 * @extends {HTMLDivElement} 940 * @extends {HTMLDivElement}
953 */ 941 */
954 var PodRow = cr.ui.define('podrow'); 942 var PodRow = cr.ui.define('podrow');
955 943
956 PodRow.prototype = { 944 PodRow.prototype = {
957 __proto__: HTMLDivElement.prototype, 945 __proto__: HTMLDivElement.prototype,
958 946
959 // Whether this user pod row is shown for the first time. 947 // Whether this user pod row is shown for the first time.
960 firstShown_: true, 948 firstShown_: true,
961 949
962 // Whether the initial wallpaper load after boot has been requested. Used
963 // only if |Oobe.getInstance().shouldLoadWallpaperOnBoot()| is true.
964 bootWallpaperLoaded_: false,
965
966 // True if inside focusPod(). 950 // True if inside focusPod().
967 insideFocusPod_: false, 951 insideFocusPod_: false,
968 952
969 // True if user pod has been activated with keyboard.
970 // In case of activation with keyboard we delay wallpaper change.
971 keyboardActivated_: false,
972
973 // Focused pod. 953 // Focused pod.
974 focusedPod_: undefined, 954 focusedPod_: undefined,
975 955
976 // Activated pod, i.e. the pod of current login attempt. 956 // Activated pod, i.e. the pod of current login attempt.
977 activatedPod_: undefined, 957 activatedPod_: undefined,
978 958
979 // Pod that was most recently focused, if any. 959 // Pod that was most recently focused, if any.
980 lastFocusedPod_: undefined, 960 lastFocusedPod_: undefined,
981 961
982 // When moving through users quickly at login screen, set a timeout to 962 // Note: created only in decorate() !
983 // prevent loading intermediate wallpapers. 963 wallpaperLoader_: undefined,
984 loadWallpaperTimeout_: null,
985 964
986 // Pods whose initial images haven't been loaded yet. 965 // Pods whose initial images haven't been loaded yet.
987 podsWithPendingImages_: [], 966 podsWithPendingImages_: [],
988 967
989 /** @override */ 968 /** @override */
990 decorate: function() { 969 decorate: function() {
991 this.style.left = 0; 970 this.style.left = 0;
992 971
993 // Event listeners that are installed for the time period during which 972 // Event listeners that are installed for the time period during which
994 // the element is visible. 973 // the element is visible.
995 this.listeners_ = { 974 this.listeners_ = {
996 focus: [this.handleFocus_.bind(this), true /* useCapture */], 975 focus: [this.handleFocus_.bind(this), true /* useCapture */],
997 click: [this.handleClick_.bind(this), true], 976 click: [this.handleClick_.bind(this), true],
998 mousemove: [this.handleMouseMove_.bind(this), false], 977 mousemove: [this.handleMouseMove_.bind(this), false],
999 keydown: [this.handleKeyDown.bind(this), false] 978 keydown: [this.handleKeyDown.bind(this), false]
1000 }; 979 };
980 this.wallpaperLoader_ = new login.WallpaperLoader();
1001 }, 981 },
1002 982
1003 /** 983 /**
1004 * Returns all the pods in this pod row. 984 * Returns all the pods in this pod row.
1005 * @type {NodeList} 985 * @type {NodeList}
1006 */ 986 */
1007 get pods() { 987 get pods() {
1008 return this.children; 988 return this.children;
1009 }, 989 },
1010 990
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 return; 1215 return;
1236 } 1216 }
1237 1217
1238 // Make sure there's only one focusPod operation happening at a time. 1218 // Make sure there's only one focusPod operation happening at a time.
1239 if (this.insideFocusPod_) { 1219 if (this.insideFocusPod_) {
1240 this.keyboardActivated_ = false; 1220 this.keyboardActivated_ = false;
1241 return; 1221 return;
1242 } 1222 }
1243 this.insideFocusPod_ = true; 1223 this.insideFocusPod_ = true;
1244 1224
1245 clearTimeout(this.loadWallpaperTimeout_); 1225 this.wallpaperLoader_.reset();
1246 for (var i = 0, pod; pod = this.pods[i]; ++i) { 1226 for (var i = 0, pod; pod = this.pods[i]; ++i) {
1247 if (!this.isSinglePod) { 1227 if (!this.isSinglePod) {
1248 pod.isActionBoxMenuActive = false; 1228 pod.isActionBoxMenuActive = false;
1249 } 1229 }
1250 if (pod != podToFocus) { 1230 if (pod != podToFocus) {
1251 pod.isActionBoxMenuHovered = false; 1231 pod.isActionBoxMenuHovered = false;
1252 pod.classList.remove('focused'); 1232 pod.classList.remove('focused');
1253 pod.classList.remove('faded'); 1233 pod.classList.remove('faded');
1254 pod.reset(false); 1234 pod.reset(false);
1255 } 1235 }
1256 } 1236 }
1257 1237
1258 // Clear any error messages for previous pod. 1238 // Clear any error messages for previous pod.
1259 if (!this.isFocused(podToFocus)) 1239 if (!this.isFocused(podToFocus))
1260 Oobe.clearErrors(); 1240 Oobe.clearErrors();
1261 1241
1262 var hadFocus = !!this.focusedPod_; 1242 var hadFocus = !!this.focusedPod_;
1263 this.focusedPod_ = podToFocus; 1243 this.focusedPod_ = podToFocus;
1264 if (podToFocus) { 1244 if (podToFocus) {
1265 podToFocus.classList.remove('faded'); 1245 podToFocus.classList.remove('faded');
1266 podToFocus.classList.add('focused'); 1246 podToFocus.classList.add('focused');
1267 podToFocus.reset(true); // Reset and give focus. 1247 podToFocus.reset(true); // Reset and give focus.
1268 chrome.send('focusPod', [podToFocus.user.emailAddress]); 1248 chrome.send('focusPod', [podToFocus.user.username]);
1269 if (hadFocus && this.keyboardActivated_) { 1249
1270 // Delay wallpaper loading to let user tab through pods without lag. 1250 this.wallpaperLoader_.scheduleLoad(podToFocus.user.username);
1271 this.loadWallpaperTimeout_ = window.setTimeout(
1272 this.loadWallpaper_.bind(this), WALLPAPER_LOAD_DELAY_MS);
1273 } else if (!this.firstShown_) {
1274 // Load wallpaper immediately if there no pod was focused
1275 // previously, and it is not a boot into user pod list case.
1276 this.loadWallpaper_();
1277 }
1278 this.firstShown_ = false; 1251 this.firstShown_ = false;
1279 this.lastFocusedPod_ = podToFocus; 1252 this.lastFocusedPod_ = podToFocus;
1280 } 1253 }
1281 this.insideFocusPod_ = false; 1254 this.insideFocusPod_ = false;
1282 this.keyboardActivated_ = false; 1255 this.keyboardActivated_ = false;
1283 }, 1256 },
1284 1257
1285 /** 1258 /**
1286 * Loads wallpaper for the active user pod, if any.
1287 * @private
1288 */
1289 loadWallpaper_: function() {
1290 if (this.focusedPod_)
1291 chrome.send('loadWallpaper', [this.focusedPod_.user.username]);
1292 },
1293
1294 /**
1295 * Focuses a given user pod by index or clear focus when given null. 1259 * Focuses a given user pod by index or clear focus when given null.
1296 * @param {int=} podToFocus index of User pod to focus. 1260 * @param {int=} podToFocus index of User pod to focus.
1297 * @param {boolean=} opt_force If true, forces focus update even when 1261 * @param {boolean=} opt_force If true, forces focus update even when
1298 * podToFocus is already focused. 1262 * podToFocus is already focused.
1299 */ 1263 */
1300 focusPodByIndex: function(podToFocus, opt_force) { 1264 focusPodByIndex: function(podToFocus, opt_force) {
1301 if (podToFocus < this.pods.length) 1265 if (podToFocus < this.pods.length)
1302 this.focusPod(this.pods[podToFocus], opt_force); 1266 this.focusPod(this.pods[podToFocus], opt_force);
1303 }, 1267 },
1304 1268
1305 /** 1269 /**
1306 * Resets wallpaper to the last active user's wallpaper, if any. 1270 * Resets wallpaper to the last active user's wallpaper, if any.
1307 */ 1271 */
1308 loadLastWallpaper: function() { 1272 loadLastWallpaper: function() {
1309 if (this.lastFocusedPod_) 1273 if (this.lastFocusedPod_)
1310 chrome.send('loadWallpaper', [this.lastFocusedPod_.user.username]); 1274 this.wallpaperLoader_.scheduleLoad(this.lastFocusedPod_.user.username);
1311 }, 1275 },
1312 1276
1313 /** 1277 /**
1278 * Handles 'onWallpaperLoaded' event. Recalculates statistics and
1279 * [re]schedules next wallpaper load.
1280 */
1281 onWallpaperLoaded: function(username) {
1282 this.wallpaperLoader_.onWallpaperLoaded(username);
1283 },
1284
1285 /**
1314 * Returns the currently activated pod. 1286 * Returns the currently activated pod.
1315 * @type {UserPod} 1287 * @type {UserPod}
1316 */ 1288 */
1317 get activatedPod() { 1289 get activatedPod() {
1318 return this.activatedPod_; 1290 return this.activatedPod_;
1319 }, 1291 },
1320 set activatedPod(pod) { 1292 set activatedPod(pod) {
1321 if (pod && pod.activate()) 1293 if (pod && pod.activate())
1322 this.activatedPod_ = pod; 1294 this.activatedPod_ = pod;
1323 }, 1295 },
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1564 if (this.focusedPod_) { 1536 if (this.focusedPod_) {
1565 var focusedPod = this.focusedPod_; 1537 var focusedPod = this.focusedPod_;
1566 var screen = this.parentNode; 1538 var screen = this.parentNode;
1567 var self = this; 1539 var self = this;
1568 focusedPod.addEventListener('webkitTransitionEnd', function f(e) { 1540 focusedPod.addEventListener('webkitTransitionEnd', function f(e) {
1569 if (e.target == focusedPod) { 1541 if (e.target == focusedPod) {
1570 focusedPod.removeEventListener('webkitTransitionEnd', f); 1542 focusedPod.removeEventListener('webkitTransitionEnd', f);
1571 focusedPod.reset(true); 1543 focusedPod.reset(true);
1572 // Notify screen that it is ready. 1544 // Notify screen that it is ready.
1573 screen.onShow(); 1545 screen.onShow();
1574 // Boot transition: load wallpaper. 1546 self.wallpaperLoader_.scheduleLoad(focusedPod.user.username);
1575 if (!self.bootWallpaperLoaded_ &&
1576 Oobe.getInstance().shouldLoadWallpaperOnBoot()) {
1577 self.loadWallpaperTimeout_ = window.setTimeout(
1578 self.loadWallpaper_.bind(self), WALLPAPER_BOOT_LOAD_DELAY_MS);
1579 self.bootWallpaperLoaded_ = true;
1580 }
1581 } 1547 }
1582 }); 1548 });
1583 // Guard timer for 1 second -- it would conver all possible animations. 1549 // Guard timer for 1 second -- it would conver all possible animations.
1584 ensureTransitionEndEvent(focusedPod, 1000); 1550 ensureTransitionEndEvent(focusedPod, 1000);
1585 } 1551 }
1586 }, 1552 },
1587 1553
1588 /** 1554 /**
1589 * Called right before the pod row is shown. 1555 * Called right before the pod row is shown.
1590 */ 1556 */
(...skipping 29 matching lines...) Expand all
1620 if (this.podsWithPendingImages_.length == 0) { 1586 if (this.podsWithPendingImages_.length == 0) {
1621 this.classList.remove('images-loading'); 1587 this.classList.remove('images-loading');
1622 } 1588 }
1623 } 1589 }
1624 }; 1590 };
1625 1591
1626 return { 1592 return {
1627 PodRow: PodRow 1593 PodRow: PodRow
1628 }; 1594 };
1629 }); 1595 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698