# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//chrome/common/features.gni")
import("//components/spellcheck/spellcheck_build_features.gni")
import("//components/supervised_user/buildflags.gni")
import("//extensions/buildflags/buildflags.gni")

assert(is_win || is_mac || is_linux || is_chromeos || is_android)

source_set("sync") {
  sources = [
    "account_bookmark_sync_service_factory.cc",
    "account_bookmark_sync_service_factory.h",
    "chrome_sync_client.cc",
    "chrome_sync_client.h",
    "chrome_sync_controller_builder.cc",
    "chrome_sync_controller_builder.h",
    "cross_device_theme_tracker_factory.cc",
    "cross_device_theme_tracker_factory.h",
    "device_info_sync_client_impl.cc",
    "device_info_sync_client_impl.h",
    "device_info_sync_service_factory.cc",
    "glue/extensions_activity_monitor.cc",
    "glue/extensions_activity_monitor.h",
    "glue/sync_start_util.cc",
    "glue/sync_start_util.h",
    "local_or_syncable_bookmark_sync_service_factory.cc",
    "local_or_syncable_bookmark_sync_service_factory.h",
    "prefs/chrome_syncable_prefs_database.cc",
    "prefs/chrome_syncable_prefs_database.h",
    "prefs/cross_device_pref_tracker/chrome_cross_device_pref_provider.cc",
    "prefs/cross_device_pref_tracker/chrome_cross_device_pref_provider.h",
    "prefs/cross_device_pref_tracker/cross_device_pref_tracker_factory.cc",
    "prefs/cross_device_pref_tracker/cross_device_pref_tracker_factory.h",
    "send_tab_to_self_sync_service_factory.cc",
    "send_tab_to_self_sync_service_factory.h",
    "session_sync_service_factory.cc",
    "session_sync_service_factory.h",
    "sessions/sync_sessions_router_tab_helper.cc",
    "sessions/sync_sessions_router_tab_helper.h",
    "sessions/sync_sessions_web_contents_router.cc",
    "sessions/sync_sessions_web_contents_router.h",
    "sessions/sync_sessions_web_contents_router_factory.cc",
    "sessions/sync_sessions_web_contents_router_factory.h",
    "sync_invalidations_service_factory.cc",
    "sync_invalidations_service_factory.h",
    "sync_service_factory.cc",
    "sync_service_factory.h",
    "sync_startup_tracker.cc",
    "sync_startup_tracker.h",
    "sync_ui_util.cc",
    "sync_ui_util.h",
    "tab_context_sync_service_factory.cc",
    "tab_context_sync_service_factory.h",
    "user_event_service_factory.cc",
    "user_event_service_factory.h",
  ]
  public_deps = [
    ":factories",
    "//base",
    "//chrome/browser:browser_public_dependencies",
    "//chrome/browser/profiles:profile",
    "//chrome/browser/sharing",
    "//chrome/browser/tab_group_sync:factories",
    "//chrome/browser/translate",
    "//components/browser_sync",
    "//components/collaboration/public",
    "//components/favicon/core",
    "//components/keyed_service/core",
    "//components/prefs",
    "//components/sessions:session_id",
    "//components/sync/model",
    "//components/sync/service",
    "//components/sync_device_info",
    "//components/sync_preferences",
    "//components/sync_preferences:common_syncable_prefs_database",
    "//components/sync_sessions",
    "//components/sync_tab_context",
    "//components/translate/core/browser",
    "//content/public/browser",

    # TODO: Use //chrome/browser/ui instead after fixing cyclic dependency.
    "//components/paint_preview/buildflags",
  ]
  deps = [
    ":data_type_store_service_factory",
    "//chrome/app:branded_strings",
    "//chrome/app:branded_strings_grit",
    "//chrome/app:generated_resources",
    "//chrome/app:generated_resources_grit",
    "//chrome/browser:browser_process",
    "//chrome/browser/bookmarks",
    "//chrome/browser/collaboration",
    "//chrome/browser/consent_auditor",
    "//chrome/browser/data_sharing",
    "//chrome/browser/trusted_vault",

    # TODO(crbug.com/483063966) Investigate why putting contextual_tasks
    # dependency behind !is_android leads to failures on android-binary-size.
    "//chrome/browser/autocomplete:aim_eligibility_service",
    "//chrome/browser/contextual_tasks",
    "//chrome/browser/gcm",
    "//chrome/browser/glic",
    "//chrome/browser/history",
    "//chrome/browser/metrics",
    "//chrome/browser/notebooks",
    "//chrome/browser/password_manager/factories",
    "//chrome/browser/signin",
    "//chrome/browser/skills",
    "//chrome/browser/subscription_eligibility",
    "//chrome/browser/supervised_user",
    "//chrome/browser/ui/navigator",
    "//chrome/browser/ui/sync",
    "//chrome/browser/ui/toolbar",
    "//chrome/browser/webauthn",
    "//chrome/browser/webdata_services",
    "//components/tabs:public",

    # TODO(crbug.com/374910357): Investigate for a better dependency injection.
    "//chrome/browser/account_settings",
    "//chrome/browser/autofill",
    "//chrome/browser/desktop_to_mobile_promos:utils",
    "//chrome/browser/favicon",
    "//chrome/browser/prefs:util",
    "//chrome/browser/profiles",
    "//chrome/browser/profiles:profile_manager",
    "//chrome/browser/reading_list",
    "//chrome/browser/search_engines",
    "//chrome/browser/tab_group_sync",
    "//chrome/browser/tab_group_sync:utils",
    "//chrome/browser/ui:ui_features",
    "//chrome/browser/undo",
    "//chrome/common",
    "//chrome/common:buildflags",
    "//chrome/common:channel_info",
    "//chrome/common:constants",
    "//components/autofill/core/browser",
    "//components/consent_auditor",
    "//components/data_sharing/public",
    "//components/desktop_to_mobile_promos",
    "//components/dom_distiller/core",
    "//components/favicon/content",
    "//components/history/core/browser",
    "//components/language/core/browser",
    "//components/language/core/common",
    "//components/live_caption:constants",
    "//components/metrics/demographics",
    "//components/network_time",
    "//components/password_manager/core/browser/features:password_features",
    "//components/password_manager/core/browser/features:utils",
    "//components/password_manager/core/browser/password_store:password_store_interface",
    "//components/password_manager/core/browser/sharing",
    "//components/performance_manager",
    "//components/personal_context/core",
    "//components/personal_context/core:features",
    "//components/privacy_sandbox:privacy_sandbox_prefs",
    "//components/saved_tab_groups/public",
    "//components/send_tab_to_self",
    "//components/sharing_message",
    "//components/skills/public",
    "//components/spellcheck:buildflags",
    "//components/spellcheck/browser",
    "//components/strings:components_strings_grit",
    "//components/sync_bookmarks",
    "//components/sync_preferences:features",
    "//components/sync_preferences/cross_device_pref_tracker",
    "//components/sync_user_events",
    "//components/themes/cross_device",
    "//components/user_manager",
    "//components/variations/service",
    "//components/webauthn/core/browser:passkey_model",

    # TODO(crbug.com/352700220): Extract target for
    # //chrome/browser/android/webapk from //chrome/browser and use that instead
    # here.
    "//chrome/browser/android/webapk/proto",
    "//components/webapps/browser",
  ]

  allow_circular_includes_from = []

  if (enable_spellcheck) {
    deps += [ "//chrome/browser/spellchecker" ]
  }

  if (enable_extensions) {
    deps += [ "//chrome/browser/web_applications" ]
  }

  if (enable_supervised_users) {
    deps += [
      "//components/supervised_user/core/browser",
      "//components/supervised_user/core/common",
    ]
  }

  if (is_android) {
    sources += [
      "cross_device_theme_tracker_android.cc",
      "cross_device_theme_tracker_android.h",
      "glue/synced_tab_delegate_android.cc",
      "glue/synced_tab_delegate_android.h",
      "glue/synced_window_delegate_android.cc",
      "glue/synced_window_delegate_android.h",
      "glue/synced_window_delegates_getter_android.cc",
      "glue/synced_window_delegates_getter_android.h",
      "glue/web_contents_state_synced_tab_delegate.cc",
      "glue/web_contents_state_synced_tab_delegate.h",
    ]
    deps += [
      "//chrome/android:chrome_jni_headers",
      "//chrome/browser/android:tabs_public",
      "//chrome/browser/ntp_customization",
      "//chrome/browser/ntp_customization:jni_headers",
      "//chrome/browser/sync/android:jni_headers",
      "//chrome/browser/tab",
      "//chrome/browser/ui/android/tab_model",
      "//ui/color:color_provider_key",
      "//ui/color/dynamic_color",
    ]
  } else {
    sources += [
      "sessions/browser_list_router_helper.cc",
      "sessions/browser_list_router_helper.h",
    ]
    public_deps += [
      "//chrome/browser/ui/browser_window",
      "//chrome/browser/ui/tabs:tab_strip_model_observer",
    ]
    deps += [
      "//chrome/browser/accessibility/tree_fixing:prefs",
      "//chrome/browser/themes",
      "//chrome/browser/ui/read_anything:prefs",
      "//chrome/browser/ui/tabs:tab_strip",
      "//chrome/browser/ui/tabs/saved_tab_groups",
    ]
  }
  if (enable_extensions_core) {
    sources += [
      "glue/extension_data_type_controller.cc",
      "glue/extension_data_type_controller.h",
      "glue/extension_setting_data_type_controller.cc",
      "glue/extension_setting_data_type_controller.h",
    ]
    public_deps += [ "//extensions/buildflags" ]
    deps += [
      "//extensions/browser",
      "//extensions/browser/api/storage",
      "//extensions/common",
    ]
  }
  if (enable_extensions) {
    deps += [
      "//chrome/browser/themes",
      "//chrome/browser/web_applications",
    ]
  }
  if (is_chromeos) {
    sources += [
      "desk_sync_service_factory.cc",
      "desk_sync_service_factory.h",
      "wifi_configuration_sync_service_factory.cc",
      "wifi_configuration_sync_service_factory.h",
    ]
    deps += [
      "//ash/constants",
      "//ash/public/cpp",
      "//chrome/browser/ash/app_list",
      "//chrome/browser/ash/app_list/arc",
      "//chrome/browser/ash/arc",
      "//chrome/browser/ash/arc:arc_util",
      "//chrome/browser/ash/arc/tracing",
      "//chrome/browser/ash/floating_sso",
      "//chrome/browser/ash/floating_workspace:utils",
      "//chrome/browser/ash/guest_os",
      "//chrome/browser/ash/login/session",
      "//chrome/browser/ash/printing",
      "//chrome/browser/ash/printing/oauth2",
      "//chrome/browser/ash/profiles",
      "//chrome/browser/ui/ash/multi_user",
      "//chromeos/ash/components/network",
      "//chromeos/ash/components/sync_wifi",
      "//chromeos/ash/components/tether",
      "//chromeos/ash/experiences/arc:arc_base_utils",
      "//components/desks_storage",
      "//ui/events/ash",
    ]
    allow_circular_includes_from += [
      "//chrome/browser/ash/app_list",
      "//chrome/browser/ash/app_list/arc",
      "//chrome/browser/ash/login/session",
    ]
  }
}

# Code that depends on this target must be linked into //chrome/browser:browser
# to pick up the implementations. The reason for this target separation is
# because KeyedServiceFactories mix the interface and implementation.
source_set("factories") {
  sources = [
    "device_info_sync_service_factory.h",
    "sync_service_factory.h",
  ]
  public_deps = [
    ":data_type_store_service_factory",
    "//base",
    "//chrome/browser/profiles",
    "//components/sync/engine",
  ]
}

source_set("unit_tests") {
  testonly = true

  sources = [
    "chrome_sync_client_unittest.cc",
    "session_sync_service_factory_unittest.cc",
    "sessions/sync_sessions_web_contents_router_unittest.cc",
    "sync_service_factory_unittest.cc",
    "sync_startup_tracker_unittest.cc",
  ]

  deps = [
    ":sync",
    "//base",
    "//base/test:test_support",
    "//chrome/browser/favicon",
    "//chrome/browser/history",
    "//chrome/browser/search_engines",
    "//chrome/browser/spellchecker",
    "//chrome/browser/trusted_vault",
    "//chrome/browser/ui:ui_features",
    "//chrome/browser/ui/sync",
    "//chrome/browser/webdata_services",
    "//chrome/common:constants",
    "//chrome/test:test_support",
    "//components/commerce/core:feature_list",
    "//components/metrics",
    "//components/signin/public/base",
    "//components/skills:features",
    "//components/spellcheck:buildflags",
    "//components/sync:test_support",
    "//components/sync/base",
    "//components/sync_device_info:test_support",
    "//components/tabs:public",
    "//components/tabs:test_support",
    "//components/themes/cross_device",
    "//components/variations",
    "//components/variations:test_support",
    "//content/test:test_support",
    "//google_apis",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/base/unowned_user_data",
    "//ui/webui:buildflags",
    "//url",
  ]

  if (is_chromeos) {
    deps += [
      "//ash/constants",
      "//chrome/browser/ash/app_list",
      "//chrome/browser/ash/arc:arc_util",
      "//chrome/browser/ash/floating_sso",
      "//chromeos/ash/components/dbus/shill",
      "//chromeos/ash/components/network:test_support",
      "//chromeos/ash/components/sync_wifi",
      "//chromeos/ash/services/network_config/public/cpp:test_support",
    ]
  }

  if (is_android) {
    sources += [ "glue/synced_tab_delegate_android_unittest.cc" ]
    deps += [
      "//chrome/browser/android:tabs_public",
      "//chrome/browser/flags:flags_android",
      "//chrome/browser/ui/android/tab_model",
      "//chrome/browser/ui/android/tab_model:test_support",
      "//components/sync_sessions:test_support",
    ]
  } else {
    sources += [
      "prefs/chrome_syncable_prefs_database_unittest.cc",
      "sessions/sync_sessions_router_tab_helper_unittest.cc",
      "sync_ui_util_unittest.cc",
    ]
  }

  if (enable_extensions_core) {
    sources += [ "glue/extensions_activity_monitor_unittest.cc" ]
    deps += [
      "//chrome/browser/extensions",
      "//extensions/common",
    ]
  }
}

if (!is_android) {
  source_set("browser_tests") {
    testonly = true

    defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]

    sources = [
      "sessions/browser_list_router_helper_browsertest.cc",
      "sessions/sync_sessions_router_tab_helper_browsertest.cc",
      "sync_ui_util_browsertest.cc",
    ]

    deps = [
      ":sync",
      "//base",
      "//chrome/browser:browser_process",
      "//chrome/browser/profiles:profile",
      "//chrome/browser/resource_coordinator",
      "//chrome/browser/translate",
      "//chrome/browser/ui",
      "//chrome/browser/ui/browser_window",
      "//chrome/browser/ui/sync",
      "//chrome/test:test_support",
      "//chrome/test:test_support_ui",
      "//components/language/core/common",
      "//components/sessions:session_id",
      "//components/sync:test_support",
      "//components/sync_sessions",
      "//components/translate/core/browser",
      "//content/public/common",
      "//content/test:test_support",
      "//testing/gtest",
    ]
  }
}

source_set("data_type_store_service_factory") {
  public = [ "data_type_store_service_factory.h" ]
  sources = [ "data_type_store_service_factory.cc" ]
  public_deps = [
    "//base",
    "//chrome/browser/profiles:profile",
    "//components/sync/model",
  ]
  deps = [ "//components/keyed_service/content" ]
}
