blob: 63ed1fabba3ce288e71a975b56baf5da6b623e3e [file] [log] [blame]
// Copyright (c) 2012 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.
cr.define('options', function() {
/** @const */ var OptionsPage = options.OptionsPage;
// Variable to track if a captcha challenge was issued. If this gets set to
// true, it stays that way until we are told about successful login from
// the browser. This means subsequent errors (like invalid password) are
// rendered in the captcha state, which is basically identical except we
// don't show the top error blurb 'Error Signing in' or the 'Create
// account' link.
var captchaChallengeActive_ = false;
// When true, the password value may be empty when submitting auth info.
// This is true when requesting an access code or when requesting an OTP or
// captcha with the oauth sign in flow.
var allowEmptyPassword_ = false;
// True if the synced account uses a custom passphrase.
var usePassphrase_ = false;
// True if the synced account uses 'encrypt everything'.
var useEncryptEverything_ = false;
/**
* SyncSetupOverlay class
* Encapsulated handling of the 'Sync Setup' overlay page.
* @class
*/
function SyncSetupOverlay() {
OptionsPage.call(this, 'syncSetup',
loadTimeData.getString('syncSetupOverlayTabTitle'),
'sync-setup-overlay');
}
cr.addSingletonGetter(SyncSetupOverlay);
SyncSetupOverlay.prototype = {
__proto__: OptionsPage.prototype,
/**
* Initializes the page.
*/
initializePage: function() {
OptionsPage.prototype.initializePage.call(this);
var self = this;
$('gaia-login-form').onsubmit = function() {
self.sendCredentialsAndClose_();
return false;
};
$('google-option').onchange = $('explicit-option').onchange = function() {
self.onPassphraseRadioChanged_();
};
$('choose-datatypes-cancel').onclick =
$('sync-setup-cancel').onclick =
$('confirm-everything-cancel').onclick =
$('stop-syncing-cancel').onclick =
$('sync-spinner-cancel').onclick = function() {
self.closeOverlay_();
};
$('confirm-everything-ok').onclick = function() {
self.sendConfiguration_();
};
$('timeout-ok').onclick = function() {
chrome.send('CloseTimeout');
self.closeOverlay_();
};
$('stop-syncing-ok').onclick = function() {
chrome.send('SyncSetupStopSyncing');
self.closeOverlay_();
};
},
showOverlay_: function() {
OptionsPage.navigateToPage('syncSetup');
},
closeOverlay_: function() {
OptionsPage.closeOverlay();
},
/** @inheritDoc */
didShowPage: function() {
var forceLogin = document.location.hash == '#forceLogin';
var result = JSON.stringify({'forceLogin': forceLogin});
chrome.send('SyncSetupAttachHandler', [result]);
},
/** @inheritDoc */
didClosePage: function() {
chrome.send('SyncSetupDidClosePage');
},
getEncryptionRadioCheckedValue_: function() {
var f = $('choose-data-types-form');
for (var i = 0; i < f.encrypt.length; ++i) {
if (f.encrypt[i].checked)
return f.encrypt[i].value;
}
return undefined;
},
getPassphraseRadioCheckedValue_: function() {
var f = $('choose-data-types-form');
for (var i = 0; i < f.option.length; ++i) {
if (f.option[i].checked) {
return f.option[i].value;
}
}
return undefined;
},
disableEncryptionRadioGroup_: function() {
var f = $('choose-data-types-form');
for (var i = 0; i < f.encrypt.length; ++i)
f.encrypt[i].disabled = true;
},
onPassphraseRadioChanged_: function() {
var visible = this.getPassphraseRadioCheckedValue_() == 'explicit';
$('sync-custom-passphrase').hidden = !visible;
},
checkAllDataTypeCheckboxes_: function() {
// Only check the visible ones (since there's no way to uncheck
// the invisible ones).
var checkboxes = $('choose-data-types-body').querySelectorAll(
'.sync-type-checkbox:not([hidden]) input');
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].checked = true;
}
},
setDataTypeCheckboxesEnabled_: function(enabled) {
var checkboxes = $('choose-data-types-body').querySelectorAll('input');
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].disabled = !enabled;
}
},
setCheckboxesToKeepEverythingSynced_: function(value) {
this.setDataTypeCheckboxesEnabled_(!value);
if (value)
this.checkAllDataTypeCheckboxes_();
},
// Returns true if none of the visible checkboxes are checked.
noDataTypesChecked_: function() {
var query = '.sync-type-checkbox:not([hidden]) input:checked';
var checkboxes = $('choose-data-types-body').querySelectorAll(query);
return checkboxes.length == 0;
},
checkPassphraseMatch_: function() {
var emptyError = $('empty-error');
var mismatchError = $('mismatch-error');
emptyError.hidden = true;
mismatchError.hidden = true;
var f = $('choose-data-types-form');
if (this.getPassphraseRadioCheckedValue_() != 'explicit' ||
$('google-option').disabled) {
return true;
}
var customPassphrase = $('custom-passphrase');
if (customPassphrase.value.length == 0) {
emptyError.hidden = false;
return false;
}
var confirmPassphrase = $('confirm-passphrase');
if (confirmPassphrase.value != customPassphrase.value) {
mismatchError.hidden = false;
return false;
}
return true;
},
sendConfiguration_: function() {
// Trying to submit, so hide previous errors.
$('error-text').hidden = true;
var syncAll = $('sync-select-datatypes').selectedIndex == 0;
if (!syncAll && this.noDataTypesChecked_()) {
$('error-text').hidden = false;
return;
}
var encryptAllData = this.getEncryptionRadioCheckedValue_() == 'all';
var usePassphrase;
var customPassphrase;
var googlePassphrase = false;
if (!$('sync-existing-passphrase-container').hidden) {
// If we were prompted for an existing passphrase, use it.
customPassphrase = $('choose-data-types-form').passphrase.value;
usePassphrase = true;
// If we were displaying the 'enter your old google password' prompt,
// then that means this is the user's google password.
googlePassphrase = !$('google-passphrase-needed-body').hidden;
// We allow an empty passphrase, in case the user has disabled
// all their encrypted datatypes. In that case, the PSS will accept
// the passphrase and finish configuration. If the user has enabled
// encrypted datatypes, the PSS will prompt again specifying that the
// passphrase failed.
} else if (!$('google-option').disabled &&
this.getPassphraseRadioCheckedValue_() == 'explicit') {
// The user is setting a custom passphrase for the first time.
if (!this.checkPassphraseMatch_())
return;
customPassphrase = $('custom-passphrase').value;
usePassphrase = true;
} else {
// The user is not setting a custom passphrase.
usePassphrase = false;
}
// Don't allow the user to tweak the settings once we send the
// configuration to the backend.
this.setInputElementsDisabledState_(true);
this.animateDisableLink_($('use-default-link'), true, null);
// These values need to be kept in sync with where they are read in
// SyncSetupFlow::GetDataTypeChoiceData().
var result = JSON.stringify({
'syncAllDataTypes': syncAll,
'bookmarksSynced': syncAll || $('bookmarks-checkbox').checked,
'preferencesSynced': syncAll || $('preferences-checkbox').checked,
'themesSynced': syncAll || $('themes-checkbox').checked,
'passwordsSynced': syncAll || $('passwords-checkbox').checked,
'autofillSynced': syncAll || $('autofill-checkbox').checked,
'extensionsSynced': syncAll || $('extensions-checkbox').checked,
'typedUrlsSynced': syncAll || $('typed-urls-checkbox').checked,
'appsSynced': syncAll || $('apps-checkbox').checked,
'sessionsSynced': syncAll || $('sessions-checkbox').checked,
'encryptAllData': encryptAllData,
'usePassphrase': usePassphrase,
'isGooglePassphrase': googlePassphrase,
'passphrase': customPassphrase
});
chrome.send('SyncSetupConfigure', [result]);
},
/**
* Sets the disabled property of all input elements within the 'Customize
* Sync Preferences' screen. This is used to prohibit the user from changing
* the inputs after confirming the customized sync preferences, or resetting
* the state when re-showing the dialog.
* @param {boolean} disabled True if controls should be set to disabled.
* @private
*/
setInputElementsDisabledState_: function(disabled) {
var configureElements =
$('customize-sync-preferences').querySelectorAll('input');
for (var i = 0; i < configureElements.length; i++)
configureElements[i].disabled = disabled;
$('sync-select-datatypes').disabled = disabled;
var self = this;
this.animateDisableLink_($('customize-link'), disabled, function() {
self.showCustomizePage_(null, true);
});
},
/**
* Animate a link being enabled/disabled. The link is hidden by animating
* its opacity, but to ensure the user doesn't click it during that time,
* its onclick handler is changed to null as well.
* @param {HTMLElement} elt The anchor element to enable/disable.
* @param {boolean} disabled True if the link should be disabled.
* @param {function} enabledFunction The onclick handler when the link is
* enabled.
* @private
*/
animateDisableLink_: function(elt, disabled, enabledFunction) {
if (disabled) {
elt.classList.add('transparent');
elt.onclick = null;
elt.addEventListener('webkitTransitionEnd', function f(e) {
if (e.propertyName != 'opacity')
return;
elt.removeEventListener('webkitTransitionEnd', f);
elt.classList.remove('transparent');
elt.hidden = true;
});
} else {
elt.hidden = false;
elt.onclick = enabledFunction;
}
},
/**
* Shows or hides the Sync data type checkboxes in the advanced
* configuration screen.
* @param {Object} args The configuration data used to show/hide UI.
* @private
*/
setChooseDataTypesCheckboxes_: function(args) {
var datatypeSelect = $('sync-select-datatypes');
datatypeSelect.selectedIndex = args.syncAllDataTypes ? 0 : 1;
$('bookmarks-checkbox').checked = args.bookmarksSynced;
$('preferences-checkbox').checked = args.preferencesSynced;
$('themes-checkbox').checked = args.themesSynced;
if (args.passwordsRegistered) {
$('passwords-checkbox').checked = args.passwordsSynced;
$('passwords-item').hidden = false;
} else {
$('passwords-item').hidden = true;
}
if (args.autofillRegistered) {
$('autofill-checkbox').checked = args.autofillSynced;
$('autofill-item').hidden = false;
} else {
$('autofill-item').hidden = true;
}
if (args.extensionsRegistered) {
$('extensions-checkbox').checked = args.extensionsSynced;
$('extensions-item').hidden = false;
} else {
$('extensions-item').hidden = true;
}
if (args.typedUrlsRegistered) {
$('typed-urls-checkbox').checked = args.typedUrlsSynced;
$('omnibox-item').hidden = false;
} else {
$('omnibox-item').hidden = true;
}
if (args.appsRegistered) {
$('apps-checkbox').checked = args.appsSynced;
$('apps-item').hidden = false;
} else {
$('apps-item').hidden = true;
}
if (args.sessionsRegistered) {
$('sessions-checkbox').checked = args.sessionsSynced;
$('sessions-item').hidden = false;
} else {
$('sessions-item').hidden = true;
}
this.setCheckboxesToKeepEverythingSynced_(args.syncAllDataTypes);
},
setEncryptionRadios_: function(args) {
if (args.encryptAllData) {
$('encrypt-all-option').checked = true;
this.disableEncryptionRadioGroup_();
} else {
$('encrypt-sensitive-option').checked = true;
}
},
setPassphraseRadios_: function(args) {
if (args.usePassphrase) {
$('explicit-option').checked = true;
// The passphrase, once set, cannot be unset, but we show a reset link.
$('explicit-option').disabled = true;
$('google-option').disabled = true;
$('sync-custom-passphrase').hidden = true;
} else {
$('google-option').checked = true;
}
},
setCheckboxesAndErrors_: function(args) {
this.setChooseDataTypesCheckboxes_(args);
this.setEncryptionRadios_(args);
this.setPassphraseRadios_(args);
},
showConfigure_: function(args) {
var datatypeSelect = $('sync-select-datatypes');
var self = this;
datatypeSelect.onchange = function() {
var syncAll = this.selectedIndex == 0;
self.setCheckboxesToKeepEverythingSynced_(syncAll);
};
this.resetPage_('sync-setup-configure');
$('sync-setup-configure').hidden = false;
// onsubmit is changed when submitting a passphrase. Reset it to its
// default.
$('choose-data-types-form').onsubmit = function() {
self.sendConfiguration_();
return false;
};
if (args) {
this.setCheckboxesAndErrors_(args);
this.useEncryptEverything_ = args.encryptAllData;
// Whether to display the 'Sync everything' confirmation page or the
// customize data types page.
var syncAllDataTypes = args.syncAllDataTypes;
this.usePassphrase_ = args.usePassphrase;
if (args.showSyncEverythingPage == false || this.usePassphrase_ ||
syncAllDataTypes == false || args.showPassphrase) {
this.showCustomizePage_(args, syncAllDataTypes);
} else {
this.showSyncEverythingPage_();
}
}
},
showSpinner_: function() {
this.resetPage_('sync-setup-spinner');
$('sync-setup-spinner').hidden = false;
this.setThrobbersVisible_(true);
},
showTimeoutPage_: function() {
this.resetPage_('sync-setup-timeout');
$('sync-setup-timeout').hidden = false;
},
showSyncEverythingPage_: function() {
$('confirm-sync-preferences').hidden = false;
$('customize-sync-preferences').hidden = true;
// Reset the selection to 'Sync everything'.
$('sync-select-datatypes').selectedIndex = 0;
// The default state is to sync everything.
this.setCheckboxesToKeepEverythingSynced_(true);
// Encrypt passwords is the default, but don't set it if the previously
// synced account is already set to encrypt everything.
if (!this.useEncryptEverything_)
$('encrypt-sensitive-option').checked = true;
// If the account is not synced with a custom passphrase, reset the
// passphrase radio when switching to the 'Sync everything' page.
if (!this.usePassphrase_) {
$('google-option').checked = true;
$('sync-custom-passphrase').hidden = true;
}
$('confirm-everything-ok').focus();
},
/**
* Reveals the UI for entering a custom passphrase during initial setup.
* This happens if the user has previously enabled a custom passphrase on a
* different machine.
* @param {Array} args The args that contain the passphrase UI
* configuration.
* @private
*/
showPassphraseContainer_: function(args) {
// Once we require a passphrase, we prevent the user from returning to
// the Sync Everything pane.
$('use-default-link').hidden = true;
$('sync-custom-passphrase-container').hidden = true;
$('sync-existing-passphrase-container').hidden = false;
$('normal-body').hidden = true;
$('google-passphrase-needed-body').hidden = true;
// Display the correct prompt to the user depending on what type of
// passphrase is needed.
if (args.usePassphrase)
$('normal-body').hidden = false;
else
$('google-passphrase-needed-body').hidden = false;
$('passphrase-learn-more').hidden = false;
// Warn the user about their incorrect passphrase if we need a passphrase
// and the passphrase field is non-empty (meaning they tried to set it
// previously but failed).
$('incorrect-passphrase').hidden =
!(args.usePassphrase && args.passphraseFailed);
$('sync-passphrase-warning').hidden = false;
$('passphrase').focus();
},
/** @private */
showCustomizePage_: function(args, syncEverything) {
$('confirm-sync-preferences').hidden = true;
$('customize-sync-preferences').hidden = false;
$('sync-custom-passphrase-container').hidden = false;
$('sync-existing-passphrase-container').hidden = true;
// If the user has selected the 'Customize' page on initial set up, it's
// likely he intends to change the data types. Select the
// 'Choose data types' option in this case.
var index = syncEverything ? 0 : 1;
$('sync-select-datatypes').selectedIndex = index;
this.setDataTypeCheckboxesEnabled_(!syncEverything);
// The passphrase input may need to take over focus from the OK button, so
// set focus before that logic.
$('choose-datatypes-ok').focus();
if (args && args.showPassphrase) {
this.showPassphraseContainer_(args);
} else {
// We only show the 'Use Default' link if we're not prompting for an
// existing passphrase.
var self = this;
this.animateDisableLink_($('use-default-link'), false, function() {
self.showSyncEverythingPage_();
});
}
},
/**
* Shows the appropriate sync setup page.
* @param {string} page A page of the sync setup to show.
* @param {object} args Data from the C++ to forward on to the right
* section.
*/
showSyncSetupPage_: function(page, args) {
this.setThrobbersVisible_(false);
// Hide an existing visible overlay (ensuring the close button is not
// hidden).
var children = document.querySelectorAll(
'#sync-setup-overlay > *:not(.close-button)');
for (var i = 0; i < children.length; i++)
children[i].hidden = true;
this.setInputElementsDisabledState_(false);
// NOTE: Because both showGaiaLogin_() and showConfigure_() change the
// focus, we need to ensure that the overlay container and dialog aren't
// [hidden] (as trying to focus() nodes inside of a [hidden] DOM section
// doesn't work).
if (page == 'done')
this.closeOverlay_();
else
this.showOverlay_();
if (page == 'login')
this.showGaiaLogin_(args);
else if (page == 'configure' || page == 'passphrase')
this.showConfigure_(args);
else if (page == 'spinner')
this.showSpinner_();
else if (page == 'timeout')
this.showTimeoutPage_();
},
/**
* Changes the visibility of throbbers on this page.
* @param {boolean} visible Whether or not to set all throbber nodes
* visible.
*/
setThrobbersVisible_: function(visible) {
var throbbers = document.getElementsByClassName('throbber');
for (var i = 0; i < throbbers.length; i++)
throbbers[i].style.visibility = visible ? 'visible' : 'hidden';
},
/**
* Set the appropriate focus on the GAIA login section of the overlay.
* @private
*/
loginSetFocus_: function() {
var email = this.getLoginEmail_();
if (email && !email.value) {
email.focus();
return;
}
var passwd = this.getLoginPasswd_();
if (passwd)
passwd.focus();
},
/**
* Get the login email text input DOM element.
* @return {DOMElement} The login email text input.
* @private
*/
getLoginEmail_: function() {
return $('gaia-email');
},
/**
* Get the login password text input DOM element.
* @return {DOMElement} The login password text input.
* @private
*/
getLoginPasswd_: function() {
return $('gaia-passwd');
},
/**
* Get the sign in button DOM element.
* @return {DOMElement} The sign in button.
* @private
*/
getSignInButton_: function() {
return $('sign-in');
},
showAccessCodeRequired_: function() {
this.allowEmptyPassword_ = true;
$('password-row').hidden = true;
$('email-row').hidden = true;
$('otp-input-row').hidden = true;
$('access-code-input-row').hidden = false;
$('access-code').disabled = false;
$('access-code').focus();
},
showOtpRequired_: function() {
this.allowEmptyPassword_ = true;
$('password-row').hidden = true;
$('email-row').hidden = true;
$('access-code-input-row').hidden = true;
$('otp-input-row').hidden = false;
$('otp').disabled = false;
$('otp').focus();
},
showCaptcha_: function(args) {
this.allowEmptyPassword_ = args.hideEmailAndPassword;
this.captchaChallengeActive_ = true;
if (args.hideEmailAndPassword) {
$('password-row').hidden = true;
$('email-row').hidden = true;
$('create-account-div').hidden = true;
} else {
// The captcha takes up lots of space, so make room.
$('top-blurb-error').hidden = true;
$('create-account-div').hidden = true;
$('gaia-email').disabled = true;
$('gaia-passwd').disabled = false;
}
// It's showtime for the captcha now.
$('captcha-div').hidden = false;
$('captcha-value').disabled = false;
$('captcha-wrapper').style.backgroundImage = url(args.captchaUrl);
},
/**
* Reset the state of all descendant elements of a root element to their
* initial state.
* The initial state is specified by adding a class to the descendant
* element in sync_setup_overlay.html.
* @param {HTMLElement} pageElementId The root page element id.
* @private
*/
resetPage_: function(pageElementId) {
var page = $(pageElementId);
var forEach = function(arr, fn) {
var length = arr.length;
for (var i = 0; i < length; i++) {
fn(arr[i]);
}
};
forEach(page.getElementsByClassName('reset-hidden'),
function(elt) { elt.hidden = true; });
forEach(page.getElementsByClassName('reset-shown'),
function(elt) { elt.hidden = false; });
forEach(page.getElementsByClassName('reset-disabled'),
function(elt) { elt.disabled = true; });
forEach(page.getElementsByClassName('reset-enabled'),
function(elt) { elt.disabled = false; });
forEach(page.getElementsByClassName('reset-value'),
function(elt) { elt.value = ''; });
forEach(page.getElementsByClassName('reset-opaque'),
function(elt) { elt.classList.remove('transparent'); });
},
showGaiaLogin_: function(args) {
var oldAccessCodeValue = $('access-code').value;
this.resetPage_('sync-setup-login');
$('sync-setup-login').hidden = false;
this.allowEmptyPassword_ = false;
this.captchaChallengeActive_ = false;
var f = $('gaia-login-form');
var email = $('gaia-email');
var passwd = $('gaia-passwd');
if (f) {
if (args.user != undefined) {
if (email.value != args.user)
passwd.value = ''; // Reset the password field
email.value = args.user;
}
if (!args.editableUser) {
$('email-row').hidden = true;
var span = $('email-readonly');
span.textContent = email.value;
$('email-readonly-row').hidden = false;
$('create-account-div').hidden = true;
}
f.accessCode.disabled = true;
f.otp.disabled = true;
}
if (1 == args.error) {
if (oldAccessCodeValue) {
$('errormsg-0-access-code').hidden = false;
this.showAccessCodeRequired_();
} else {
$('errormsg-1-password').hidden = (args.errorMessage != undefined);
}
this.setBlurbError_(args.errorMessage);
} else if (3 == args.error) {
$('errormsg-0-connection').hidden = false;
this.setBlurbError_(args.errorMessage);
} else if (4 == args.error) {
this.showCaptcha_(args);
} else if (7 == args.error) {
this.setBlurbError_(loadTimeData.getString('serviceUnavailableError'));
} else if (8 == args.error) {
if (args.askForOtp) {
this.showOtpRequired_();
} else {
if (oldAccessCodeValue)
$('errormsg-0-access-code').hidden = false;
this.showAccessCodeRequired_();
}
} else if (args.errorMessage) {
this.setBlurbError_(args.errorMessage);
}
if (args.fatalError) {
$('errormsg-fatal').hidden = false;
$('sign-in').disabled = true;
return;
}
$('sign-in').disabled = false;
$('sign-in').value = loadTimeData.getString('signin');
this.loginSetFocus_();
},
resetErrorVisibility_: function() {
$('errormsg-0-email').hidden = true;
$('errormsg-0-password').hidden = true;
$('errormsg-1-password').hidden = true;
$('errormsg-0-connection').hidden = true;
$('errormsg-0-access-code').hidden = true;
$('errormsg-0-otp').hidden = true;
},
setBlurbError_: function(errorMessage) {
if (this.captchaChallengeActive_)
return; // No blurb in captcha challenge mode.
if (errorMessage) {
$('error-signing-in').hidden = true;
$('error-custom').hidden = false;
$('error-custom').textContent = errorMessage;
} else {
$('error-signing-in').hidden = false;
$('error-custom').hidden = true;
}
$('top-blurb-error').hidden = false;
$('gaia-email').disabled = false;
$('gaia-passwd').disabled = false;
},
matchesASPRegex_: function(toMatch) {
var noSpaces = /[a-z]{16}/;
var withSpaces = /([a-z]{4}\s){3}[a-z]{4}/;
if (toMatch.match(noSpaces) || toMatch.match(withSpaces))
return true;
return false;
},
setErrorVisibility_: function() {
this.resetErrorVisibility_();
var f = $('gaia-login-form');
var email = $('gaia-email');
var passwd = $('gaia-passwd');
if (!email.value) {
$('errormsg-0-email').hidden = false;
this.setBlurbError_();
return false;
}
// Don't enforce password being non-blank when checking access code (it
// will have been cleared when the page was displayed).
if (!this.allowEmptyPassword_ && !passwd.value) {
$('errormsg-0-password').hidden = false;
this.setBlurbError_();
return false;
}
if (!f.accessCode.disabled && !f.accessCode.value) {
$('errormsg-0-access-code').hidden = false;
return false;
}
if (f.accessCode.disabled && this.matchesASPRegex_(passwd.value) &&
$('asp-warning-div').hidden) {
$('asp-warning-div').hidden = false;
$('gaia-passwd').value = '';
return false;
}
if (!f.otp.disabled && !f.otp.value) {
$('errormsg-0-otp').hidden = false;
return false;
}
return true;
},
sendCredentialsAndClose_: function() {
if (!this.setErrorVisibility_()) {
return false;
}
$('gaia-email').disabled = true;
$('gaia-passwd').disabled = true;
$('captcha-value').disabled = true;
$('access-code').disabled = true;
$('otp').disabled = true;
this.setThrobbersVisible_(true);
var f = $('gaia-login-form');
var email = $('gaia-email');
var passwd = $('gaia-passwd');
var result = JSON.stringify({'user': email.value,
'pass': passwd.value,
'captcha': f.captchaValue.value,
'otp': f.otp.value,
'accessCode': f.accessCode.value
});
$('sign-in').disabled = true;
chrome.send('SyncSetupSubmitAuth', [result]);
},
showSuccessAndClose_: function() {
$('sign-in').value = loadTimeData.getString('loginSuccess');
setTimeout(this.closeOverlay_, 1600);
},
showSuccessAndSettingUp_: function() {
$('sign-in').value = loadTimeData.getString('settingUp');
this.setThrobbersVisible_(true);
$('top-blurb-error').hidden = true;
},
/**
* Displays the stop syncing dialog.
* @private
*/
showStopSyncingUI_: function() {
// Hide any visible children of the overlay.
var overlay = $('sync-setup-overlay');
for (var i = 0; i < overlay.children.length; i++)
overlay.children[i].hidden = true;
// Bypass OptionsPage.navigateToPage because it will call didShowPage
// which will set its own visible page, based on the flow state.
this.visible = true;
$('sync-setup-stop-syncing').hidden = false;
$('stop-syncing-cancel').focus();
},
/**
* Steps into the appropriate Sync Setup error UI.
* @private
*/
showErrorUI_: function() {
chrome.send('SyncSetupShowErrorUI');
},
/**
* Determines the appropriate page to show in the Sync Setup UI based on
* the state of the Sync backend.
* @private
*/
showSetupUI_: function() {
chrome.send('SyncSetupShowSetupUI');
},
/**
* Shows advanced configuration UI, skipping the login dialog.
* @private
*/
showSetupUIWithoutLogin_: function() {
chrome.send('SyncSetupShowSetupUIWithoutLogin');
},
/**
* Forces user to sign out of Chrome for Chrome OS.
* @private
*/
doSignOutOnAuthError_: function() {
chrome.send('SyncSetupDoSignOutOnAuthError');
},
/**
* Hides the outer elements of the login UI. This is used by the sync promo
* to customize the look of the login box.
*/
hideOuterLoginUI_: function() {
$('sync-setup-overlay-title').hidden = true;
$('sync-setup-cancel').hidden = true;
}
};
// These get methods should only be called by the WebUI tests.
SyncSetupOverlay.getLoginEmail = function() {
return SyncSetupOverlay.getInstance().getLoginEmail_();
};
SyncSetupOverlay.getLoginPasswd = function() {
return SyncSetupOverlay.getInstance().getLoginPasswd_();
};
SyncSetupOverlay.getSignInButton = function() {
return SyncSetupOverlay.getInstance().getSignInButton_();
};
// These methods are for general consumption.
SyncSetupOverlay.showErrorUI = function() {
SyncSetupOverlay.getInstance().showErrorUI_();
};
SyncSetupOverlay.showSetupUI = function() {
SyncSetupOverlay.getInstance().showSetupUI_();
};
SyncSetupOverlay.showSetupUIWithoutLogin = function() {
SyncSetupOverlay.getInstance().showSetupUIWithoutLogin_();
};
SyncSetupOverlay.doSignOutOnAuthError = function() {
SyncSetupOverlay.getInstance().doSignOutOnAuthError_();
};
SyncSetupOverlay.showSyncSetupPage = function(page, args) {
SyncSetupOverlay.getInstance().showSyncSetupPage_(page, args);
};
SyncSetupOverlay.showSuccessAndClose = function() {
SyncSetupOverlay.getInstance().showSuccessAndClose_();
};
SyncSetupOverlay.showSuccessAndSettingUp = function() {
SyncSetupOverlay.getInstance().showSuccessAndSettingUp_();
};
SyncSetupOverlay.showStopSyncingUI = function() {
SyncSetupOverlay.getInstance().showStopSyncingUI_();
};
// Export
return {
SyncSetupOverlay: SyncSetupOverlay
};
});