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

import("//build/buildflag_header.gni")
import("//build/config/features.gni")
import("//components/password_manager/core/browser/buildflags.gni")
import("//third_party/libprotobuf-mutator/fuzzable_proto_library.gni")

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

config("password_reuse_detection_config") {
  defines = []
  if (!is_ios) {
    defines += [ "ON_FOCUS_PING_ENABLED" ]
  }
}

static_library("browser") {
  sources = [
    "browser_save_password_progress_logger.cc",
    "browser_save_password_progress_logger.h",
    "credential_cache.cc",
    "credential_cache.h",
    "credential_manager_impl.cc",
    "credential_manager_impl.h",
    "credential_manager_logger.cc",
    "credential_manager_logger.h",
    "credential_manager_password_form_manager.cc",
    "credential_manager_password_form_manager.h",
    "credential_manager_pending_prevent_silent_access_task.cc",
    "credential_manager_pending_prevent_silent_access_task.h",
    "credential_manager_pending_request_task.cc",
    "credential_manager_pending_request_task.h",
    "credential_manager_utils.cc",
    "credential_manager_utils.h",
    "credentials_cleaner.cc",
    "credentials_cleaner.h",
    "credentials_cleaner_runner.cc",
    "credentials_cleaner_runner.h",
    "credentials_filter.h",
    "field_info_manager.cc",
    "field_info_manager.h",
    "form_fetcher.h",
    "form_fetcher_impl.cc",
    "form_fetcher_impl.h",
    "form_saver.h",
    "form_saver_impl.cc",
    "form_saver_impl.h",
    "form_submission_observer.h",
    "hsts_query.cc",
    "hsts_query.h",
    "http_auth_manager.h",
    "http_auth_manager_impl.cc",
    "http_auth_manager_impl.h",
    "http_auth_observer.h",
    "http_password_store_migrator.cc",
    "http_password_store_migrator.h",
    "insecure_credentials_helper.cc",
    "insecure_credentials_helper.h",
    "leak_detection_delegate.cc",
    "leak_detection_delegate.h",
    "leak_detection_delegate_helper.cc",
    "leak_detection_delegate_helper.h",
    "leak_detection_dialog_utils.cc",
    "leak_detection_dialog_utils.h",
    "manage_passwords_referrer.h",
    "move_password_to_account_store_helper.cc",
    "move_password_to_account_store_helper.h",
    "old_google_credentials_cleaner.cc",
    "old_google_credentials_cleaner.h",
    "origin_credential_store.cc",
    "origin_credential_store.h",
    "password_autofill_manager.cc",
    "password_autofill_manager.h",
    "password_bubble_experiment.cc",
    "password_bubble_experiment.h",
    "password_change_backup_password_cleaner.cc",
    "password_change_backup_password_cleaner.h",
    "password_change_service_interface.cc",
    "password_change_service_interface.h",
    "password_check_referrer_android.h",
    "password_counter.cc",
    "password_counter.h",
    "password_cross_domain_confirmation_popup_controller.h",
    "password_feature_manager.h",
    "password_feature_manager_impl.cc",
    "password_feature_manager_impl.h",
    "password_form_cache.cc",
    "password_form_cache.h",
    "password_form_cache_impl.cc",
    "password_form_cache_impl.h",
    "password_form_filling.cc",
    "password_form_filling.h",
    "password_form_manager.cc",
    "password_form_manager.h",
    "password_form_manager_for_ui.h",
    "password_form_metrics_recorder.cc",
    "password_form_metrics_recorder.h",
    "password_form_prediction_waiter.cc",
    "password_form_prediction_waiter.h",
    "password_generation_frame_helper.cc",
    "password_generation_frame_helper.h",
    "password_generation_manager.cc",
    "password_generation_manager.h",
    "password_manager.cc",
    "password_manager.h",
    "password_manager_client.cc",
    "password_manager_client.h",
    "password_manager_client_helper.cc",
    "password_manager_client_helper.h",
    "password_manager_constants.cc",
    "password_manager_constants.h",
    "password_manager_driver.h",
    "password_manager_interface.h",
    "password_manager_metrics_recorder.cc",
    "password_manager_metrics_recorder.h",
    "password_manager_setting.h",
    "password_manager_settings_service.h",
    "password_manager_settings_service_impl.cc",
    "password_manager_settings_service_impl.h",
    "password_manager_util.cc",
    "password_manager_util.h",
    "password_manual_fallback_flow.cc",
    "password_manual_fallback_flow.h",
    "password_manual_fallback_metrics_recorder.cc",
    "password_manual_fallback_metrics_recorder.h",
    "password_requirements_service.cc",
    "password_requirements_service.h",
    "password_reuse_detector.cc",
    "password_reuse_detector.h",
    "password_reuse_detector_consumer.cc",
    "password_reuse_detector_consumer.h",
    "password_reuse_detector_impl.cc",
    "password_reuse_detector_impl.h",
    "password_reuse_manager.h",
    "password_reuse_manager_impl.cc",
    "password_reuse_manager_impl.h",
    "password_reuse_manager_signin_notifier.h",
    "password_save_manager.h",
    "password_save_manager_impl.cc",
    "password_save_manager_impl.h",
    "password_session_durations_metrics_recorder.cc",
    "password_session_durations_metrics_recorder.h",
    "password_store_factory_util.cc",
    "password_store_factory_util.h",
    "password_suggestion_flow.h",
    "password_suggestion_generator.cc",
    "password_suggestion_generator.h",
    "password_sync_util.cc",
    "password_sync_util.h",
    "password_ui_utils.cc",
    "password_ui_utils.h",
    "possible_username_data.cc",
    "possible_username_data.h",
    "shared_preferences_delegate.h",
    "store_metrics_reporter.cc",
    "store_metrics_reporter.h",
    "sync_credentials_filter.cc",
    "sync_credentials_filter.h",
    "undo_password_change_controller.cc",
    "undo_password_change_controller.h",
    "votes_uploader.cc",
    "votes_uploader.h",
    "webauthn_credentials_delegate.h",
  ]

  all_dependent_configs = [ ":password_reuse_detection_config" ]
  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  public_deps = [
    ":metrics_util",
    ":passkey_credential",
    "//base",
    "//components/affiliations/core/browser:affiliations",
    "//components/password_manager/core/browser/features:utils",
    "//components/password_manager/core/browser/leak_detection:leak_detection_interface_headers",
    "//components/password_manager/core/browser/password_store:password_store_impl",
    "//components/password_manager/core/browser/sync",

    # TODO(crbug.com/40280865): Remove and update all tagerts to include
    # browser/ui directly.
    "//components/password_manager/core/browser/ui",
    "//components/password_manager/core/browser/well_known_change_password",
    "//components/safe_browsing:buildflags",
    "//components/sync",
  ]
  deps = [
    ":hash_password_manager",
    ":password_hash_data",
    "//build:blink_buildflags",
    "//build:branding_buildflags",
    "//components/autofill/core/browser",
    "//components/autofill/core/common:autofill_regex",
    "//components/autofill/core/common:credit_card_number_validation",
    "//components/device_reauth",
    "//components/favicon/core",
    "//components/favicon_base",
    "//components/metrics",
    "//components/os_crypt/browser",
    "//components/password_manager/core/browser:password_switches",
    "//components/password_manager/core/browser/affiliation:affiliation_match_helper",
    "//components/password_manager/core/browser/features:password_features",
    "//components/password_manager/core/browser/form_parsing",
    "//components/password_manager/core/browser/generation",
    "//components/password_manager/core/browser/leak_detection",
    "//components/password_manager/core/common",
    "//components/pref_registry",
    "//components/prefs",
    "//components/profile_metrics",
    "//components/safe_browsing/core/common",
    "//components/safe_browsing/core/common:safe_browsing_prefs",
    "//components/strings",
    "//components/url_formatter",
    "//services/metrics/public/cpp:metrics_cpp",
    "//services/metrics/public/cpp:ukm_builders",
    "//ui/accessibility",
  ]

  if (is_android) {
    sources += [
      "first_cct_page_load_passwords_ukm_recorder.cc",
      "first_cct_page_load_passwords_ukm_recorder.h",
      "password_credential_filler.h",
      "password_credential_filler_impl.cc",
      "password_credential_filler_impl.h",
    ]
    public_deps += [ ":split_stores_and_local_upm" ]
    deps += [
      "//components/webauthn/android",
      "//services/metrics/public/cpp:ukm_builders",
    ]
  }

  if (!is_android) {
    sources += [
      "os_crypt_async_migrator.cc",
      "os_crypt_async_migrator.h",
    ]
    deps += [ "//components/webauthn/core/browser:passkey_model" ]
  }

  if (is_win || is_mac || is_linux || is_chromeos) {
    sources += [
      "password_manager_blocklist_policy.cc",
      "password_manager_blocklist_policy.h",
    ]
    deps += [ "//components/user_prefs" ]
    public_deps += [
      "//components/keyed_service/content",
      "//components/policy/core/browser",
    ]
  }

  if (use_blink) {
    sources += [
      "http_credentials_cleaner.cc",
      "http_credentials_cleaner.h",
    ]
    deps += [ "//content/public/browser" ]
  }

  if (!is_chromeos && !is_android) {
    sources += [
      "password_reuse_manager_signin_notifier_impl.cc",
      "password_reuse_manager_signin_notifier_impl.h",
    ]
  }
}

if (is_android) {
  source_set("split_stores_and_local_upm") {
    sources = [
      "split_stores_and_local_upm.cc",
      "split_stores_and_local_upm.h",
    ]
    deps = [
      "//base",
      "//components/password_manager/core/browser/features:password_features",
      "//components/password_manager/core/common",
      "//components/prefs",
    ]
  }
}

source_set("password_switches") {
  sources = [
    "password_manager_switches.cc",
    "password_manager_switches.h",
  ]
  public_deps = [ "//base" ]
}

source_set("password_string") {
  sources = [
    "password_string.cc",
    "password_string.h",
  ]
  public_deps = [ "//crypto" ]
  deps = [
    "//base",
    "//components/password_manager/core/browser/features:password_features",
  ]
  configs += [ "//build/config/compiler:wexit_time_destructors" ]
}

# PasswordForm is an extremely common struct used by many sub-components and
# sub-directories. Having its own target makes it possible to break up several
# cyclic dependencies.
source_set("password_form") {
  sources = [
    "password_form.cc",
    "password_form.h",
    "password_form_digest.cc",
    "password_form_digest.h",
  ]
  public_deps = [
    "//base",
    "//components/affiliations/core/browser:match_type",
    "//components/autofill/core/browser",
    "//components/autofill/core/common",
    "//components/autofill/core/common/mojom:mojo_types_shared",
    "//components/signin/public/base",
    "//url",
  ]
  configs += [ "//build/config/compiler:wexit_time_destructors" ]
}

source_set("passkey_credential") {
  sources = [
    "passkey_credential.cc",
    "passkey_credential.h",
  ]
  deps = [
    "//base",
    "//components/strings:components_strings",
    "//components/sync/protocol",
    "//components/webauthn/core/browser:passkey_model",
    "//device/fido",
    "//ui/base",
  ]
  if (is_android) {
    deps += [ "//components/webauthn/android" ]
  }
}

source_set("metrics_util") {
  sources = [
    "password_manager_metrics_util.cc",
    "password_manager_metrics_util.h",
  ]
  deps = [
    ":password_form",
    "//components/autofill/core/common",
    "//components/autofill/core/common/mojom:mojo_types",
    "//components/device_reauth",
    "//components/metrics",
    "//components/password_manager/core/browser/features:utils",
    "//components/password_manager/core/browser/password_store:password_store_interface",
    "//components/password_manager/core/common",
    "//components/prefs",
    "//services/metrics/public/cpp:metrics_cpp",
    "//services/metrics/public/cpp:ukm_builders",
  ]
}

if (is_android) {
  # Wrap the java_cpp_enum in android_library so it can be used by both
  # chrome_java and modules.
  android_library("password_manager_java_enums") {
    deps = [ "//third_party/androidx:androidx_annotation_annotation_java" ]
    srcjar_deps = [ ":password_manager_java_enums_srcjar" ]
  }

  java_cpp_enum("password_manager_java_enums_srcjar") {
    sources = [
      "manage_passwords_referrer.h",
      "password_check_referrer_android.h",
      "password_manager_metrics_util.h",
      "password_manager_setting.h",
      "password_manager_util.h",
      "password_store/android_backend_error.h",
    ]
  }
}

static_library("password_hash_data") {
  sources = [
    "password_hash_data.cc",
    "password_hash_data.h",
  ]
  deps = [
    "//base",
    "//crypto",
    "//google_apis",
  ]
  configs += [ "//build/config/compiler:wexit_time_destructors" ]
}

static_library("hash_password_manager") {
  sources = [
    "hash_password_manager.cc",
    "hash_password_manager.h",
  ]
  deps = [
    ":password_hash_data",
    "//base",
    "//components/os_crypt/common",
    "//components/password_manager/core/browser/features:password_features",
    "//components/password_manager/core/common",
    "//components/prefs",
  ]
  configs += [ "//build/config/compiler:wexit_time_destructors" ]
}

static_library("test_support") {
  testonly = true
  sources = [
    "fake_form_fetcher.cc",
    "fake_form_fetcher.h",
    "fake_password_manager_settings_service.cc",
    "fake_password_manager_settings_service.h",
    "mock_password_feature_manager.cc",
    "mock_password_feature_manager.h",
    "mock_password_form_cache.cc",
    "mock_password_form_cache.h",
    "mock_password_form_manager_for_ui.cc",
    "mock_password_form_manager_for_ui.h",
    "mock_password_manager.cc",
    "mock_password_manager.h",
    "mock_password_manager_settings_service.cc",
    "mock_password_manager_settings_service.h",
    "mock_password_reuse_manager.cc",
    "mock_password_reuse_manager.h",
    "mock_password_suggestion_flow.cc",
    "mock_password_suggestion_flow.h",
    "mock_webauthn_credentials_delegate.cc",
    "mock_webauthn_credentials_delegate.h",
    "password_manager_test_utils.cc",
    "password_manager_test_utils.h",
    "stub_credentials_filter.cc",
    "stub_credentials_filter.h",
    "stub_form_saver.cc",
    "stub_form_saver.h",
    "stub_password_manager_client.cc",
    "stub_password_manager_client.h",
    "stub_password_manager_driver.cc",
    "stub_password_manager_driver.h",
    "sync_username_test_base.cc",
    "sync_username_test_base.h",
  ]

  if (is_android) {
    sources += [
      "mock_password_credential_filler.cc",
      "mock_password_credential_filler.h",
    ]
  }

  public_deps = [
    ":browser",
    ":hash_password_manager",
    ":password_hash_data",
    "//base/test:test_support",
    "//components/autofill/core/browser:test_support",
    "//components/device_reauth",
    "//components/device_reauth:test_support",
    "//components/keyed_service/core",
    "//components/password_manager/core/browser:password_switches",
    "//components/password_manager/core/browser/affiliation:test_support",
    "//components/password_manager/core/browser/leak_detection",
    "//components/password_manager/core/browser/password_store:password_store_interface",
    "//components/password_manager/core/browser/password_store:test_support",
    "//components/safe_browsing:buildflags",
    "//components/signin/public/identity_manager:test_support",
    "//components/sync:test_support",
    "//components/ukm",
    "//services/network/public/cpp",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]
  deps = [
    "//base",
    "//components/autofill/core/common",
    "//components/metrics",
    "//components/version_info:channel",
    "//net",
    "//services/network:test_support",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "browser_save_password_progress_logger_unittest.cc",
    "credential_cache_unittest.cc",
    "credential_manager_impl_unittest.cc",
    "credential_manager_logger_unittest.cc",
    "credential_manager_password_form_manager_unittest.cc",
    "credential_manager_pending_prevent_silent_access_task_unittest.cc",
    "credential_manager_pending_request_task_unittest.cc",
    "credential_manager_utils_unittest.cc",
    "credentials_cleaner_runner_unittest.cc",
    "credentials_cleaner_unittest.cc",
    "field_info_manager_unittest.cc",
    "form_fetcher_impl_unittest.cc",
    "form_saver_impl_unittest.cc",
    "hsts_query_unittest.cc",
    "http_auth_manager_unittest.cc",
    "http_password_store_migrator_unittest.cc",
    "insecure_credentials_helper_unittest.cc",
    "leak_detection_delegate_helper_unittest.cc",
    "leak_detection_delegate_unittest.cc",
    "leak_detection_dialog_utils_unittest.cc",
    "old_google_credentials_cleaner_unittest.cc",
    "origin_credential_store_unittest.cc",
    "passkey_credential_unittest.cc",
    "password_autofill_manager_unittest.cc",
    "password_change_backup_password_cleaner_unittest.cc",
    "password_counter_unittest.cc",
    "password_feature_manager_impl_unittest.cc",
    "password_form_cache_impl_unittest.cc",
    "password_form_filling_unittest.cc",
    "password_form_manager_unittest.cc",
    "password_form_metrics_recorder_unittest.cc",
    "password_form_prediction_waiter_unittest.cc",
    "password_form_unittest.cc",
    "password_generation_frame_helper_unittest.cc",
    "password_generation_manager_unittest.cc",
    "password_hash_data_unittest.cc",
    "password_manager_client_helper_unittest.cc",
    "password_manager_metrics_recorder_unittest.cc",
    "password_manager_metrics_util_unittest.cc",
    "password_manager_settings_service_impl_unittest.cc",
    "password_manager_unittest.cc",
    "password_manager_util_unittest.cc",
    "password_manual_fallback_flow_unittest.cc",
    "password_manual_fallback_metrics_recorder_unittest.cc",
    "password_requirements_service_unittest.cc",
    "password_reuse_detector_impl_unittest.cc",
    "password_reuse_manager_impl_unittest.cc",
    "password_save_manager_impl_unittest.cc",
    "password_store/password_store_util_unittest.cc",
    "password_string_unittest.cc",
    "password_suggestion_generator_unittest.cc",
    "password_sync_util_unittest.cc",
    "password_ui_utils_unittest.cc",
    "possible_username_data_unittest.cc",
    "store_metrics_reporter_unittest.cc",
    "sync_credentials_filter_unittest.cc",
    "undo_password_change_controller_unittest.cc",
    "vote_uploads_test_matchers.h",
    "votes_uploader_unittest.cc",
  ]
  if (is_android) {
    sources += [
      "first_cct_page_load_passwords_ukm_recorder_unittest.cc",
      "password_credential_filler_impl_unittest.cc",
      "split_stores_and_local_upm_unittest.cc",
    ]
  } else {
    sources += [ "os_crypt_async_migrator_unittest.cc" ]
  }
  if (use_blink) {
    sources += [ "http_credentials_cleaner_unittest.cc" ]
  }

  if (is_win || is_mac || is_linux || is_chromeos) {
    sources += [ "hash_password_manager_unittest.cc" ]
  }

  if (!is_chromeos && !is_android) {
    sources += [ "password_reuse_manager_signin_notifier_impl_unittest.cc" ]
  }

  deps = [
    ":test_support",
    "//build:branding_buildflags",
    "//build:chromecast_buildflags",
    "//components/affiliations/core/browser:sql_builder",
    "//components/affiliations/core/browser:test_support",
    "//components/autofill/core/browser",
    "//components/autofill/core/browser:test_support",
    "//components/autofill/core/common",
    "//components/autofill/core/common:test_support",
    "//components/device_reauth",
    "//components/device_reauth:test_support",
    "//components/favicon/core/test:test_support",
    "//components/metrics",
    "//components/os_crypt/browser:test_support",
    "//components/password_manager/core/browser/affiliation:affiliation_match_helper",
    "//components/password_manager/core/browser/features:password_features",
    "//components/password_manager/core/browser/form_parsing",
    "//components/password_manager/core/browser/generation",
    "//components/password_manager/core/browser/import:importer",
    "//components/password_manager/core/browser/import:importer_unit_tests",
    "//components/password_manager/core/browser/leak_detection",
    "//components/password_manager/core/browser/leak_detection:test_support",
    "//components/password_manager/core/common",
    "//components/prefs:test_support",
    "//components/safe_browsing/core/common",
    "//components/safe_browsing/core/common:safe_browsing_prefs",
    "//components/security_state/core",
    "//components/signin/public/base",
    "//components/strings",
    "//components/sync_preferences:test_support",
    "//components/ukm:test_support",
    "//components/url_formatter",
    "//device/fido",
    "//net:test_support",
    "//services/metrics/public/cpp:ukm_builders",
    "//services/network:network_service",
    "//services/network:test_support",
    "//sql:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/base",
    "//ui/gfx:test_support",
  ]

  if (!is_android) {
    deps += [ "//components/webauthn/core/browser:test_support" ]
  }

  if (is_ios) {
    deps += [ "//components/test:password_manager_test_bundle_data" ]
  }

  if (is_android) {
    deps += [
      ":password_manager_buildflags",
      "//components/webauthn/android",
    ]
  }

  # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
  # enable the diagnostic by removing this line.
  configs += [ "//build/config/compiler:no_exit_time_destructors" ]
}

buildflag_header("password_manager_buildflags") {
  header = "password_manager_buildflags.h"
  flags = [ "PASSWORD_MANAGER_USE_INTERNAL_ANDROID_RESOURCES=$password_manager_use_internal_android_resources" ]
}
