[SendTabToSelf] add Sync Plumbing for STTS datatype on IOS

Adding objective-c factories and sync clients for SendTabToSelf,
and changing browser_sync code to make use of those new classes.

Bug: 910390
Change-Id: Ieae03174e8c1ff02e2e2de845247f037e805a811
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1488118
Commit-Queue: Jeffrey Cohen <jeffreycohen@chromium.org>
Reviewed-by: Peter Lee <pkl@chromium.org>
Reviewed-by: Mikel Astiz <mastiz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#643392}
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index 72997ff7..dcb41ac 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -257,6 +257,12 @@
       profile_, ServiceAccessType::EXPLICIT_ACCESS);
 }
 
+send_tab_to_self::SendTabToSelfSyncService*
+ChromeSyncClient::GetSendTabToSelfSyncService() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  return SendTabToSelfSyncServiceFactory::GetForProfile(profile_);
+}
+
 sync_sessions::SessionSyncService* ChromeSyncClient::GetSessionSyncService() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return SessionSyncServiceFactory::GetForProfile(profile_);
@@ -458,16 +464,6 @@
   }
 #endif  // defined(OS_CHROMEOS)
 
-  if (!disabled_types.Has(syncer::SEND_TAB_TO_SELF) &&
-      base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
-    controllers.push_back(std::make_unique<syncer::ModelTypeController>(
-        syncer::SEND_TAB_TO_SELF,
-        std::make_unique<syncer::ForwardingModelTypeControllerDelegate>(
-            SendTabToSelfSyncServiceFactory::GetForProfile(profile_)
-                ->GetControllerDelegate()
-                .get())));
-  }
-
   return controllers;
 }
 
diff --git a/chrome/browser/sync/chrome_sync_client.h b/chrome/browser/sync/chrome_sync_client.h
index e4891d6..b1a729a 100644
--- a/chrome/browser/sync/chrome_sync_client.h
+++ b/chrome/browser/sync/chrome_sync_client.h
@@ -45,6 +45,8 @@
   bookmarks::BookmarkModel* GetBookmarkModel() override;
   favicon::FaviconService* GetFaviconService() override;
   history::HistoryService* GetHistoryService() override;
+  send_tab_to_self::SendTabToSelfSyncService* GetSendTabToSelfSyncService()
+      override;
   sync_sessions::SessionSyncService* GetSessionSyncService() override;
   base::Closure GetPasswordStateChangedCallback() override;
   syncer::DataTypeController::TypeVector CreateDataTypeControllers(
diff --git a/components/browser_sync/BUILD.gn b/components/browser_sync/BUILD.gn
index f0f1f6f..026adef8 100644
--- a/components/browser_sync/BUILD.gn
+++ b/components/browser_sync/BUILD.gn
@@ -32,6 +32,7 @@
     "//components/password_manager/core/browser",
     "//components/prefs",
     "//components/reading_list/features:flags",
+    "//components/send_tab_to_self",
     "//components/signin/core/browser",
     "//components/sync_bookmarks",
     "//components/sync_sessions",
diff --git a/components/browser_sync/browser_sync_client.h b/components/browser_sync/browser_sync_client.h
index a628137..fc6f687 100644
--- a/components/browser_sync/browser_sync_client.h
+++ b/components/browser_sync/browser_sync_client.h
@@ -30,6 +30,10 @@
 class HistoryService;
 }  // namespace history
 
+namespace send_tab_to_self {
+class SendTabToSelfSyncService;
+}  // namespace send_tab_to_self
+
 namespace sync_sessions {
 class SessionSyncService;
 }  // namespace sync_sessions
@@ -62,6 +66,8 @@
   virtual favicon::FaviconService* GetFaviconService() = 0;
   virtual history::HistoryService* GetHistoryService() = 0;
   virtual sync_sessions::SessionSyncService* GetSessionSyncService() = 0;
+  virtual send_tab_to_self::SendTabToSelfSyncService*
+  GetSendTabToSelfSyncService() = 0;
   virtual autofill::PersonalDataManager* GetPersonalDataManager() = 0;
   virtual BookmarkUndoService* GetBookmarkUndoService() = 0;
   virtual base::RepeatingClosure GetPasswordStateChangedCallback() = 0;
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc
index 8ea99da..85e9d71 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.cc
+++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -31,6 +31,7 @@
 #include "components/password_manager/core/browser/sync/password_model_type_controller.h"
 #include "components/prefs/pref_service.h"
 #include "components/reading_list/features/reading_list_switches.h"
+#include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
 #include "components/sync/base/report_unrecoverable_error.h"
 #include "components/sync/device_info/device_info_sync_service.h"
 #include "components/sync/driver/async_directory_type_controller.h"
@@ -404,6 +405,16 @@
         syncer::USER_EVENTS));
   }
 
+  if (!disabled_types.Has(syncer::SEND_TAB_TO_SELF) &&
+      base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
+    controllers.push_back(std::make_unique<syncer::ModelTypeController>(
+        syncer::SEND_TAB_TO_SELF,
+        std::make_unique<syncer::ForwardingModelTypeControllerDelegate>(
+            sync_client_->GetSendTabToSelfSyncService()
+                ->GetControllerDelegate()
+                .get())));
+  }
+
   // TODO(crbug.com/919489): Enable security events once their controller
   // delegate is wired properly.
 
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn
index ed6df48..13664c2 100644
--- a/ios/chrome/browser/BUILD.gn
+++ b/ios/chrome/browser/BUILD.gn
@@ -105,6 +105,7 @@
     "//components/search_engines",
     "//components/search_provider_logos",
     "//components/security_state/core",
+    "//components/send_tab_to_self",
     "//components/signin/core/browser",
     "//components/strings",
     "//components/sync",
diff --git a/ios/chrome/browser/DEPS b/ios/chrome/browser/DEPS
index 7bb2e46..e90b9876 100644
--- a/ios/chrome/browser/DEPS
+++ b/ios/chrome/browser/DEPS
@@ -68,6 +68,7 @@
   "+components/search_provider_logos",
   "+components/security_interstitials",
   "+components/security_state",
+  "+components/send_tab_to_self",
   "+components/services/unzip",
   "+components/sessions",
   "+components/signin/core/browser",
diff --git a/ios/chrome/browser/sync/BUILD.gn b/ios/chrome/browser/sync/BUILD.gn
index a37bd58d..9a9af94 100644
--- a/ios/chrome/browser/sync/BUILD.gn
+++ b/ios/chrome/browser/sync/BUILD.gn
@@ -23,6 +23,8 @@
     "model_type_store_service_factory.h",
     "profile_sync_service_factory.cc",
     "profile_sync_service_factory.h",
+    "send_tab_to_self_sync_service_factory.h",
+    "send_tab_to_self_sync_service_factory.mm",
     "session_sync_service_factory.h",
     "session_sync_service_factory.mm",
     "sync_observer_bridge.h",
@@ -48,6 +50,7 @@
     "//components/prefs",
     "//components/reading_list/core",
     "//components/search_engines",
+    "//components/send_tab_to_self",
     "//components/sessions",
     "//components/signin/core/browser",
     "//components/sync",
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.h b/ios/chrome/browser/sync/ios_chrome_sync_client.h
index 9056c41..c70e319 100644
--- a/ios/chrome/browser/sync/ios_chrome_sync_client.h
+++ b/ios/chrome/browser/sync/ios_chrome_sync_client.h
@@ -39,6 +39,8 @@
   base::FilePath GetLocalSyncBackendFolder() override;
   syncer::ModelTypeStoreService* GetModelTypeStoreService() override;
   syncer::DeviceInfoSyncService* GetDeviceInfoSyncService() override;
+  send_tab_to_self::SendTabToSelfSyncService* GetSendTabToSelfSyncService()
+      override;
   bookmarks::BookmarkModel* GetBookmarkModel() override;
   favicon::FaviconService* GetFaviconService() override;
   history::HistoryService* GetHistoryService() override;
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
index 66d0efd..9fb1104 100644
--- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm
+++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -62,6 +62,7 @@
 #include "ios/chrome/browser/sync/device_info_sync_service_factory.h"
 #include "ios/chrome/browser/sync/ios_user_event_service_factory.h"
 #include "ios/chrome/browser/sync/model_type_store_service_factory.h"
+#include "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h"
 #include "ios/chrome/browser/sync/session_sync_service_factory.h"
 #include "ios/chrome/browser/undo/bookmark_undo_service_factory.h"
 #include "ios/chrome/browser/web_data_service_factory.h"
@@ -137,6 +138,12 @@
   return DeviceInfoSyncServiceFactory::GetForBrowserState(browser_state_);
 }
 
+send_tab_to_self::SendTabToSelfSyncService*
+IOSChromeSyncClient::GetSendTabToSelfSyncService() {
+  DCHECK_CURRENTLY_ON(web::WebThread::UI);
+  return SendTabToSelfSyncServiceFactory::GetForBrowserState(browser_state_);
+}
+
 bookmarks::BookmarkModel* IOSChromeSyncClient::GetBookmarkModel() {
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
   return ios::BookmarkModelFactory::GetForBrowserState(browser_state_);
diff --git a/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h b/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h
new file mode 100644
index 0000000..931140a
--- /dev/null
+++ b/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h
@@ -0,0 +1,44 @@
+// Copyright 2019 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.
+
+#ifndef IOS_CHROME_BROWSER_SYNC_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_
+#define IOS_CHROME_BROWSER_SYNC_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/no_destructor.h"
+#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
+
+namespace send_tab_to_self {
+class SendTabToSelfSyncService;
+}  // namespace send_tab_to_self
+
+namespace ios {
+class ChromeBrowserState;
+}  // namespace ios
+
+// Singleton that owns all SendTabToSelfSyncService and associates them with
+// ios::ChromeBrowserState.
+class SendTabToSelfSyncServiceFactory : public BrowserStateKeyedServiceFactory {
+ public:
+  static send_tab_to_self::SendTabToSelfSyncService* GetForBrowserState(
+      ios::ChromeBrowserState* browser_state);
+
+  static SendTabToSelfSyncServiceFactory* GetInstance();
+
+ private:
+  friend class base::NoDestructor<SendTabToSelfSyncServiceFactory>;
+
+  SendTabToSelfSyncServiceFactory();
+  ~SendTabToSelfSyncServiceFactory() override;
+
+  // BrowserStateKeyedServiceFactory implementation.
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      web::BrowserState* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(SendTabToSelfSyncServiceFactory);
+};
+
+#endif  // IOS_CHROME_BROWSER_SYNC_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.mm b/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.mm
new file mode 100644
index 0000000..0513c44
--- /dev/null
+++ b/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.mm
@@ -0,0 +1,70 @@
+// Copyright 2019 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 "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h"
+
+#include "components/keyed_service/core/service_access_type.h"
+#include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
+#include "components/sync/device_info/device_info_sync_service.h"
+#include "components/sync/device_info/local_device_info_provider.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/history/history_service_factory.h"
+#include "ios/chrome/browser/sync/device_info_sync_service_factory.h"
+#include "ios/chrome/browser/sync/model_type_store_service_factory.h"
+#include "ios/chrome/common/channel_info.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using send_tab_to_self::SendTabToSelfSyncService;
+
+// static
+SendTabToSelfSyncServiceFactory*
+SendTabToSelfSyncServiceFactory::GetInstance() {
+  static base::NoDestructor<SendTabToSelfSyncServiceFactory> instance;
+  return instance.get();
+}
+
+// static
+SendTabToSelfSyncService* SendTabToSelfSyncServiceFactory::GetForBrowserState(
+    ios::ChromeBrowserState* browser_state) {
+  return static_cast<SendTabToSelfSyncService*>(
+      GetInstance()->GetServiceForBrowserState(browser_state, true));
+}
+
+SendTabToSelfSyncServiceFactory::SendTabToSelfSyncServiceFactory()
+    : BrowserStateKeyedServiceFactory(
+          "SendTabToSelfSyncService",
+          BrowserStateDependencyManager::GetInstance()) {
+  DependsOn(DeviceInfoSyncServiceFactory::GetInstance());
+  DependsOn(ModelTypeStoreServiceFactory::GetInstance());
+  DependsOn(ios::HistoryServiceFactory::GetInstance());
+}
+
+SendTabToSelfSyncServiceFactory::~SendTabToSelfSyncServiceFactory() {}
+
+std::unique_ptr<KeyedService>
+SendTabToSelfSyncServiceFactory::BuildServiceInstanceFor(
+    web::BrowserState* context) const {
+  ios::ChromeBrowserState* browser_state =
+      ios::ChromeBrowserState::FromBrowserState(context);
+
+  syncer::LocalDeviceInfoProvider* local_device_info_provider =
+      DeviceInfoSyncServiceFactory::GetForBrowserState(browser_state)
+          ->GetLocalDeviceInfoProvider();
+
+  syncer::OnceModelTypeStoreFactory store_factory =
+      ModelTypeStoreServiceFactory::GetForBrowserState(browser_state)
+          ->GetStoreFactory();
+
+  history::HistoryService* history_service =
+      ios::HistoryServiceFactory::GetForBrowserState(
+          browser_state, ServiceAccessType::EXPLICIT_ACCESS);
+
+  return std::make_unique<SendTabToSelfSyncService>(
+      GetChannel(), local_device_info_provider, std::move(store_factory),
+      history_service);
+}
diff --git a/ios/web_view/internal/sync/web_view_sync_client.h b/ios/web_view/internal/sync/web_view_sync_client.h
index f106829..7db2ba2 100644
--- a/ios/web_view/internal/sync/web_view_sync_client.h
+++ b/ios/web_view/internal/sync/web_view_sync_client.h
@@ -45,6 +45,8 @@
   bookmarks::BookmarkModel* GetBookmarkModel() override;
   favicon::FaviconService* GetFaviconService() override;
   history::HistoryService* GetHistoryService() override;
+  send_tab_to_self::SendTabToSelfSyncService* GetSendTabToSelfSyncService()
+      override;
   sync_sessions::SessionSyncService* GetSessionSyncService() override;
   base::RepeatingClosure GetPasswordStateChangedCallback() override;
   syncer::DataTypeController::TypeVector CreateDataTypeControllers(
diff --git a/ios/web_view/internal/sync/web_view_sync_client.mm b/ios/web_view/internal/sync/web_view_sync_client.mm
index 33003c7..19ccab4 100644
--- a/ios/web_view/internal/sync/web_view_sync_client.mm
+++ b/ios/web_view/internal/sync/web_view_sync_client.mm
@@ -125,6 +125,11 @@
   return nullptr;
 }
 
+send_tab_to_self::SendTabToSelfSyncService*
+WebViewSyncClient::GetSendTabToSelfSyncService() {
+  return nullptr;
+}
+
 autofill::PersonalDataManager* WebViewSyncClient::GetPersonalDataManager() {
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
   return WebViewPersonalDataManagerFactory::GetForBrowserState(browser_state_);