blob: 07ea937a40ba959bd88d00d3299d7b77b38c3470 [file] [log] [blame]
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/html/i18n_behavior.html">
<link rel="import" href="chrome://resources/html/util.html">
<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
<link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html">
<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
<link rel="import" href="chrome://resources/cr_elements/cr_radio_button/cr_radio_button.html">
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button-light.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-radio-group/paper-radio-group.html">
<link rel="import" href="sync_browser_proxy.html">
<link rel="import" href="../icons.html">
<link rel="import" href="../privacy_page/personalization_options.html">
<link rel="import" href="../route.html">
<link rel="import" href="../settings_shared_css.html">
<link rel="import" href="../settings_vars_css.html">
<if expr="not chromeos">
<link rel="import" href="chrome://resources/cr_elements/cr_toast/cr_toast.html">
</if>
<dom-module id="settings-sync-page">
<template>
<style include="settings-shared iron-flex">
#sync-section-toggle:not([actionable]) {
opacity: var(--cr-disabled-opacity);
}
#create-password-box {
/* In order to line up with the encryption radio box text. */
margin-inline-start: var(--settings-indent-width);
}
#create-password-box {
margin-bottom: 1em;
}
#create-password-box .list-item {
margin-bottom: var(--cr-form-field-bottom-spacing);
}
cr-input {
--cr-input-width: var(--settings-input-max-width);
}
#existingPassphrase {
border-bottom: var(--settings-separator-line);
/* This particular list frame is not indented. */
padding-inline-start: var(--settings-box-row-padding);
}
#submitExistingPassphrase {
/* The submit button for the existing passphrase is on the same line. */
margin-inline-start: 16px;
}
#passphraseRecoverHint {
align-items: center;
}
#sync-data-types .list-item:not([hidden]) ~ .list-item:not([hidden]) {
border-top: var(--settings-separator-line);
}
#other-sync-items > .list-item {
border-top: var(--settings-separator-line);
}
.passphrase-reset-icon {
margin-right: 8px;
}
<if expr="not chromeos">
#toast {
color: white;
left: 0;
z-index: 1;
}
:host-context([dir='rtl']) #toast {
left: auto;
right: 0;
}
</if>
</style>
<if expr="not chromeos">
<template is="dom-if" if="[[shouldShowSyncAccountControl_(
unifiedConsentEnabled, syncStatus.syncSystemEnabled,
syncStatus.signinAllowed)]]">
<settings-sync-account-control embedded-in-subpage
sync-status="[[syncStatus]]"
promo-label-with-account="$i18n{peopleSignInPrompt}"
promo-label-with-no-account="$i18n{peopleSignInPrompt}"
promo-secondary-label-with-account=
"$i18n{peopleSignInPromptSecondaryWithAccount}"
promo-secondary-label-with-no-account=
"$i18n{peopleSignInPromptSecondaryWithNoAccount}">
</settings-sync-account-control>
</template>
</if>
<template is="dom-if" if="[[shouldShowExistingPassphraseBelowAccount_(
unifiedConsentEnabled, syncPrefs.passphraseRequired)]]">
<div id="existingPassphrase" class="list-frame">
<div id="existingPassphraseTitle" class="list-item">
<div class="start">
<div>$i18n{existingPassphraseTitle}</div>
<div class="secondary">
[[enterPassphrasePrompt_(syncPrefs.passphraseTypeIsCustom)]]
<a href="$i18nRaw{syncErrorHelpUrl}" target="_blank">
$i18n{learnMore}
</a>
</div>
</div>
</div>
<div id="existingPassphraseContainer" class="list-item">
<cr-input id="existingPassphraseInput" type="password"
value="{{existingPassphrase_}}"
placeholder="$i18n{passphrasePlaceholder}"
error-message="$i18n{incorrectPassphraseError}"
on-keypress="onSubmitExistingPassphraseTap_">
<paper-button id="submitExistingPassphrase" slot="suffix"
on-click="onSubmitExistingPassphraseTap_"
class="action-button" disabled="[[!existingPassphrase_]]">
$i18n{submitPassphraseButton}
</paper-button>
</cr-input>
</div>
<div id="passphraseRecoverHint" class="list-item">
<span>$i18nRaw{passphraseRecover}</span>
</div>
</div>
</template>
<!-- A change of the unified consent toggle state is automatically handled
in the C++ code after a change in the pref is observed. -->
<settings-toggle-button id="unifiedConsentToggle" class="first"
pref="{{prefs.unified_consent_given}}"
label="$i18n{syncUnifiedConsentToggleTitle}"
on-settings-boolean-control-change="onUnifiedConsentToggleChange_"
hidden="[[!shouldShowUnifiedConsentToggle_(unifiedConsentEnabled,
syncStatus.disabled, syncStatus.signedIn)]]"
disabled="[[syncPrefs.encryptAllData]]">
</settings-toggle-button>
<div class="settings-box two-line" id="sync-section-toggle"
actionable$="[[!syncSectionDisabled_]]"
on-click="toggleExpandButton_"
hidden="[[!shouldShowSyncControls_(unifiedConsentEnabled,
syncStatus.disabled)]]">
<div class="start">
<div>$i18n{sync}</div>
<div class="secondary">$i18n{syncDescription}</div>
</div>
<cr-expand-button expanded="{{syncSectionOpened_}}"
disabled$="[[syncSectionDisabled_]]" alt="$i18n{syncExpandA11yLabel}">
</cr-expand-button>
</div>
<iron-collapse id="sync-section" opened="[[syncSectionOpened_]]"
hidden="[[syncSectionDisabled_]]">
<div id="[[pages_.SPINNER]]" class="settings-box first"
hidden$="[[!isStatus_(pages_.SPINNER, pageStatus_)]]">
$i18n{syncLoading}
</div>
<div id="[[pages_.TIMEOUT]]" class="settings-box first"
hidden$="[[!isStatus_(pages_.TIMEOUT, pageStatus_)]]">
$i18n{syncTimeout}
</div>
<div id="[[pages_.CONFIGURE]]"
hidden$="[[!isStatus_(pages_.CONFIGURE, pageStatus_)]]">
<!-- TODO(http://crbug.com/862983) Remove this section once the Unified
Consent feature is launched. -->
<template is="dom-if" if="[[shouldShowExistingPassphraseInSyncSection_(
unifiedConsentEnabled, syncPrefs.passphraseRequired)]]">
<div id="existingPassphrase" class="list-frame">
<div class="list-item">
<span>
[[enterPassphrasePrompt_(syncPrefs.passphraseTypeIsCustom)]]
<a href="$i18nRaw{syncErrorHelpUrl}" target="_blank">
$i18n{learnMore}
</a>
</span>
</div>
<div id="existingPassphraseContainer" class="list-item">
<cr-input id="existingPassphraseInput" type="password"
value="{{existingPassphrase_}}"
placeholder="$i18n{passphrasePlaceholder}"
error-message="$i18n{incorrectPassphraseError}"
on-keypress="onSubmitExistingPassphraseTap_">
<paper-button id="submitExistingPassphrase" slot="suffix"
on-click="onSubmitExistingPassphraseTap_"
class="action-button" disabled="[[!existingPassphrase_]]">
$i18n{submitPassphraseButton}
</paper-button>
</cr-input>
</div>
<div id="passphraseRecoverHint" class="list-item">
<span>$i18nRaw{passphraseRecover}</span>
</div>
</div>
</template>
<div class="settings-box first" hidden="[[unifiedConsentEnabled]]">
<div id="syncEverythingCheckboxLabel" class="start">
$i18n{syncEverythingCheckboxLabel}
</div>
<cr-toggle id="syncAllDataTypesControl"
checked="{{syncPrefs.syncAllDataTypes}}"
on-change="onSyncAllDataTypesChanged_"
aria-labelledby="syncEverythingCheckboxLabel">
</cr-toggle>
</div>
<div class="list-frame" id="sync-data-types">
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.appsRegistered]]">
<div id="appCheckboxLabel" class="flex">
$i18n{appCheckboxLabel}
</div>
<cr-toggle checked="{{syncPrefs.appsSynced}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.appsEnforced)]]"
aria-labelledby="appCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.autofillRegistered]]">
<div id="autofillCheckboxLabel" class="flex">
$i18n{autofillCheckboxLabel}
</div>
<!-- Autofill has a special on-change handler to deal with
Payments integration. -->
<cr-toggle checked="{{syncPrefs.autofillSynced}}"
on-change="onAutofillDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.autofillEnforced)]]"
aria-labelledby="autofillCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.bookmarksRegistered]]">
<div id="bookmarksCheckboxLabel" class="flex">
$i18n{bookmarksCheckboxLabel}
</div>
<cr-toggle checked="{{syncPrefs.bookmarksSynced}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.bookmarksEnforced)]]"
aria-labelledby="bookmarksCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.extensionsRegistered]]">
<div id="extensionsCheckboxLabel" class="flex">
$i18n{extensionsCheckboxLabel}
</div>
<cr-toggle checked="{{syncPrefs.extensionsSynced}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.extensionsEnforced)]]"
aria-labelledby="extensionsCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.typedUrlsRegistered]]">
<div id="historyCheckboxLabel" class="flex">
$i18n{historyCheckboxLabel}
</div>
<!-- TypedUrls has a special on-change handler to deal with user
events. -->
<cr-toggle id="historyToggle"
checked="{{syncPrefs.typedUrlsSynced}}"
on-change="onTypedUrlsDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.typedUrlsEnforced)]]"
aria-labelledby="historyCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.passwordsRegistered]]">
<div id="passwordsCheckboxLabel" class="flex">
$i18n{passwordsCheckboxLabel}
</div>
<cr-toggle checked="{{syncPrefs.passwordsSynced}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.passwordsEnforced)]]"
aria-labelledby="passwordsCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.preferencesRegistered]]">
<div id="settingsCheckboxLabel" class="flex">
$i18n{settingsCheckboxLabel}
</div>
<cr-toggle checked="{{syncPrefs.preferencesSynced}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes,
syncPrefs.preferencesEnforced)]]"
aria-labelledby="settingsCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.themesRegistered]]">
<div id="themesAndWallpapersCheckboxLabel" class="flex">
$i18n{themesAndWallpapersCheckboxLabel}
</div>
<cr-toggle checked="{{syncPrefs.themesSynced}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.themesEnforced)]]"
aria-labelledby="themesAndWallpapersCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.tabsRegistered]]">
<div id="openTabsCheckboxLabel" class="flex">
$i18n{openTabsCheckboxLabel}
</div>
<cr-toggle checked="{{syncPrefs.tabsSynced}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[shouldSyncCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.tabsEnforced)]]"
aria-labelledby="openTabsCheckboxLabel">
</cr-toggle>
</div>
<div class="layout horizontal list-item"
hidden="[[!syncPrefs.autofillRegistered]]">
<!-- The Payments integration checkbox is a special case in many
ways. It's visible only if autofill is registered. It's
disabled and unchecked if autofill is unchecked.-->
<div class="flex">
$i18n{enablePaymentsIntegrationCheckboxLabel}
<a href="$i18nRaw{autofillHelpURL}" target="_blank">
$i18n{learnMore}
</a>
</div>
<cr-toggle
checked="{{syncPrefs.paymentsIntegrationEnabled}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[shouldPaymentsCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.autofillSynced)]]"
aria-label="$i18n{enablePaymentsIntegrationCheckboxLabel}">
</cr-toggle>
</div>
<!-- User events is disabled and unchecked if data is encrypted or
typed urls are disabled. -->
<template is="dom-if" if="[[unifiedConsentEnabled]]">
<div hidden="[[!syncPrefs.userEventsRegistered]]"
class$="[[getPassphraseHintLines_(syncPrefs.encryptAllData)]]
layout horizontal list-item">
<div class="start" id="userEventsCheckboxLabel">
$i18n{userEventsCheckboxLabel}
<div class="secondary">
$i18n{userEventsCheckboxText}
<div id="reset-sync-message-box-user-events"
hidden="[[!syncPrefs.encryptAllData]]">
<iron-icon icon="settings:info-outline"
class="passphrase-reset-icon">
</iron-icon>
$i18nRaw{passphraseResetHintToggle}
</div>
</div>
</div>
<cr-toggle id="userEventsToggle"
checked="{{userEventsToggleValue}}"
on-change="onUserEventsSyncDataTypeChanged_"
disabled="[[shouldUserEventsCheckboxBeDisabled_(
syncPrefs.syncAllDataTypes, syncPrefs.typedUrlsSynced,
syncPrefs.userEventsEnforced, syncPrefs.encryptAllData)]]"
aria-labelledby="userEventsCheckboxLabel">
</cr-toggle>
</div>
</template>
</div>
<div id="other-sync-items"
class$="[[getListFrameClass_(unifiedConsentEnabled)]]">
<template is="dom-if" if="[[driveSuggestAvailable_]]">
<settings-toggle-button
class$="[[getListItemClass_(unifiedConsentEnabled)]]"
pref="{{prefs.documentsuggest.enabled}}"
label="$i18n{driveSuggestPref}"
sub-label="$i18n{driveSuggestPrefDesc}">
</settings-toggle-button>
</template>
<a class$="inherit-color no-outline
[[getListItemClass_(unifiedConsentEnabled)]]" tabindex="-1"
target="_blank" href="$i18n{activityControlsUrl}"
on-click="onActivityControlsTap_">
<div class="start">
$i18n{personalizeGoogleServicesTitle}
</div>
<paper-icon-button-light actionable class="icon-external">
<button></button>
</paper-icon-button-light>
</a>
<a class$="inherit-color no-outline
[[getListItemClass_(unifiedConsentEnabled)]]" tabindex="-1"
target="_blank" href="$i18n{syncDashboardUrl}">
<div class="start">
$i18n{manageSyncedDataTitle}
</div>
<paper-icon-button-light actionable class="icon-external">
<button></button>
</paper-icon-button-light>
</a>
<div id="encryptionDescription"
hidden="[[syncPrefs.passphraseRequired]]"
class$="single-column
[[getPassphraseHintLines_(syncPrefs.encryptAllData)]]
[[getListItemClass_(unifiedConsentEnabled)]]">
$i18n{encryptionOptionsTitle}
<div class="secondary">
$i18n{syncDataEncryptedText}
<div hidden="[[!syncPrefs.encryptAllData]]">
<iron-icon icon="settings:info-outline"
class="passphrase-reset-icon">
</iron-icon>
$i18nRaw{passphraseResetHintEncryption}
</div>
</div>
</div>
<div id="encryptionRadioGroupContainer" class="list-frame"
hidden="[[syncPrefs.passphraseRequired]]">
<paper-radio-group disabled$="[[syncPrefs.encryptAllData]]"
selected="[[selectedEncryptionRadio_(
syncPrefs.passphraseTypeIsCustom)]]"
selectable="cr-radio-button"
on-paper-radio-group-changed=
"onEncryptionRadioSelectionChanged_">
<cr-radio-button name="encrypt-with-google"
class="list-item" disabled="[[syncPrefs.encryptAllData]]"
aria-label="$i18n{encryptWithGoogleCredentialsLabel}">
$i18n{encryptWithGoogleCredentialsLabel}
</cr-radio-button>
<cr-radio-button name="encrypt-with-passphrase"
class="list-item" disabled="[[syncPrefs.encryptAllData]]">
<span hidden="[[!syncPrefs.fullEncryptionBody]]">
[[syncPrefs.fullEncryptionBody]]
</span>
<span on-click="onLearnMoreTap_"
hidden="[[syncPrefs.fullEncryptionBody]]">
$i18nRaw{encryptWithSyncPassphraseLabel}
</span>
</cr-radio-button>
</paper-radio-group>
</div>
<template is="dom-if" if="[[creatingNewPassphrase_]]">
<div class="list-frame">
<div id="create-password-box"
on-keypress="onSaveNewPassphraseTap_">
<div class="list-item">
<span>$i18nRaw{passphraseExplanationText}</span>
</div>
<cr-input id="passphraseInput" type="password"
value="{{passphrase_}}"
placeholder="$i18n{passphrasePlaceholder}"
error-message="$i18n{emptyPassphraseError}">
</cr-input>
<cr-input id="passphraseConfirmationInput" type="password"
value="{{confirmation_}}"
placeholder="$i18n{passphraseConfirmationPlaceholder}"
error-message="$i18n{mismatchedPassphraseError}">
</cr-input>
<paper-button id="saveNewPassphrase"
on-click="onSaveNewPassphraseTap_" class="action-button"
disabled="[[!isSaveNewPassphraseEnabled_(passphrase_,
confirmation_)]]">
$i18n{save}
</paper-button>
</div>
</div>
</template>
</div>
</div>
</iron-collapse>
<template is="dom-if" if="[[unifiedConsentEnabled]]">
<div class="settings-box two-line" id="personalize-section-toggle"
actionable on-click="toggleExpandButton_">
<div class="start">
<div>$i18n{nonPersonalizedServicesSectionLabel}</div>
<div class="secondary">
$i18n{nonPersonalizedServicesSectionDesc}
</div>
</div>
<cr-expand-button expanded="{{personalizeSectionOpened_}}"
alt="$i18n{nonPersonalizedServicesExpandA11yLabel}">
</cr-expand-button>
</div>
<iron-collapse id="personalize-section"
opened="[[personalizeSectionOpened_]]">
<settings-personalization-options class="list-frame" prefs="{{prefs}}"
page-visibility="[[pageVisibility]]"
unified-consent-enabled="[[unifiedConsentEnabled]]"
unified-consent-given="{{prefs.unified_consent_given.value}}">
</settings-personalization-options>
</iron-collapse>
</template>
<if expr="not chromeos">
<cr-toast id="toast" open="[[syncStatus.setupInProgress]]">
<div>$i18n{syncWillStart}</div>
<paper-button on-click="onCancelSyncClick_">
$i18n{cancelSync}
</paper-button>
</cr-toast>
</if>
</template>
<script src="sync_page.js"></script>
</dom-module>