| Index: chrome/browser/resources/help/help.js
|
| diff --git a/chrome/browser/resources/help/help.js b/chrome/browser/resources/help/help.js
|
| index 7aa3e52131186f5e84116c6db4521a141e63e397..63b7b3cef3f8edb11be62043f1ebe3094326df40 100644
|
| --- a/chrome/browser/resources/help/help.js
|
| +++ b/chrome/browser/resources/help/help.js
|
| @@ -16,9 +16,41 @@ cr.define('help', function() {
|
| __proto__: HTMLDivElement.prototype,
|
|
|
| /**
|
| + * True if after update powerwash button should be displayed.
|
| + * @private
|
| + */
|
| + powerwashAfterUpdate_: false,
|
| +
|
| + /**
|
| + * List of the channels names.
|
| + * @private
|
| + */
|
| + channelList_: ['dev-channel', 'beta-channel', 'stable-channel'],
|
| +
|
| + /**
|
| + * Bubble for error messages and notifications.
|
| + * @private
|
| + */
|
| + bubble_: null,
|
| +
|
| + /**
|
| + * Name of the channel the device is currently on.
|
| + * @private
|
| + */
|
| + currentChannel_: null,
|
| +
|
| + /**
|
| + * Name of the channel the device is supposed to be.
|
| + * @private
|
| + */
|
| + targetChannel_: null,
|
| +
|
| + /**
|
| * Perform initial setup.
|
| */
|
| initialize: function() {
|
| + var self = this;
|
| +
|
| uber.onContentFrameLoaded();
|
|
|
| // Set the title.
|
| @@ -51,18 +83,65 @@ cr.define('help', function() {
|
| this.maybeSetOnClick_($('relaunch'), function() {
|
| chrome.send('relaunchNow');
|
| });
|
| + if (cr.isChromeOS) {
|
| + this.maybeSetOnClick_($('relaunch-and-powerwash'), function() {
|
| + chrome.send('relaunchAndPowerwash');
|
| + });
|
| +
|
| + this.channelTable_ = {
|
| + 'stable-channel': {
|
| + 'name': loadTimeData.getString('stable'),
|
| + 'label': loadTimeData.getString('currentChannelStable'),
|
| + },
|
| + 'beta-channel': {
|
| + 'name': loadTimeData.getString('beta'),
|
| + 'label': loadTimeData.getString('currentChannelBeta')
|
| + },
|
| + 'dev-channel': {
|
| + 'name': loadTimeData.getString('dev'),
|
| + 'label': loadTimeData.getString('currentChannelDev')
|
| + }
|
| + };
|
| + }
|
|
|
| var channelChanger = $('channel-changer');
|
| if (channelChanger) {
|
| - this.channelName_ = {
|
| - 'stable-channel': loadTimeData.getString('stable'),
|
| - 'beta-channel': loadTimeData.getString('beta'),
|
| - 'dev-channel': loadTimeData.getString('dev')
|
| - };
|
| - var self = this;
|
| channelChanger.onchange = function(event) {
|
| - self.setReleaseChannel_(event.target.value);
|
| - }
|
| + self.setChannel_(event.target.value, false);
|
| + };
|
| + }
|
| +
|
| + if (cr.isChromeOS) {
|
| + cr.ui.overlay.globalInitialization();
|
| + cr.ui.overlay.setupOverlay($('overlay-container'));
|
| + $('overlay-container').addEventListener('cancelOverlay', function() {
|
| + self.showOverlay_(null);
|
| + });
|
| +
|
| + $('change-channel').onclick = function() {
|
| + self.showOverlay_($('channel-change-page'));
|
| + };
|
| +
|
| + var channelChangeDisallowedError = document.createElement('div');
|
| + channelChangeDisallowedError.className = 'channel-change-error-bubble';
|
| +
|
| + var channelChangeDisallowedIcon = document.createElement('div');
|
| + channelChangeDisallowedIcon.classList.add('help-page-icon-large');
|
| + channelChangeDisallowedIcon.classList.add('channel-change-error-icon');
|
| + channelChangeDisallowedError.appendChild(channelChangeDisallowedIcon);
|
| +
|
| + var channelChangeDisallowedText = document.createElement('div');
|
| + channelChangeDisallowedText.className = 'channel-change-error-text';
|
| + channelChangeDisallowedText.textContent =
|
| + loadTimeData.getString('channelChangeDisallowedMessage');
|
| + channelChangeDisallowedError.appendChild(channelChangeDisallowedText);
|
| +
|
| + $('channel-change-disallowed-icon').onclick = function() {
|
| + self.showBubble_(channelChangeDisallowedError,
|
| + $('help-container'),
|
| + $('channel-change-disallowed-icon'),
|
| + cr.ui.ArrowLocation.TOP_END);
|
| + };
|
| }
|
|
|
| // Attempt to update.
|
| @@ -70,6 +149,39 @@ cr.define('help', function() {
|
| },
|
|
|
| /**
|
| + * Shows the bubble.
|
| + * @param {HTMLDivElement} content The content of the bubble.
|
| + * @param {HTMLElement} target The element at which the bubble points.
|
| + * @param {HTMLElement} domSibling The element after which the bubble is
|
| + * added to the DOM.
|
| + * @param {cr.ui.ArrowLocation} location The arrow location.
|
| + * @private
|
| + */
|
| + showBubble_: function(content, domSibling, target, location) {
|
| + if (!cr.isChromeOS)
|
| + return;
|
| + this.hideBubble_();
|
| + var bubble = new cr.ui.AutoCloseBubble;
|
| + bubble.anchorNode = target;
|
| + bubble.domSibling = domSibling;
|
| + bubble.arrowLocation = location;
|
| + bubble.content = content;
|
| + bubble.show();
|
| + this.bubble_ = bubble;
|
| + },
|
| +
|
| + /**
|
| + * Hides the bubble.
|
| + * @private
|
| + */
|
| + hideBubble_: function() {
|
| + if (!cr.isChromeOS)
|
| + return;
|
| + if (this.bubble_)
|
| + this.bubble_.hide();
|
| + },
|
| +
|
| + /**
|
| * Toggles the visible state of the 'More Info' section.
|
| * @private
|
| */
|
| @@ -98,25 +210,66 @@ cr.define('help', function() {
|
| * @private
|
| */
|
| setUpdateImage_: function(state) {
|
| - $('update-status-icon').className = 'update-icon ' + state;
|
| + $('update-status-icon').className = 'help-page-icon ' + state;
|
| + },
|
| +
|
| + /**
|
| + * Returns current overlay.
|
| + * @return {HTMLElement} Current overlay
|
| + * @private
|
| + */
|
| + getCurrentOverlay_: function() {
|
| + return document.querySelector('#overlay .page.showing');
|
| + },
|
| +
|
| + /**
|
| + * @return {boolean} True, if new channel switcher UI is used,
|
| + * false otherwise.
|
| + * @private
|
| + */
|
| + isNewChannelSwitcherUI_: function() {
|
| + return !loadTimeData.valueExists('disableNewChannelSwitcherUI');
|
| + },
|
| +
|
| + /**
|
| + * @return {boolean} True if target and current channels are not
|
| + * null and not equals
|
| + * @private
|
| + */
|
| + channelsDiffer_: function() {
|
| + var current = this.currentChannel_;
|
| + var target = this.targetChannel_;
|
| + return (current != null && target != null && current != target);
|
| },
|
|
|
| /**
|
| * @private
|
| */
|
| setUpdateStatus_: function(status, message) {
|
| + var channel = this.targetChannel_;
|
| if (status == 'checking') {
|
| this.setUpdateImage_('working');
|
| $('update-status-message').innerHTML =
|
| loadTimeData.getString('updateCheckStarted');
|
| } else if (status == 'updating') {
|
| this.setUpdateImage_('working');
|
| - $('update-status-message').innerHTML =
|
| - loadTimeData.getString('updating');
|
| + if (this.channelsDiffer_()) {
|
| + $('update-status-message').innerHTML =
|
| + loadTimeData.getStringF('updatingChannelSwitch',
|
| + this.channelTable_[channel].label);
|
| + } else {
|
| + $('update-status-message').innerHTML =
|
| + loadTimeData.getStringF('updating');
|
| + }
|
| } else if (status == 'nearly_updated') {
|
| this.setUpdateImage_('up-to-date');
|
| - $('update-status-message').innerHTML =
|
| - loadTimeData.getString('updateAlmostDone');
|
| + if (this.channelsDiffer_()) {
|
| + $('update-status-message').innerHTML =
|
| + loadTimeData.getString('successfulChannelSwitch');
|
| + } else {
|
| + $('update-status-message').innerHTML =
|
| + loadTimeData.getString('updateAlmostDone');
|
| + }
|
| } else if (status == 'updated') {
|
| this.setUpdateImage_('up-to-date');
|
| $('update-status-message').innerHTML =
|
| @@ -134,6 +287,14 @@ cr.define('help', function() {
|
| if (!cr.isMac)
|
| $('update-percentage').hidden = status != 'updating';
|
| }
|
| +
|
| + if ($('relaunch-and-powerwash')) {
|
| + // It's allowed to do powerwash only for customer devices,
|
| + // when user explicitly decides to update to a more stable
|
| + // channel.
|
| + $('relaunch-and-powerwash').hidden =
|
| + !this.powerwashAfterUpdate_ || status != 'nearly_updated';
|
| + }
|
| },
|
|
|
| /**
|
| @@ -201,44 +362,52 @@ cr.define('help', function() {
|
| * overlays are hidden.
|
| */
|
| showOverlay_: function(node) {
|
| - var currentlyShowingOverlay =
|
| - document.querySelector('#overlay .page.showing');
|
| + var currentlyShowingOverlay = this.getCurrentOverlay_();
|
| if (currentlyShowingOverlay)
|
| currentlyShowingOverlay.classList.remove('showing');
|
| -
|
| if (node)
|
| node.classList.add('showing');
|
| - $('overlay').hidden = !node;
|
| + $('overlay-container').hidden = !node;
|
| },
|
|
|
| /**
|
| - * |enabled| is true if the release channel can be enabled.
|
| + * Updates name of the current channel, i.e. the name of the
|
| + * channel the device is currently on.
|
| + * @param {string} channel The name of the current channel
|
| * @private
|
| */
|
| - updateEnableReleaseChannel_: function(enabled) {
|
| - $('channel-changer-container').hidden = !enabled;
|
| + updateCurrentChannel_: function(channel) {
|
| + if (this.channelList_.indexOf(channel) < 0)
|
| + return;
|
| + $('current-channel').textContent = loadTimeData.getStringF(
|
| + 'currentChannel', this.channelTable_[channel].label);
|
| + this.currentChannel_ = channel;
|
| + help.ChannelChangePage.updateCurrentChannel(channel);
|
| },
|
|
|
| /**
|
| + * |enabled| is true if the release channel can be enabled.
|
| * @private
|
| */
|
| - updateSelectedChannel_: function(value) {
|
| - var options = $('channel-changer').querySelectorAll('option');
|
| - for (var i = 0; i < options.length; i++) {
|
| - var option = options[i];
|
| - if (option.value == value)
|
| - option.selected = true;
|
| - }
|
| + updateEnableReleaseChannel_: function(enabled) {
|
| + this.updateChannelChangerContainerVisibility_(enabled);
|
| + $('change-channel').disabled = !enabled;
|
| + $('channel-change-disallowed-icon').hidden = enabled;
|
| },
|
|
|
| /**
|
| + * Sets the device target channel.
|
| + * @param {string} channel The name of the target channel
|
| + * @param {boolean} isPowerwashAllowed True iff powerwash is allowed
|
| * @private
|
| */
|
| - setReleaseChannel_: function(channel) {
|
| - chrome.send('setReleaseTrack', [channel]);
|
| + setChannel_: function(channel, isPowerwashAllowed) {
|
| + this.powerwashAfterUpdate_ = isPowerwashAllowed;
|
| + this.targetChannel_ = channel;
|
| + chrome.send('setChannel', [channel, isPowerwashAllowed]);
|
| $('channel-change-confirmation').hidden = false;
|
| $('channel-change-confirmation').textContent = loadTimeData.getStringF(
|
| - 'channel-changed', this.channelName_[channel]);
|
| + 'channel-changed', this.channelTable_[channel].name);
|
| },
|
|
|
| /**
|
| @@ -250,6 +419,35 @@ cr.define('help', function() {
|
| $('build-date-container').classList.remove('empty');
|
| $('build-date').textContent = buildDate;
|
| },
|
| +
|
| + /**
|
| + * Updates channel-change-page-container visibility according to
|
| + * internal state.
|
| + * @private
|
| + */
|
| + updateChannelChangePageContainerVisibility_: function() {
|
| + if (!this.isNewChannelSwitcherUI_()) {
|
| + $('channel-change-page-container').hidden = true;
|
| + return;
|
| + }
|
| + $('channel-change-page-container').hidden =
|
| + !help.ChannelChangePage.isPageReady();
|
| + },
|
| +
|
| + /**
|
| + * Updates channel-changer dropdown visibility if |visible| is
|
| + * true and new channel switcher UI is disallowed.
|
| + * @param {boolean} visible True if channel-changer should be
|
| + * displayed, false otherwise.
|
| + * @private
|
| + */
|
| + updateChannelChangerContainerVisibility_: function(visible) {
|
| + if (this.isNewChannelSwitcherUI_()) {
|
| + $('channel-changer').hidden = true;
|
| + return;
|
| + }
|
| + $('channel-changer').hidden = !visible;
|
| + },
|
| };
|
|
|
| HelpPage.setUpdateStatus = function(status, message) {
|
| @@ -289,21 +487,43 @@ cr.define('help', function() {
|
| HelpPage.getInstance().showOverlay_(node);
|
| };
|
|
|
| - HelpPage.updateSelectedChannel = function(channel) {
|
| - HelpPage.getInstance().updateSelectedChannel_(channel);
|
| + HelpPage.cancelOverlay = function() {
|
| + HelpPage.getInstance().showOverlay_(null);
|
| + };
|
| +
|
| + HelpPage.updateIsEnterpriseManaged = function(isEnterpriseManaged) {
|
| + if (!cr.isChromeOS)
|
| + return;
|
| + help.ChannelChangePage.updateIsEnterpriseManaged(isEnterpriseManaged);
|
| + };
|
| +
|
| + HelpPage.updateCurrentChannel = function(channel) {
|
| + if (!cr.isChromeOS)
|
| + return;
|
| + HelpPage.getInstance().updateCurrentChannel_(channel);
|
| + };
|
| +
|
| + HelpPage.updateTargetChannel = function(channel) {
|
| + if (!cr.isChromeOS)
|
| + return;
|
| + help.ChannelChangePage.updateTargetChannel(channel);
|
| };
|
|
|
| HelpPage.updateEnableReleaseChannel = function(enabled) {
|
| HelpPage.getInstance().updateEnableReleaseChannel_(enabled);
|
| };
|
|
|
| - HelpPage.setReleaseChannel = function(channel) {
|
| - HelpPage.getInstance().setReleaseChannel_(channel);
|
| + HelpPage.setChannel = function(channel, isPowerwashAllowed) {
|
| + HelpPage.getInstance().setChannel_(channel, isPowerwashAllowed);
|
| };
|
|
|
| HelpPage.setBuildDate = function(buildDate) {
|
| HelpPage.getInstance().setBuildDate_(buildDate);
|
| - }
|
| + };
|
| +
|
| + HelpPage.updateChannelChangePageContainerVisibility = function() {
|
| + HelpPage.getInstance().updateChannelChangePageContainerVisibility_();
|
| + };
|
|
|
| // Export
|
| return {
|
| @@ -316,4 +536,6 @@ cr.define('help', function() {
|
| */
|
| window.onload = function() {
|
| help.HelpPage.getInstance().initialize();
|
| + if (cr.isChromeOS)
|
| + help.ChannelChangePage.getInstance().initialize();
|
| };
|
|
|