blob: 899b06be3f2466631d7129f4460d00b15f0adb6e [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
cr.define('login', function() {
/**
* Minimum wallpaper load delay in milliseconds.
* @type {number}
* @const
*/
var WALLPAPER_LOAD_MIN_DELAY_MS = 100;
/**
* If last walpaper load time cannot be calculated, assume this value.
* @type {number}
* @const
*/
var WALLPAPER_DEFAULT_LOAD_TIME_MS = 200;
/**
* Min and Max average wallpaper load time.
* Delay to next wallpaper load is 2 * <average load time>.
* @type {number}
* @const
*/
var WALLPAPER_MIN_LOAD_TIME_MS = 50;
var WALLPAPER_MAX_LOAD_TIME_MS = 2000;
/**
* Number last wallpaper load times to remember.
* @type {number}
* @const
*/
var WALLPAPER_LOAD_STATS_MAX_LENGTH = 4;
/**
* Creates a new pod row element.
* @constructor
* @extends {HTMLDivElement}
*/
var WallpaperLoader = function() {
this.wallpaperLoadInProgress_ = {
name: '',
date: undefined
};
this.loadStats_ = [];
};
WallpaperLoader.prototype = {
// When moving through users quickly at login screen, set a timeout to
// prevent loading intermediate wallpapers.
loadWallpaperTimeout_: null,
// When waiting for wallpaper load, remember load start time.
// wallpaperLoadInProgress_: { name: '', date: undefined }
wallpaperLoadInProgress_: undefined,
// Wait a delay and then load this wallpaper. Value = username.
wallpaperLoadPending_: undefined,
// Wait untill this Date before loading next wallpaper.
wallpaperLoadTryNextAfter_: undefined,
// Username, owner of current wallpaper.
currentWallpaper_: '',
// Array of times (in milliseconds) of last wallpaper load attempts.
// Length is limited by WALLPAPER_LOAD_STATS_MAX_LENGTH.
loadStats_: undefined,
/**
* Stop load timer. Clear pending record.
*/
reset: function() {
delete this.wallpaperLoadPending_;
if (this.loadWallpaperTimeout_ != null)
window.clearTimeout(this.loadWallpaperTimeout_);
this.loadWallpaperTimeout_ = null;
},
/**
* Schedules wallpaper load.
*/
scheduleLoad: function(email) {
if (this.wallpaperLoadPending_ && this.wallpaperLoadPending_ == email)
return;
this.reset();
if (this.wallpaperLoadInProgress_.name == email)
return;
if ((this.wallpaperLoadInProgress_.name == '') &&
(this.currentWallpaper_ == email))
return;
this.wallpaperLoadPending_ = email;
var now = new Date();
var timeout = WALLPAPER_LOAD_MIN_DELAY_MS;
if (this.wallpaperLoadTryNextAfter_)
timeout = Math.max(timeout, this.wallpaperLoadTryNextAfter_ - now);
this.loadWallpaperTimeout_ = window.setTimeout(
this.loadWallpaper_.bind(this), timeout);
},
/**
* Loads pending wallpaper, if any.
* @private
*/
loadWallpaper_: function() {
this.loadWallpaperTimeout_ = null;
if (!this.wallpaperLoadPending_)
return;
if (this.wallpaperLoadInProgress_.name != '')
return;
var email = this.wallpaperLoadPending_;
delete this.wallpaperLoadPending_;
if (email == this.currentWallpaper_)
return;
this.wallpaperLoadInProgress_.name = email;
this.wallpaperLoadInProgress_.date = new Date();
chrome.send('loadWallpaper', [email]);
},
/**
* Calculates average wallpaper load time.
*/
calcLoadStatsAvg: function() {
return this.loadStats_.reduce(
function(previousValue, currentValue) {
return previousValue + currentValue;
}) / this.loadStats_.length;
},
/**
* Calculates average next wallpaper load delay time.
*/
getWallpaperLoadTime_: function() {
var avg = WALLPAPER_DEFAULT_LOAD_TIME_MS;
if (this.loadStats_.length == 0)
return avg;
avg = this.calcLoadStatsAvg();
if (avg < WALLPAPER_MIN_LOAD_TIME_MS)
avg = WALLPAPER_MIN_LOAD_TIME_MS;
if (avg > WALLPAPER_MAX_LOAD_TIME_MS)
avg = WALLPAPER_MAX_LOAD_TIME_MS;
return avg;
},
/**
* Handles 'onWallpaperLoaded' event. Recalculates statistics and
* [re]schedules next wallpaper load.
*/
onWallpaperLoaded: function(email) {
this.currentWallpaper_ = email;
if (email != this.wallpaperLoadInProgress_.name)
return;
this.wallpaperLoadInProgress_.name = '';
var started = this.wallpaperLoadInProgress_.date;
var finished = new Date();
var elapsed = started ? finished - started :
WALLPAPER_DEFAULT_LOAD_TIME_MS;
this.loadStats_.push(elapsed);
if (this.loadStats_.length > WALLPAPER_LOAD_STATS_MAX_LENGTH)
this.loadStats_.shift();
this.wallpaperLoadTryNextAfter_ = new Date(Date.now() + 2 *
this.getWallpaperLoadTime_());
if (this.wallpaperLoadPending_) {
var newWallpaperEmail = this.wallpaperLoadPending_;
this.reset();
this.scheduleLoad(newWallpaperEmail);
}
}
};
return {
WallpaperLoader: WallpaperLoader
};
});