Commit 301856ca authored by Caroline Rising's avatar Caroline Rising Committed by Commit Bot

Set up cross device sync for Read Later.

This change is behind the kReadLater flag and allows read later items to
sync cross device. This also adds a 'Reading List' option to
chrome://settings/syncSetup/advanced on Desktop when the flag is
enabled.

Bug: 1109316
Change-Id: I676a3ffaf565095eb02b95ea1d86577c60dc652f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2504271
Commit-Queue: Caroline Rising <corising@chromium.org>
Reviewed-by: default avatarEsmael Elmoslimany <aee@chromium.org>
Reviewed-by: default avatarOlivier Robin <olivierrobin@chromium.org>
Reviewed-by: default avatarMarc Treib <treib@chromium.org>
Cr-Commit-Position: refs/heads/master@{#822228}
parent 8bc33c16
...@@ -276,6 +276,9 @@ ...@@ -276,6 +276,9 @@
<message name="IDS_SETTINGS_BOOKMARKS_CHECKBOX_LABEL" desc="Label for the checkbox which enables or disables syncing bookmarks between multiple browser instances."> <message name="IDS_SETTINGS_BOOKMARKS_CHECKBOX_LABEL" desc="Label for the checkbox which enables or disables syncing bookmarks between multiple browser instances.">
Bookmarks Bookmarks
</message> </message>
<message name="IDS_SETTINGS_READING_LIST_CHECKBOX_LABEL" desc="Label for the checkbox which enables or disables syncing reading list between multiple browser instances.">
Reading List
</message>
<message name="IDS_SETTINGS_ENCRYPTION_OPTIONS" desc="Title for the section which includes options for encrypting sync settings."> <message name="IDS_SETTINGS_ENCRYPTION_OPTIONS" desc="Title for the section which includes options for encrypting sync settings.">
Encryption options Encryption options
</message> </message>
......
d82a9aba092da44ee87f4da5c3e60788ca8ce0d1
\ No newline at end of file
...@@ -57,7 +57,8 @@ cr.define('settings', function() { ...@@ -57,7 +57,8 @@ cr.define('settings', function() {
/** /**
* The state of sync. This is the data structure sent back and forth between * 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 * C++ and JS. Its naming and structure is not optimal, but changing it would
* require changes to the C++ handler, which is already functional. * require changes to the C++ handler, which is already functional. See
* PeopleHandler::PushSyncPrefs() for more details.
* @typedef {{ * @typedef {{
* appsRegistered: boolean, * appsRegistered: boolean,
* appsSynced: boolean, * appsSynced: boolean,
...@@ -78,6 +79,8 @@ cr.define('settings', function() { ...@@ -78,6 +79,8 @@ cr.define('settings', function() {
* paymentsIntegrationEnabled: boolean, * paymentsIntegrationEnabled: boolean,
* preferencesRegistered: boolean, * preferencesRegistered: boolean,
* preferencesSynced: boolean, * preferencesSynced: boolean,
* readingListRegistered: boolean,
* readingListSynced: boolean,
* setNewPassphrase: (boolean|undefined), * setNewPassphrase: (boolean|undefined),
* syncAllDataTypes: boolean, * syncAllDataTypes: boolean,
* tabsRegistered: boolean, * tabsRegistered: boolean,
......
...@@ -117,6 +117,17 @@ ...@@ -117,6 +117,17 @@
</cr-toggle> </cr-toggle>
</div> </div>
<div class="list-item" hidden="[[!syncPrefs.readingListRegistered]]">
<div id="readingListCheckboxLabel">
$i18n{readingListCheckboxLabel}
</div>
<cr-toggle checked="{{syncPrefs.readingListSynced}}"
on-change="onSingleSyncDataTypeChanged_"
disabled="[[syncPrefs.syncAllDataTypes]]"
aria-labelledby="readingListCheckboxLabel">
</cr-toggle>
</div>
<div class="list-item" hidden="[[!syncPrefs.tabsRegistered]]"> <div class="list-item" hidden="[[!syncPrefs.tabsRegistered]]">
<div id="openTabsCheckboxLabel"> <div id="openTabsCheckboxLabel">
$i18n{openTabsCheckboxLabel} $i18n{openTabsCheckboxLabel}
......
...@@ -17,6 +17,7 @@ const SyncPrefsIndividualDataTypes = [ ...@@ -17,6 +17,7 @@ const SyncPrefsIndividualDataTypes = [
'typedUrlsSynced', 'typedUrlsSynced',
'themesSynced', 'themesSynced',
'bookmarksSynced', 'bookmarksSynced',
'readingListSynced',
'passwordsSynced', 'passwordsSynced',
'tabsSynced', 'tabsSynced',
'paymentsIntegrationEnabled', 'paymentsIntegrationEnabled',
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/themes/theme_syncable_service.h" #include "chrome/browser/themes/theme_syncable_service.h"
#include "chrome/browser/ui/read_later/reading_list_model_factory.h"
#include "chrome/browser/undo/bookmark_undo_service_factory.h" #include "chrome/browser/undo/bookmark_undo_service_factory.h"
#include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/browser/web_applications/web_app_sync_bridge.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h"
...@@ -67,6 +68,8 @@ ...@@ -67,6 +68,8 @@
#include "components/metrics/demographics/user_demographics.h" #include "components/metrics/demographics/user_demographics.h"
#include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/core/browser/password_store.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "components/reading_list/core/reading_list_model.h"
#include "components/reading_list/features/reading_list_switches.h"
#include "components/search_engines/template_url_service.h" #include "components/search_engines/template_url_service.h"
#include "components/send_tab_to_self/send_tab_to_self_sync_service.h" #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
#include "components/spellcheck/spellcheck_buildflags.h" #include "components/spellcheck/spellcheck_buildflags.h"
...@@ -629,10 +632,13 @@ ChromeSyncClient::GetSyncableServiceForType(syncer::ModelType type) { ...@@ -629,10 +632,13 @@ ChromeSyncClient::GetSyncableServiceForType(syncer::ModelType type) {
base::WeakPtr<syncer::ModelTypeControllerDelegate> base::WeakPtr<syncer::ModelTypeControllerDelegate>
ChromeSyncClient::GetControllerDelegateForModelType(syncer::ModelType type) { ChromeSyncClient::GetControllerDelegateForModelType(syncer::ModelType type) {
switch (type) { switch (type) {
case syncer::READING_LIST: case syncer::READING_LIST: {
// Reading List is only supported on iOS at the moment. DCHECK(reading_list::switches::IsReadingListEnabled());
NOTREACHED(); return ReadingListModelFactory::GetForBrowserContext(profile_)
return base::WeakPtr<syncer::ModelTypeControllerDelegate>(); ->GetModelTypeSyncBridge()
->change_processor()
->GetControllerDelegate();
}
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
case syncer::PRINTERS: case syncer::PRINTERS:
return chromeos::SyncedPrintersManagerFactory::GetForBrowserContext( return chromeos::SyncedPrintersManagerFactory::GetForBrowserContext(
......
...@@ -109,6 +109,8 @@ std::string GetConfiguration(const base::DictionaryValue* extra_values, ...@@ -109,6 +109,8 @@ std::string GetConfiguration(const base::DictionaryValue* extra_values,
types.Has(syncer::UserSelectableType::kPasswords)); types.Has(syncer::UserSelectableType::kPasswords));
result.SetBoolean("preferencesSynced", result.SetBoolean("preferencesSynced",
types.Has(syncer::UserSelectableType::kPreferences)); types.Has(syncer::UserSelectableType::kPreferences));
result.SetBoolean("readingListSynced",
types.Has(syncer::UserSelectableType::kReadingList));
result.SetBoolean("tabsSynced", types.Has(syncer::UserSelectableType::kTabs)); result.SetBoolean("tabsSynced", types.Has(syncer::UserSelectableType::kTabs));
result.SetBoolean("themesSynced", result.SetBoolean("themesSynced",
types.Has(syncer::UserSelectableType::kThemes)); types.Has(syncer::UserSelectableType::kThemes));
...@@ -171,6 +173,8 @@ void CheckConfigDataTypeArguments(const base::DictionaryValue* dictionary, ...@@ -171,6 +173,8 @@ void CheckConfigDataTypeArguments(const base::DictionaryValue* dictionary,
types.Has(syncer::UserSelectableType::kPasswords)); types.Has(syncer::UserSelectableType::kPasswords));
CheckBool(dictionary, "preferencesSynced", CheckBool(dictionary, "preferencesSynced",
types.Has(syncer::UserSelectableType::kPreferences)); types.Has(syncer::UserSelectableType::kPreferences));
CheckBool(dictionary, "readingListSynced",
types.Has(syncer::UserSelectableType::kReadingList));
CheckBool(dictionary, "tabsSynced", CheckBool(dictionary, "tabsSynced",
types.Has(syncer::UserSelectableType::kTabs)); types.Has(syncer::UserSelectableType::kTabs));
CheckBool(dictionary, "themesSynced", CheckBool(dictionary, "themesSynced",
...@@ -912,6 +916,7 @@ TEST_F(PeopleHandlerTest, ShowSetupSyncEverything) { ...@@ -912,6 +916,7 @@ TEST_F(PeopleHandlerTest, ShowSetupSyncEverything) {
CheckBool(dictionary, "extensionsRegistered", true); CheckBool(dictionary, "extensionsRegistered", true);
CheckBool(dictionary, "passwordsRegistered", true); CheckBool(dictionary, "passwordsRegistered", true);
CheckBool(dictionary, "preferencesRegistered", true); CheckBool(dictionary, "preferencesRegistered", true);
CheckBool(dictionary, "readingListRegistered", true);
CheckBool(dictionary, "tabsRegistered", true); CheckBool(dictionary, "tabsRegistered", true);
CheckBool(dictionary, "themesRegistered", true); CheckBool(dictionary, "themesRegistered", true);
CheckBool(dictionary, "typedUrlsRegistered", true); CheckBool(dictionary, "typedUrlsRegistered", true);
......
...@@ -188,6 +188,7 @@ void AddSyncPageStrings(content::WebUIDataSource* html_source) { ...@@ -188,6 +188,7 @@ void AddSyncPageStrings(content::WebUIDataSource* html_source) {
{"syncPageTitle", IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES}, {"syncPageTitle", IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES},
{"passphraseConfirmationPlaceholder", {"passphraseConfirmationPlaceholder",
IDS_SETTINGS_PASSPHRASE_CONFIRMATION_PLACEHOLDER}, IDS_SETTINGS_PASSPHRASE_CONFIRMATION_PLACEHOLDER},
{"readingListCheckboxLabel", IDS_SETTINGS_READING_LIST_CHECKBOX_LABEL},
{"syncLoading", IDS_SETTINGS_SYNC_LOADING}, {"syncLoading", IDS_SETTINGS_SYNC_LOADING},
{"themesAndWallpapersCheckboxLabel", {"themesAndWallpapersCheckboxLabel",
IDS_SETTINGS_THEMES_AND_WALLPAPERS_CHECKBOX_LABEL}, IDS_SETTINGS_THEMES_AND_WALLPAPERS_CHECKBOX_LABEL},
......
...@@ -34,6 +34,8 @@ cr.define('sync_test_util', function() { ...@@ -34,6 +34,8 @@ cr.define('sync_test_util', function() {
paymentsIntegrationEnabled: true, paymentsIntegrationEnabled: true,
preferencesRegistered: true, preferencesRegistered: true,
preferencesSynced: true, preferencesSynced: true,
readingListRegistered: true,
readingListSynced: true,
setNewPassphrase: false, setNewPassphrase: false,
syncAllDataTypes: true, syncAllDataTypes: true,
tabsRegistered: true, tabsRegistered: true,
......
...@@ -15,7 +15,11 @@ namespace switches { ...@@ -15,7 +15,11 @@ namespace switches {
const base::Feature kReadLater{"ReadLater", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kReadLater{"ReadLater", base::FEATURE_DISABLED_BY_DEFAULT};
bool IsReadingListEnabled() { bool IsReadingListEnabled() {
#if defined(OS_IOS)
return BUILDFLAG(ENABLE_READING_LIST); return BUILDFLAG(ENABLE_READING_LIST);
#else
return base::FeatureList::IsEnabled(kReadLater);
#endif
} }
} // namespace switches } // namespace switches
} // namespace reading_list } // namespace reading_list
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment