// Copyright (c) 2011 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('options', function() {
const OptionsPage = options.OptionsPage;
/**
* The number of milliseconds used for showing a message.
* @type {number}
*/
const MESSAGE_DELAY_MS = 1000; // 1 sec.
/**
* Encapsulated handling of about page.
*/
function AboutPage() {
OptionsPage.call(this, 'about', templateData.aboutPageTabTitle,
'aboutPage');
}
cr.addSingletonGetter(AboutPage);
AboutPage.prototype = {
// Inherit AboutPage from OptionsPage.
__proto__: OptionsPage.prototype,
/**
* The queue is used for updating the status message with delay, like:
* [["Check for update...", 1000], ["Chrome OS is up to date", 0]]
* @type {!Array.<!Array>}
*/
statusMessageQueue_: [],
/**
* True if the status message queue flush started.
* @type {boolean}
*/
statusMessageQueueFlushStarted_: false,
/**
* The selected release channel.
* @type {string}
*/
selectedChannel_: '',
// Initialize AboutPage.
initializePage: function() {
// Call base class implementation to start preference initialization.
OptionsPage.prototype.initializePage.call(this);
$('checkNow').onclick = function(event) {
chrome.send('CheckNow');
};
$('moreInfoButton').onclick = function(event) {
$('aboutPageLessInfo').classList.add('hidden');
$('aboutPageMoreInfo').classList.remove('hidden');
};
if (!AccountsOptions.currentUserIsOwner()) {
$('channelSelect').disabled = true;
} else {
var self = this;
$('channelSelect').onchange = function(event) {
self.selectedOptionOnChange_(event.target.value);
};
}
// Notify the handler that the page is ready.
chrome.send('PageReady');
},
// Update the Default Browsers section based on the current state.
updateOSVersion_: function(versionString) {
$('osVersion0').textContent = versionString;
$('osVersion1').textContent = versionString;
},
updateOSFirmware_: function(firmwareString) {
$('osFirmware0').textContent = firmwareString;
$('osFirmware1').textContent = firmwareString;
},
/**
* Updates the status message like "Checking for update...".
* @param {string} message The message to be shown.
* @param {boolean} insertDelay show the message for a while.
* @private
*/
updateStatus_: function(message, insertDelay) {
// Add the message to the queue with delay if needed.
// The delay is inserted so users can read the message.
var delayMs = insertDelay ? MESSAGE_DELAY_MS : 0;
this.statusMessageQueue_.push([message, delayMs]);
// Start the periodic flusher if not started.
if (this.statusMessageQueueFlushStarted_ == false) {
this.flushStatusMessageQueuePeriodically_();
}
},
/**
* Flushes the status message queue periodically using a timer.
* @private
*/
flushStatusMessageQueuePeriodically_: function() {
// Stop the periodic flusher if the queue becomes empty.
if (this.statusMessageQueue_.length == 0) {
this.statusMessageQueueFlushStarted_ = false;
return;
}
this.statusMessageQueueFlushStarted_ = true;
// Update the status message.
var pair = this.statusMessageQueue_.shift();
var message = pair[0];
var delayMs = pair[1];
$('updateStatus').textContent = message;
// Schedule the next flush with delay as needed.
var self = this;
window.setTimeout(
function() { self.flushStatusMessageQueuePeriodically_() },
delayMs);
},
updateEnable_: function(enable) {
$('checkNow').disabled = !enable;
},
selectedOptionOnChange_: function(value) {
if (value == 'dev-channel') {
// Open confirm dialog.
var self = this;
AlertOverlay.show(
localStrings.getString('channel_warning_header'),
localStrings.getString('channel_warning_text'),
localStrings.getString('ok'),
localStrings.getString('cancel'),
function() {
// Ok, so set release track and update selected channel.
$('channelWarningBlock').hidden = false;
chrome.send('SetReleaseTrack', [value]);
self.selectedChannel_ = value; },
function() {
// Cancel, so switch back to previous selected channel.
self.updateSelectedOption_(self.selectedChannel_); }
);
} else {
$('channelWarningBlock').hidden = true;
chrome.send('SetReleaseTrack', [value]);
this.selectedChannel_ = value;
}
},
// Updates the selected option in 'channelSelect' <select> element.
updateSelectedOption_: function(value) {
var options = $('channelSelect').querySelectorAll('option');
for (var i = 0; i < options.length; i++) {
var option = options[i];
if (option.value == value) {
option.selected = true;
this.selectedChannel_ = value;
}
}
if (value == 'dev-channel')
$('channelWarningBlock').hidden = false;
},
// Changes the "check now" button to "restart now" button.
changeToRestartButton_: function() {
$('checkNow').textContent = localStrings.getString('restart_now');
$('checkNow').disabled = false;
$('checkNow').onclick = function(event) {
chrome.send('RestartNow');
};
},
};
AboutPage.updateOSVersionCallback = function(versionString) {
AboutPage.getInstance().updateOSVersion_(versionString);
};
AboutPage.updateOSFirmwareCallback = function(firmwareString) {
AboutPage.getInstance().updateOSFirmware_(firmwareString);
};
AboutPage.updateStatusCallback = function(message, insertDelay) {
AboutPage.getInstance().updateStatus_(message, insertDelay);
};
AboutPage.updateEnableCallback = function(enable) {
AboutPage.getInstance().updateEnable_(enable);
};
AboutPage.updateSelectedOptionCallback = function(value) {
AboutPage.getInstance().updateSelectedOption_(value);
};
AboutPage.setUpdateImage = function(state) {
$('updateIcon').className= 'update-icon ' + state;
};
AboutPage.changeToRestartButton = function() {
AboutPage.getInstance().changeToRestartButton_();
};
// Export
return {
AboutPage: AboutPage
};
});