172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsencr.define('options', function() {
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const OptionsPage = options.OptionsPage;
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  /**
9201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch   * The number of milliseconds used for showing a message.
10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch   * @type {number}
11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch   */
12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const MESSAGE_DELAY_MS = 1000;  // 1 sec.
13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  /**
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   * Encapsulated handling of about page.
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   */
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  function AboutPage() {
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    OptionsPage.call(this, 'about', templateData.aboutPageTabTitle,
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                     'aboutPage');
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  cr.addSingletonGetter(AboutPage);
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AboutPage.prototype = {
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Inherit AboutPage from OptionsPage.
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    __proto__: OptionsPage.prototype,
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    /**
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * The queue is used for updating the status message with delay, like:
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * [["Check for update...", 1000], ["Chrome OS is up to date", 0]]
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * @type {!Array.<!Array>}
32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     */
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    statusMessageQueue_: [],
34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    /**
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * True if the status message queue flush started.
37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * @type {boolean}
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     */
39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    statusMessageQueueFlushStarted_: false,
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /**
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * The selected release channel.
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @type {string}
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     */
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    selectedChannel_: '',
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Initialize AboutPage.
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    initializePage: function() {
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Call base class implementation to start preference initialization.
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      OptionsPage.prototype.initializePage.call(this);
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      $('checkNow').onclick = function(event) {
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        chrome.send('CheckNow');
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      };
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      $('moreInfoButton').onclick = function(event) {
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        $('aboutPageLessInfo').classList.add('hidden');
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        $('aboutPageMoreInfo').classList.remove('hidden');
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      };
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (!AccountsOptions.currentUserIsOwner()) {
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        $('channelSelect').disabled = true;
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      } else {
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        var self = this;
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        $('channelSelect').onchange = function(event) {
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          self.selectedOptionOnChange_(event.target.value);
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        };
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Notify the handler that the page is ready.
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      chrome.send('PageReady');
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    },
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Update the Default Browsers section based on the current state.
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    updateOSVersion_: function(versionString) {
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      $('osVersion0').textContent = versionString;
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      $('osVersion1').textContent = versionString;
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    },
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    updateOSFirmware_: function(firmwareString) {
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      $('osFirmware0').textContent = firmwareString;
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      $('osFirmware1').textContent = firmwareString;
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    /**
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * Updates the status message like "Checking for update...".
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * @param {string} message The message to be shown.
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * @param {boolean} insertDelay show the message for a while.
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * @private
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     */
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    updateStatus_: function(message, insertDelay) {
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // Add the message to the queue with delay if needed.
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // The delay is inserted so users can read the message.
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      var delayMs = insertDelay ? MESSAGE_DELAY_MS : 0;
95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      this.statusMessageQueue_.push([message, delayMs]);
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // Start the periodic flusher if not started.
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (this.statusMessageQueueFlushStarted_ == false) {
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        this.flushStatusMessageQueuePeriodically_();
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    },
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    /**
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * Flushes the status message queue periodically using a timer.
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     * @private
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch     */
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    flushStatusMessageQueuePeriodically_: function() {
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // Stop the periodic flusher if the queue becomes empty.
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (this.statusMessageQueue_.length == 0) {
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        this.statusMessageQueueFlushStarted_ = false;
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        return;
111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      this.statusMessageQueueFlushStarted_ = true;
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // Update the status message.
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      var pair = this.statusMessageQueue_.shift();
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      var message = pair[0];
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      var delayMs = pair[1];
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      $('updateStatus').textContent = message;
119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // Schedule the next flush with delay as needed.
121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      var self = this;
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      window.setTimeout(
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          function() { self.flushStatusMessageQueuePeriodically_() },
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          delayMs);
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    },
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    updateEnable_: function(enable) {
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      $('checkNow').disabled = !enable;
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    },
130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    selectedOptionOnChange_: function(value) {
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value == 'dev-channel') {
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // Open confirm dialog.
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        var self = this;
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        AlertOverlay.show(
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          localStrings.getString('channel_warning_header'),
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          localStrings.getString('channel_warning_text'),
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          localStrings.getString('ok'),
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          localStrings.getString('cancel'),
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          function() {
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            // Ok, so set release track and update selected channel.
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            $('channelWarningBlock').hidden = false;
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            chrome.send('SetReleaseTrack', [value]);
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            self.selectedChannel_ = value; },
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          function() {
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            // Cancel, so switch back to previous selected channel.
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            self.updateSelectedOption_(self.selectedChannel_); }
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          );
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        $('channelWarningBlock').hidden = true;
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        chrome.send('SetReleaseTrack', [value]);
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.selectedChannel_ = value;
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Updates the selected option in 'channelSelect' <select> element.
157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    updateSelectedOption_: function(value) {
158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      var options = $('channelSelect').querySelectorAll('option');
159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      for (var i = 0; i < options.length; i++) {
160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        var option = options[i];
161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        if (option.value == value) {
162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          option.selected = true;
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          this.selectedChannel_ = value;
164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        }
165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value == 'dev-channel')
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        $('channelWarningBlock').hidden = false;
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    },
169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Changes the "check now" button to "restart now" button.
171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    changeToRestartButton_: function() {
172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      $('checkNow').textContent = localStrings.getString('restart_now');
173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      $('checkNow').disabled = false;
174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      $('checkNow').onclick = function(event) {
175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        chrome.send('RestartNow');
176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      };
177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    },
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AboutPage.updateOSVersionCallback = function(versionString) {
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AboutPage.getInstance().updateOSVersion_(versionString);
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AboutPage.updateOSFirmwareCallback = function(firmwareString) {
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AboutPage.getInstance().updateOSFirmware_(firmwareString);
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
188201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AboutPage.updateStatusCallback = function(message, insertDelay) {
189201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AboutPage.getInstance().updateStatus_(message, insertDelay);
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AboutPage.updateEnableCallback = function(enable) {
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AboutPage.getInstance().updateEnable_(enable);
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AboutPage.updateSelectedOptionCallback = function(value) {
197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    AboutPage.getInstance().updateSelectedOption_(value);
198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AboutPage.setUpdateImage = function(state) {
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    $('updateIcon').className= 'update-icon ' + state;
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AboutPage.changeToRestartButton = function() {
205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    AboutPage.getInstance().changeToRestartButton_();
206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Export
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return {
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AboutPage: AboutPage
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen});
214