blob: c7b2dcfa3c2ee33fa8fe70cdc8556817b5b9b60f [file] [log] [blame]
// Copyright 2015 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.
(function() {
/**
* Names of the radio buttons which allow the user to choose his encryption
* mechanism.
* @enum {string}
*/
var RadioButtonNames = {
ENCRYPT_WITH_GOOGLE: 'encrypt-with-google',
ENCRYPT_WITH_PASSPHRASE: 'encrypt-with-passphrase',
};
/**
* @fileoverview
* 'settings-sync-page' is the settings page containing sync settings.
*
* Example:
*
* <iron-animated-pages>
* <settings-sync-page></settings-sync-page>
* ... other pages ...
* </iron-animated-pages>
*/
Polymer({
is: 'settings-sync-page',
behaviors: [
I18nBehavior,
],
properties: {
/**
* The current active route.
*/
currentRoute: {
type: Object,
observer: 'currentRouteChanged_',
},
/**
* The current sync preferences, supplied by settings.SyncPrivateApi.
* @type {?settings.SyncPrefs}
*/
syncPrefs: {
type: Object,
},
/**
* Whether the "create passphrase" inputs should be shown. These inputs
* give the user the opportunity to use a custom passphrase instead of
* authenticating with his Google credentials.
*/
creatingNewPassphrase: {
type: Boolean,
value: false,
},
/**
* True if subpage needs the user's old Google password. This can happen
* when the user changes his password after encrypting his sync data.
*
* TODO(tommycli): FROM the C++ handler, the syncPrefs.usePassphrase field
* is true if and only if there is a custom non-Google Sync password.
*
* But going TO the C++ handler, the syncPrefs.usePassphrase field is true
* if there is either a custom or Google password. There is a separate
* syncPrefs.isGooglePassphrase field.
*
* We keep an extra state variable here because we mutate the
* syncPrefs.usePassphrase field in the OK button handler.
* Remove this once we fix refactor the legacy SyncSetupHandler.
*/
askOldGooglePassphrase: {
type: Boolean,
value: false,
},
},
created: function() {
settings.SyncPrivateApi.setSyncPrefsCallback(
this.handleSyncPrefsFetched_.bind(this));
},
/** @private */
currentRouteChanged_: function() {
if (this.currentRoute.section == 'people' &&
this.currentRoute.subpage.length == 1 &&
this.currentRoute.subpage[0] == 'sync') {
// Display loading page until the settings have been retrieved.
this.$.pages.selected = 'loading';
settings.SyncPrivateApi.didNavigateToSyncPage();
} else {
settings.SyncPrivateApi.didNavigateAwayFromSyncPage();
}
},
/**
* Handler for when the sync state is pushed from settings.SyncPrivateApi.
* @private
*/
handleSyncPrefsFetched_: function(syncPrefs) {
this.syncPrefs = syncPrefs;
this.askOldGooglePassphrase =
this.syncPrefs.showPassphrase && !this.syncPrefs.usePassphrase;
this.creatingNewPassphrase = false;
this.$.pages.selected = 'main';
},
/**
* Handler for when the sync all data types checkbox is changed.
* @param {Event} event
* @private
*/
onSyncAllDataTypesChanged_: function(event) {
if (event.target.checked) {
this.set('syncPrefs.syncAllDataTypes', true);
this.set('syncPrefs.appsSynced', true);
this.set('syncPrefs.extensionsSynced', true);
this.set('syncPrefs.preferencesSynced', true);
this.set('syncPrefs.autofillSynced', true);
this.set('syncPrefs.typedUrlsSynced', true);
this.set('syncPrefs.themesSynced', true);
this.set('syncPrefs.bookmarksSynced', true);
this.set('syncPrefs.passwordsSynced', true);
this.set('syncPrefs.tabsSynced', true);
}
},
/** @private */
onCancelTap_: function() {
// Event is caught by settings-animated-pages.
this.fire('subpage-back');
},
/**
* Sets the sync data by sending it to the settings.SyncPrivateApi.
* @private
*/
onOkTap_: function() {
if (this.creatingNewPassphrase) {
// If a new password has been entered but it is invalid, do not send the
// sync state to the API.
if (!this.validateCreatedPassphrases_())
return;
this.syncPrefs.encryptAllData = true;
}
this.syncPrefs.isGooglePassphrase = this.askOldGooglePassphrase;
this.syncPrefs.usePassphrase =
this.creatingNewPassphrase || this.syncPrefs.showPassphrase;
if (this.syncPrefs.usePassphrase) {
var field = this.creatingNewPassphrase ?
this.$$('#passphraseInput') : this.$$('#existingPassphraseInput');
this.syncPrefs.passphrase = field.value;
field.value = '';
}
settings.SyncPrivateApi.setSyncPrefs(
this.syncPrefs, this.setPageStatusCallback_.bind(this));
},
/**
* Callback invoked from calling settings.SyncPrivateApi.setSyncPrefs().
* @param {!settings.PageStatus} callbackState
* @private
*/
setPageStatusCallback_: function(callbackState) {
if (callbackState == settings.PageStatus.DONE) {
this.onCancelTap_();
} else if (callbackState == settings.PageStatus.TIMEOUT) {
this.$.pages.selected = 'timeout';
} else if (callbackState ==
settings.PageStatus.PASSPHRASE_ERROR) {
this.$$('#incorrectPassphraseError').hidden = false;
}
},
/**
* Called when the encryption
* @private
*/
onEncryptionRadioSelectionChanged_: function(event) {
this.creatingNewPassphrase =
event.target.selected == RadioButtonNames.ENCRYPT_WITH_PASSPHRASE;
},
/**
* Computed binding returning the selected encryption radio button.
* @private
*/
selectedEncryptionRadio_: function() {
return this.encryptionRadiosDisabled_() ?
RadioButtonNames.ENCRYPT_WITH_PASSPHRASE :
RadioButtonNames.ENCRYPT_WITH_GOOGLE;
},
/**
* Computed binding returning the selected encryption radio button.
* @private
*/
encryptionRadiosDisabled_: function() {
return this.syncPrefs.usePassphrase || this.syncPrefs.encryptAllData;
},
/**
* Computed binding returning the encryption text body.
* @private
*/
encryptWithPassphraseBody_: function() {
if (this.syncPrefs && this.syncPrefs.fullEncryptionBody)
return this.syncPrefs.fullEncryptionBody;
return this.i18n('encryptWithSyncPassphraseLabel');
},
/**
* @param {boolean} syncAllDataTypes
* @param {boolean} enforced
* @return {boolean} Whether the sync checkbox should be disabled.
*/
shouldSyncCheckboxBeDisabled_: function(syncAllDataTypes, enforced) {
return syncAllDataTypes || enforced;
},
/**
* Checks the supplied passphrases to ensure that they are not empty and that
* they match each other. Additionally, displays error UI if they are
* invalid.
* @return {boolean} Whether the check was successful (i.e., that the
* passphrases were valid).
* @private
*/
validateCreatedPassphrases_: function() {
this.$$('#emptyPassphraseError').hidden = true;
this.$$('#mismatchedPassphraseError').hidden = true;
var passphrase = this.$$('#passphraseInput').value;
if (!passphrase) {
this.$$('#emptyPassphraseError').hidden = false;
return false;
}
var confirmation = this.$$('#passphraseConfirmationInput').value;
if (passphrase != confirmation) {
this.$$('#mismatchedPassphraseError').hidden = false;
return false;
}
return true;
},
});
})();