Move sessions datatype away from ProfileSyncService

The patch introduces a dedicated KeyedService that owns all relevant
objects for syncing SESSIONS, FAVICON_IMAGES and FAVICON_TRACKING. This
prevents some cyclic dependencies and makes sessions more similar to
regular datatypes, owned by some service outside ProfileSyncService.

The change allows simplifications in ProfileSyncService at the expense
of the usual boilerplate with KeyedService factories.

Bug: 883199
Cq-Include-Trybots: luci.chromium.try:ios-simulator-cronet;luci.chromium.try:ios-simulator-full-configs
Change-Id: I662dc5a55dc3e7aaae2f0acace3b7895fa7affc8
Reviewed-on: https://chromium-review.googlesource.com/1221126
Reviewed-by: Colin Blundell <[email protected]>
Reviewed-by: Nico Weber <[email protected]>
Reviewed-by: Eugene But <[email protected]>
Reviewed-by: Marc Treib <[email protected]>
Reviewed-by: Elly Fong-Jones <[email protected]>
Commit-Queue: Mikel Astiz <[email protected]>
Cr-Commit-Position: refs/heads/master@{#593959}
diff --git a/components/sync_sessions/session_sync_service.cc b/components/sync_sessions/session_sync_service.cc
new file mode 100644
index 0000000..ae81516
--- /dev/null
+++ b/components/sync_sessions/session_sync_service.cc
@@ -0,0 +1,73 @@
+// Copyright 2018 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.
+
+#include "components/sync_sessions/session_sync_service.h"
+
+#include <utility>
+
+#include "base/bind_helpers.h"
+#include "components/sync/base/report_unrecoverable_error.h"
+#include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/model_impl/client_tag_based_model_type_processor.h"
+#include "components/sync_sessions/favicon_cache.h"
+#include "components/sync_sessions/session_data_type_controller.h"
+#include "components/sync_sessions/session_sync_bridge.h"
+#include "components/sync_sessions/session_sync_prefs.h"
+#include "components/sync_sessions/sessions_sync_manager.h"
+#include "components/sync_sessions/sync_sessions_client.h"
+
+namespace sync_sessions {
+
+SessionSyncService::SessionSyncService(
+    version_info::Channel channel,
+    std::unique_ptr<SyncSessionsClient> sessions_client)
+    : sessions_client_(std::move(sessions_client)) {
+  DCHECK(sessions_client_);
+  if (base::FeatureList::IsEnabled(switches::kSyncUSSSessions)) {
+    sessions_sync_manager_ = std::make_unique<sync_sessions::SessionSyncBridge>(
+        sessions_client_.get(),
+        std::make_unique<syncer::ClientTagBasedModelTypeProcessor>(
+            syncer::SESSIONS,
+            base::BindRepeating(&syncer::ReportUnrecoverableError, channel)));
+  } else {
+    sessions_sync_manager_ =
+        std::make_unique<sync_sessions::SessionsSyncManager>(
+            sessions_client_.get());
+  }
+}
+
+SessionSyncService::~SessionSyncService() {}
+
+syncer::GlobalIdMapper* SessionSyncService::GetGlobalIdMapper() const {
+  return sessions_sync_manager_->GetGlobalIdMapper();
+}
+
+OpenTabsUIDelegate* SessionSyncService::GetRawOpenTabsUIDelegate() {
+  return sessions_sync_manager_->GetOpenTabsUIDelegate();
+}
+
+void SessionSyncService::ScheduleGarbageCollection() {
+  sessions_sync_manager_->ScheduleGarbageCollection();
+}
+
+syncer::SyncableService* SessionSyncService::GetSyncableService() {
+  return sessions_sync_manager_->GetSyncableService();
+}
+
+base::WeakPtr<syncer::ModelTypeControllerDelegate>
+SessionSyncService::GetControllerDelegate() {
+  return sessions_sync_manager_->GetModelTypeSyncBridge()
+      ->change_processor()
+      ->GetControllerDelegate();
+}
+
+FaviconCache* SessionSyncService::GetFaviconCache() {
+  return sessions_sync_manager_->GetFaviconCache();
+}
+
+void SessionSyncService::SetSyncSessionsGUID(const std::string& guid) {
+  sessions_client_->GetSessionSyncPrefs()->SetSyncSessionsGUID(guid);
+}
+
+}  // namespace sync_sessions