blob: 1682433657be4d02d6a89112a5a79c91626f27ca [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.
cr.exportPath('settings');
/**
* The state of sync. This is the data structure sent back and forth between
* C++ and JS. Its naming and structure is not optimal, but changing it would
* require changes to the C++ handler, which is already functional.
* @typedef {{
* appsEnforced: boolean,
* appsRegistered: boolean,
* appsSynced: boolean,
* autofillEnforced: boolean,
* autofillRegistered: boolean,
* autofillSynced: boolean,
* bookmarksEnforced: boolean,
* bookmarksRegistered: boolean,
* bookmarksSynced: boolean,
* encryptAllData: boolean,
* encryptAllDataAllowed: boolean,
* enterGooglePassphraseBody: (string|undefined),
* enterPassphraseBody: (string|undefined),
* extensionsEnforced: boolean,
* extensionsRegistered: boolean,
* extensionsSynced: boolean,
* fullEncryptionBody: string,
* isGooglePassphrase: (boolean|undefined),
* passphrase: (string|undefined),
* passphraseFailed: boolean,
* passwordsEnforced: boolean,
* passwordsRegistered: boolean,
* passwordsSynced: boolean,
* preferencesEnforced: boolean,
* preferencesRegistered: boolean,
* preferencesSynced: boolean,
* showPassphrase: boolean,
* syncAllDataTypes: boolean,
* syncNothing: boolean,
* tabsEnforced: boolean,
* tabsRegistered: boolean,
* tabsSynced: boolean,
* themesEnforced: boolean,
* themesRegistered: boolean,
* themesSynced: boolean,
* typedUrlsEnforced: boolean,
* typedUrlsRegistered: boolean,
* typedUrlsSynced: boolean,
* usePassphrase: boolean,
* wifiCredentialsEnforced: (boolean|undefined),
* wifiCredentialsSynced: (boolean|undefined)
* }}
*/
settings.SyncPrefs;
/**
* @typedef {{actionLinkText: (string|undefined),
* childUser: (boolean|undefined),
* hasError: (boolean|undefined),
* hasUnrecoverableError: (boolean|undefined),
* managed: (boolean|undefined),
* setupCompleted: (boolean|undefined),
* setupInProgress: (boolean|undefined),
* signedIn: (boolean|undefined),
* signinAllowed: (boolean|undefined),
* signoutAllowed: (boolean|undefined),
* statusText: (string|undefined),
* supervisedUser: (boolean|undefined),
* syncSystemEnabled: (boolean|undefined)}}
* @see chrome/browser/ui/webui/settings/sync_handler.cc
*/
settings.SyncStatus;
/**
* @enum {string}
*/
settings.PageStatus = {
SPINNER: 'spinner', // Before the page has loaded.
CONFIGURE: 'configure', // Preferences ready to be configured.
TIMEOUT: 'timeout', // Preferences loading has timed out.
DONE: 'done', // Sync subpage can be closed now.
PASSPHRASE_ERROR: 'passphraseError', // Error in the passphrase.
};
cr.define('settings', function() {
/**
* API which encapsulates messaging between JS and C++ for the sync page.
* @constructor
*/
function SyncPrivateApi() {}
/** @private {?function(!string, !string)} */
SyncPrivateApi.getProfileInfoCallback_ = null;
/** @private {?function(!Array<string>)} */
SyncPrivateApi.getAvailableIconsCallback_ = null;
/** @private {?function(settings.SyncPrefs)} */
SyncPrivateApi.syncPrefsCallback_ = null;
/** @private {?function(settings.PageStatus)} */
SyncPrivateApi.setPageStatusCallback_ = null;
/**
* Called from JavaScript. Gets the current profile name and icon.
* @param {?function(!string, !string)} callback
*/
SyncPrivateApi.getProfileInfo = function(callback) {
SyncPrivateApi.getProfileInfoCallback_ = callback;
chrome.send('getProfileInfo');
};
/**
* Called from C++ as a response to getIconsAndNames.
* @param {!string} name The current profile name.
* @param {!string} iconUrl The current profile icon's URL. Can be a data URL.
*/
SyncPrivateApi.receiveProfileInfo = function(name, iconUrl) {
if (SyncPrivateApi.getProfileInfoCallback_)
SyncPrivateApi.getProfileInfoCallback_(name, iconUrl);
};
<if expr="not chromeos">
/**
* Called from JavaScript. Gets the available profile icons to choose from.
* @param {!function(!Array<string>)} callback
*/
SyncPrivateApi.getAvailableIcons = function(callback) {
SyncPrivateApi.getAvailableIconsCallback_ = callback;
chrome.send('requestDefaultProfileIcons');
};
/**
* Called from C++ as a response to getAvailableIcons.
* @param {!Array<string>} iconUrls An array of icon URLs.
*/
SyncPrivateApi.receiveAvailableIcons = function(iconUrls) {
if (SyncPrivateApi.getAvailableIconsCallback_)
SyncPrivateApi.getAvailableIconsCallback_(iconUrls);
};
/**
* Called from JavaScript. Sets the profile icon and name.
* @param {!string} iconUrl The new profile URL.
* @param {!string} name The new profile name.
*/
SyncPrivateApi.setProfileIconAndName = function(iconUrl, name) {
chrome.send('setProfileIconAndName', [iconUrl, name]);
};
</if>
/**
* Starts the signin process for the user. Does nothing if the user is
* already signed in.
* @private
*/
SyncPrivateApi.startSignIn = function() {
chrome.send('SyncSetupStartSignIn');
};
/**
* Disconnects the signed in user.
* @param {!boolean} deleteProfile
* @private
*/
SyncPrivateApi.disconnect = function(deleteProfile) {
chrome.send('SyncSetupStopSyncing', [deleteProfile]);
};
/**
* Determines the appropriate page to show in the Sync Setup UI based on
* the state of the Sync backend. Does nothing if the user is not signed in.
* @private
*/
SyncPrivateApi.showSetupUI = function() {
chrome.send('SyncSetupShowSetupUI');
chrome.send('coreOptionsUserMetricsAction', ['Options_ShowSyncAdvanced']);
};
/**
* Function to invoke when the sync page has been navigated to. This registers
* the UI as the "active" sync UI so that if the user tries to open another
* sync UI, this one will be shown instead.
*/
SyncPrivateApi.didNavigateToSyncPage = function() {
chrome.send('SyncSetupShowSetupUI');
};
/**
* Function to invoke when leaving the sync page so that the C++ layer can be
* notified that the sync UI is no longer open.
*/
SyncPrivateApi.didNavigateAwayFromSyncPage = function() {
SyncPrivateApi.setPageStatusCallback_ = null;
chrome.send('SyncSetupDidClosePage');
};
/**
* Sets the callback to be invoked when sync data has been fetched.
* @param {!function(settings.SyncPrefs)} callback
*/
SyncPrivateApi.setSyncPrefsCallback = function(callback) {
SyncPrivateApi.syncPrefsCallback_ = callback;
};
/**
* Handler for when state has been fetched from C++.
* @param {!settings.SyncPrefs} syncPrefsFromCpp
* @private
*/
SyncPrivateApi.sendSyncPrefs_ = function(syncPrefsFromCpp) {
if (SyncPrivateApi.syncPrefsCallback_)
SyncPrivateApi.syncPrefsCallback_(syncPrefsFromCpp);
};
/**
* Sets the sync state by sending it to the C++ layer.
* @param {!settings.SyncPrefs} syncPrefs
* @param {!function(settings.PageStatus)} callback
*/
SyncPrivateApi.setSyncPrefs = function(syncPrefs, callback) {
SyncPrivateApi.setPageStatusCallback_ = callback;
chrome.send('SyncSetupConfigure', [JSON.stringify(syncPrefs)]);
};
/**
* Handler for when setSyncPrefs() has either succeeded or failed.
* @param {!settings.PageStatus} status
* @private
*/
SyncPrivateApi.setPageStatus_ = function(status) {
if (SyncPrivateApi.setPageStatusCallback_)
SyncPrivateApi.setPageStatusCallback_(status);
SyncPrivateApi.setPageStatusCallback_ = null;
};
/**
* Sends a request from JS to C++ for the current sync status.
* @param {!function(settings.SyncStatus)} callback
*/
SyncPrivateApi.getSyncStatus = function(callback) {
SyncPrivateApi.syncStatusCallback_ = callback;
chrome.send('SyncSetupGetSyncStatus');
};
/**
* Handler for when sync status has been fetched from C++.
* @param {!settings.SyncStatus} syncStatusFromCpp
* @private
*/
SyncPrivateApi.sendSyncStatus = function(syncStatusFromCpp) {
if (SyncPrivateApi.syncStatusCallback_)
SyncPrivateApi.syncStatusCallback_(syncStatusFromCpp);
};
/**
* Sends a request from JS to C++ to open the multi-profile User Manager.
*/
SyncPrivateApi.manageOtherPeople = function() {
chrome.send('SyncSetupManageOtherPeople');
};
/**
* This function encapsulates the logic that maps from the legacy
* SyncSettingsHandler to an API natural to the new Polymer implementation.
* @param {!settings.PageStatus} status
* @param {!settings.SyncPrefs} prefs
*/
SyncPrivateApi.showSyncSetupPage = function(status, prefs) {
switch (status) {
case settings.PageStatus.TIMEOUT:
case settings.PageStatus.DONE:
SyncPrivateApi.setPageStatus_(status);
break;
case settings.PageStatus.CONFIGURE:
if (prefs.passphraseFailed) {
SyncPrivateApi.setPageStatus_(
settings.PageStatus.PASSPHRASE_ERROR);
return;
}
SyncPrivateApi.sendSyncPrefs_(prefs);
break;
default:
// Other statuses (i.e. "spinner") are ignored.
}
};
return {
SyncPrivateApi: SyncPrivateApi,
};
});