personal_options.js revision ddb351dbec246cf1fab5ec20d2d5520909041de1
1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5cr.define('options', function() {
6
7  var OptionsPage = options.OptionsPage;
8
9  // State variables.
10  var syncEnabled = false;
11  var syncSetupCompleted = false;
12
13  /**
14   * Encapsulated handling of personal options page.
15   * @constructor
16   */
17  function PersonalOptions() {
18    OptionsPage.call(this, 'personal',
19                     templateData.personalPageTabTitle,
20                     'personal-page');
21  }
22
23  cr.addSingletonGetter(PersonalOptions);
24
25  PersonalOptions.prototype = {
26    // Inherit PersonalOptions from OptionsPage.
27    __proto__: options.OptionsPage.prototype,
28
29    // Initialize PersonalOptions page.
30    initializePage: function() {
31      // Call base class implementation to start preference initialization.
32      OptionsPage.prototype.initializePage.call(this);
33
34      var self = this;
35      $('sync-action-link').onclick = function(event) {
36        chrome.send('showSyncActionDialog');
37      };
38      $('start-stop-sync').onclick = function(event) {
39        if (self.syncSetupCompleted)
40          self.showStopSyncingOverlay_();
41        else
42          chrome.send('showSyncLoginDialog');
43      };
44      $('customize-sync').onclick = function(event) {
45        chrome.send('showCustomizeSyncDialog');
46      };
47      $('privacy-dashboard-link').onclick = function(event) {
48        chrome.send('openPrivacyDashboardTabAndActivate');
49      };
50      $('manage-passwords').onclick = function(event) {
51        OptionsPage.navigateToPage('passwords');
52        OptionsPage.showTab($('passwords-nav-tab'));
53        chrome.send('coreOptionsUserMetricsAction',
54            ['Options_ShowPasswordManager']);
55      };
56      $('autofill-settings').onclick = function(event) {
57        OptionsPage.navigateToPage('autofill');
58        chrome.send('coreOptionsUserMetricsAction',
59            ['Options_ShowAutofillSettings']);
60      };
61      $('themes-reset').onclick = function(event) {
62        chrome.send('themesReset');
63      };
64
65      if (!cr.isChromeOS) {
66        $('import-data').onclick = function(event) {
67          OptionsPage.navigateToPage('importData');
68          chrome.send('coreOptionsUserMetricsAction', ['Import_ShowDlg']);
69        };
70
71        if ($('themes-GTK-button')) {
72          $('themes-GTK-button').onclick = function(event) {
73            chrome.send('themesSetGTK');
74          };
75        }
76      } else {
77        $('change-picture-button').onclick = function(event) {
78          OptionsPage.navigateToPage('changePicture');
79        };
80        chrome.send('loadAccountPicture');
81      }
82
83      if (cr.commandLine.options['--bwsi']) {
84        // Disable the screen lock checkbox for the guest mode.
85        $('enable-screen-lock').disabled = true;
86      }
87
88      if (PersonalOptions.disablePasswordManagement()) {
89        $('passwords-offersave').disabled = true;
90        $('passwords-neversave').disabled = true;
91        $('passwords-offersave').value = false;
92        $('passwords-neversave').value = true;
93        $('manage-passwords').disabled = true;
94      }
95    },
96
97    showStopSyncingOverlay_: function() {
98      AlertOverlay.show(localStrings.getString('stop_syncing_title'),
99                        localStrings.getString('stop_syncing_explanation'),
100                        localStrings.getString('stop_syncing_confirm'),
101                        localStrings.getString('cancel'),
102                        function() { chrome.send('stopSyncing'); });
103    },
104
105    setElementVisible_: function(element, visible) {
106      element.hidden = !visible;
107      if (visible)
108        element.classList.remove('hidden');
109      else
110        element.classList.add('hidden');
111    },
112
113    setSyncEnabled_: function(enabled) {
114      this.syncEnabled = enabled;
115    },
116
117    setSyncSetupCompleted_: function(completed) {
118      this.syncSetupCompleted = completed;
119      this.setElementVisible_($('customize-sync'), completed);
120      $('privacy-dashboard-link').hidden = !completed;
121    },
122
123    setAccountPicture_: function(image) {
124      $('account-picture').src = image;
125    },
126
127    setSyncStatus_: function(status) {
128      var statusSet = status != '';
129      $('sync-overview').hidden = statusSet;
130      $('sync-status').hidden = !statusSet;
131      $('sync-status-text').textContent = status;
132    },
133
134    setSyncStatusErrorVisible_: function(visible) {
135      visible ? $('sync-status').classList.add('sync-error') :
136                $('sync-status').classList.remove('sync-error');
137    },
138
139    setSyncActionLinkEnabled_: function(enabled) {
140      $('sync-action-link').disabled = !enabled;
141    },
142
143    setSyncActionLinkLabel_: function(status) {
144      $('sync-action-link').textContent = status;
145
146      // link-button does is not zero-area when the contents of the button are
147      // empty, so explicitly hide the element.
148      this.setElementVisible_($('sync-action-link'), status.length != 0);
149    },
150
151    setProfilesSectionVisible_: function(visible) {
152      this.setElementVisible_($('profiles-create'), visible);
153    },
154
155    setNewProfileButtonEnabled_: function(enabled) {
156      $('new-profile').disabled = !enabled;
157      if (enabled)
158        $('profiles-create').classList.remove('disabled');
159      else
160        $('profiles-create').classList.add('disabled');
161    },
162
163    setStartStopButtonVisible_: function(visible) {
164      this.setElementVisible_($('start-stop-sync'), visible);
165    },
166
167    setStartStopButtonEnabled_: function(enabled) {
168      $('start-stop-sync').disabled = !enabled;
169    },
170
171    setStartStopButtonLabel_: function(label) {
172      $('start-stop-sync').textContent = label;
173    },
174
175    setGtkThemeButtonEnabled_: function(enabled) {
176      if (!cr.isChromeOS && navigator.platform.match(/linux|BSD/i)) {
177        $('themes-GTK-button').disabled = !enabled;
178      }
179    },
180
181    setThemesResetButtonEnabled_: function(enabled) {
182      $('themes-reset').disabled = !enabled;
183    },
184
185    hideSyncSection_: function() {
186      this.setElementVisible_($('sync-section'), false);
187    },
188
189    /**
190     * Toggles the visibility of the data type checkboxes based on whether they
191     * are enabled on not.
192     * @param {Object} dict A mapping from data type to a boolean indicating
193     *     whether it is enabled.
194     * @private
195     */
196    setRegisteredDataTypes_: function(dict) {
197      for (var type in dict) {
198        if (type.match(/Registered$/) && !dict[type]) {
199          node = $(type.replace(/([a-z]+)Registered$/i, '$1').toLowerCase()
200                   + '-check');
201          if (node)
202            node.parentNode.style.display = 'none';
203        }
204      }
205    },
206  };
207
208  /**
209   * Returns whether the user should be able to manage (view and edit) their
210   * stored passwords. Password management is disabled in guest mode.
211   * @return {boolean} True if password management should be disabled.
212   */
213  PersonalOptions.disablePasswordManagement = function() {
214    return cr.commandLine.options['--bwsi'];
215  };
216
217  // Forward public APIs to private implementations.
218  [
219    'setSyncEnabled',
220    'setSyncSetupCompleted',
221    'setAccountPicture',
222    'setSyncStatus',
223    'setSyncStatusErrorVisible',
224    'setSyncActionLinkEnabled',
225    'setSyncActionLinkLabel',
226    'setProfilesSectionVisible',
227    'setNewProfileButtonEnabled',
228    'setStartStopButtonVisible',
229    'setStartStopButtonEnabled',
230    'setStartStopButtonLabel',
231    'setGtkThemeButtonEnabled',
232    'setThemesResetButtonEnabled',
233    'hideSyncSection',
234    'setRegisteredDataTypes',
235  ].forEach(function(name) {
236    PersonalOptions[name] = function(value) {
237      PersonalOptions.getInstance()[name + '_'](value);
238    };
239  });
240
241  // Export
242  return {
243    PersonalOptions: PersonalOptions
244  };
245
246});
247