OLD | NEW |
| (Empty) |
1 // Copyright 2015 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 | |
5 (function() { | |
6 | |
7 /** | |
8 * Names of the radio buttons which allow the user to choose his encryption | |
9 * mechanism. | |
10 * @enum {string} | |
11 */ | |
12 var RadioButtonNames = { | |
13 ENCRYPT_WITH_GOOGLE: 'encrypt-with-google', | |
14 ENCRYPT_WITH_PASSPHRASE: 'encrypt-with-passphrase', | |
15 }; | |
16 | |
17 /** | |
18 * @fileoverview | |
19 * 'settings-sync-page' is the settings page containing sync settings. | |
20 * | |
21 * Example: | |
22 * | |
23 * <iron-animated-pages> | |
24 * <settings-sync-page></settings-sync-page> | |
25 * ... other pages ... | |
26 * </iron-animated-pages> | |
27 * | |
28 * @group Chrome Settings Elements | |
29 * @element settings-sync-page | |
30 */ | |
31 Polymer({ | |
32 is: 'settings-sync-page', | |
33 | |
34 behaviors: [ | |
35 I18nBehavior, | |
36 ], | |
37 | |
38 properties: { | |
39 /** | |
40 * The current active route. | |
41 */ | |
42 currentRoute: { | |
43 type: Object, | |
44 observer: 'currentRouteChanged_', | |
45 }, | |
46 | |
47 /** | |
48 * The current sync preferences, supplied by settings.SyncPrivateApi. | |
49 * @type {?settings.SyncPrefs} | |
50 */ | |
51 syncPrefs: { | |
52 type: Object, | |
53 }, | |
54 | |
55 /** | |
56 * Whether the "create passphrase" inputs should be shown. These inputs | |
57 * give the user the opportunity to use a custom passphrase instead of | |
58 * authenticating with his Google credentials. | |
59 */ | |
60 creatingNewPassphrase: { | |
61 type: Boolean, | |
62 value: false, | |
63 }, | |
64 | |
65 /** | |
66 * True if subpage needs the user's old Google password. This can happen | |
67 * when the user changes his password after encrypting his sync data. | |
68 * | |
69 * TODO(tommycli): FROM the C++ handler, the syncPrefs.usePassphrase field | |
70 * is true if and only if there is a custom non-Google Sync password. | |
71 * | |
72 * But going TO the C++ handler, the syncPrefs.usePassphrase field is true | |
73 * if there is either a custom or Google password. There is a separate | |
74 * syncPrefs.isGooglePassphrase field. | |
75 * | |
76 * We keep an extra state variable here because we mutate the | |
77 * syncPrefs.usePassphrase field in the OK button handler. | |
78 * Remove this once we fix refactor the legacy SyncSetupHandler. | |
79 */ | |
80 askOldGooglePassphrase: { | |
81 type: Boolean, | |
82 value: false, | |
83 }, | |
84 }, | |
85 | |
86 created: function() { | |
87 settings.SyncPrivateApi.setSyncPrefsCallback( | |
88 this.handleSyncPrefsFetched_.bind(this)); | |
89 }, | |
90 | |
91 /** @private */ | |
92 currentRouteChanged_: function() { | |
93 if (this.currentRoute.section == 'people' && | |
94 this.currentRoute.subpage.length == 1 && | |
95 this.currentRoute.subpage[0] == 'sync') { | |
96 // Display loading page until the settings have been retrieved. | |
97 this.$.pages.selected = 'loading'; | |
98 settings.SyncPrivateApi.didNavigateToSyncPage(); | |
99 } else { | |
100 settings.SyncPrivateApi.didNavigateAwayFromSyncPage(); | |
101 } | |
102 }, | |
103 | |
104 /** | |
105 * Handler for when the sync state is pushed from settings.SyncPrivateApi. | |
106 * @private | |
107 */ | |
108 handleSyncPrefsFetched_: function(syncPrefs) { | |
109 this.syncPrefs = syncPrefs; | |
110 | |
111 this.askOldGooglePassphrase = | |
112 this.syncPrefs.showPassphrase && !this.syncPrefs.usePassphrase; | |
113 | |
114 this.creatingNewPassphrase = false; | |
115 | |
116 this.$.pages.selected = 'main'; | |
117 }, | |
118 | |
119 /** | |
120 * Handler for when the sync all data types checkbox is changed. | |
121 * @param {Event} event | |
122 * @private | |
123 */ | |
124 onSyncAllDataTypesChanged_: function(event) { | |
125 if (event.target.checked) { | |
126 this.set('syncPrefs.syncAllDataTypes', true); | |
127 this.set('syncPrefs.appsSynced', true); | |
128 this.set('syncPrefs.extensionsSynced', true); | |
129 this.set('syncPrefs.preferencesSynced', true); | |
130 this.set('syncPrefs.autofillSynced', true); | |
131 this.set('syncPrefs.typedUrlsSynced', true); | |
132 this.set('syncPrefs.themesSynced', true); | |
133 this.set('syncPrefs.bookmarksSynced', true); | |
134 this.set('syncPrefs.passwordsSynced', true); | |
135 this.set('syncPrefs.tabsSynced', true); | |
136 } | |
137 }, | |
138 | |
139 /** @private */ | |
140 onCancelTap_: function() { | |
141 // Event is caught by settings-animated-pages. | |
142 this.fire('subpage-back'); | |
143 }, | |
144 | |
145 /** | |
146 * Sets the sync data by sending it to the settings.SyncPrivateApi. | |
147 * @private | |
148 */ | |
149 onOkTap_: function() { | |
150 if (this.creatingNewPassphrase) { | |
151 // If a new password has been entered but it is invalid, do not send the | |
152 // sync state to the API. | |
153 if (!this.validateCreatedPassphrases_()) | |
154 return; | |
155 | |
156 this.syncPrefs.encryptAllData = true; | |
157 } | |
158 | |
159 this.syncPrefs.isGooglePassphrase = this.askOldGooglePassphrase; | |
160 this.syncPrefs.usePassphrase = | |
161 this.creatingNewPassphrase || this.syncPrefs.showPassphrase; | |
162 | |
163 if (this.syncPrefs.usePassphrase) { | |
164 var field = this.creatingNewPassphrase ? | |
165 this.$$('#passphraseInput') : this.$$('#existingPassphraseInput'); | |
166 this.syncPrefs.passphrase = field.value; | |
167 field.value = ''; | |
168 } | |
169 | |
170 settings.SyncPrivateApi.setSyncPrefs( | |
171 this.syncPrefs, this.setPageStatusCallback_.bind(this)); | |
172 }, | |
173 | |
174 /** | |
175 * Callback invoked from calling settings.SyncPrivateApi.setSyncPrefs(). | |
176 * @param {!settings.PageStatus} callbackState | |
177 * @private | |
178 */ | |
179 setPageStatusCallback_: function(callbackState) { | |
180 if (callbackState == settings.PageStatus.DONE) { | |
181 this.onCancelTap_(); | |
182 } else if (callbackState == settings.PageStatus.TIMEOUT) { | |
183 this.$.pages.selected = 'timeout'; | |
184 } else if (callbackState == | |
185 settings.PageStatus.PASSPHRASE_ERROR) { | |
186 this.$$('#incorrectPassphraseError').hidden = false; | |
187 } | |
188 }, | |
189 | |
190 /** | |
191 * Called when the encryption | |
192 * @private | |
193 */ | |
194 onEncryptionRadioSelectionChanged_: function(event) { | |
195 this.creatingNewPassphrase = | |
196 event.target.selected == RadioButtonNames.ENCRYPT_WITH_PASSPHRASE; | |
197 }, | |
198 | |
199 /** | |
200 * Computed binding returning the selected encryption radio button. | |
201 * @private | |
202 */ | |
203 selectedEncryptionRadio_: function() { | |
204 return this.encryptionRadiosDisabled_() ? | |
205 RadioButtonNames.ENCRYPT_WITH_PASSPHRASE : | |
206 RadioButtonNames.ENCRYPT_WITH_GOOGLE; | |
207 }, | |
208 | |
209 /** | |
210 * Computed binding returning the selected encryption radio button. | |
211 * @private | |
212 */ | |
213 encryptionRadiosDisabled_: function() { | |
214 return this.syncPrefs.usePassphrase || this.syncPrefs.encryptAllData; | |
215 }, | |
216 | |
217 /** | |
218 * Computed binding returning the encryption text body. | |
219 * @private | |
220 */ | |
221 encryptWithPassphraseBody_: function() { | |
222 if (this.syncPrefs && this.syncPrefs.fullEncryptionBody) | |
223 return this.syncPrefs.fullEncryptionBody; | |
224 | |
225 return this.i18n('encryptWithSyncPassphraseLabel'); | |
226 }, | |
227 | |
228 /** | |
229 * @param {boolean} syncAllDataTypes | |
230 * @param {boolean} enforced | |
231 * @return {boolean} Whether the sync checkbox should be disabled. | |
232 */ | |
233 shouldSyncCheckboxBeDisabled_: function(syncAllDataTypes, enforced) { | |
234 return syncAllDataTypes || enforced; | |
235 }, | |
236 | |
237 /** | |
238 * Checks the supplied passphrases to ensure that they are not empty and that | |
239 * they match each other. Additionally, displays error UI if they are | |
240 * invalid. | |
241 * @return {boolean} Whether the check was successful (i.e., that the | |
242 * passphrases were valid). | |
243 * @private | |
244 */ | |
245 validateCreatedPassphrases_: function() { | |
246 this.$$('#emptyPassphraseError').hidden = true; | |
247 this.$$('#mismatchedPassphraseError').hidden = true; | |
248 | |
249 var passphrase = this.$$('#passphraseInput').value; | |
250 if (!passphrase) { | |
251 this.$$('#emptyPassphraseError').hidden = false; | |
252 return false; | |
253 } | |
254 | |
255 var confirmation = this.$$('#passphraseConfirmationInput').value; | |
256 if (passphrase != confirmation) { | |
257 this.$$('#mismatchedPassphraseError').hidden = false; | |
258 return false; | |
259 } | |
260 | |
261 return true; | |
262 }, | |
263 }); | |
264 | |
265 })(); | |
OLD | NEW |