# 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("//build/config/ui.gni")

source_set("webauthn") {
  public = [
    "credential_sorter.h",
    "password_credential_fetcher.h",
    "shared_types.h",
    "touch_to_fill_credential_receiver.h",
    "webauthn_metrics_util.h",
    "webauthn_pref_names.h",
    "webauthn_switches.h",
  ]
  sources = [ "webauthn_pref_names.cc" ]
  public_deps = [
    "//components/password_manager/core/browser",
    "//components/password_manager/core/browser:password_form",
    "//content/public/browser",
    "//device/fido",
  ]

  if (is_android) {
    public += [
      "android/cable_module_android.h",
      "android/cable_registration_state.h",
      "android/chrome_webauthn_client_android.h",
      "android/credential_sorter_android.h",
    ]

    public_deps += [
      "//chrome/browser/touch_to_fill/password_manager:public",
      "//components/webauthn/android",
      "//device/fido:cablev2_registration",
    ]
  }

  if (!is_android) {
    public += [
      "authenticator_reference.h",
      "authenticator_request_dialog_controller.h",
      "authenticator_request_dialog_model.h",
      "authenticator_request_scheduler.h",
      "authenticator_transport.h",
      "change_pin_controller.h",
      "change_pin_controller_impl.h",
      "chrome_authenticator_request_delegate.h",
      "cmtg_device_key_provider_factory.h",
      "cmtg_key_fetcher.h",
      "credential_sorter_desktop.h",
      "enclave_manager.h",
      "enclave_manager_factory.h",
      "enclave_manager_interface.h",
      "gpm_enclave_controller.h",
      "gpm_enclave_transaction.h",
      "immediate_request_rate_limiter_factory.h",
      "local_authentication_token.h",
      "passkey_model_factory.h",
      "passkey_unlock_manager.h",
      "passkey_unlock_manager_factory.h",
      "password_credential_ui_controller.h",
      "ui_readiness_barrier.h",
    ]
    public_deps += [
      "//base",
      "//build:buildflag_header_h",
      "//chrome/browser/profiles:profile",
      "//chrome/browser/trusted_vault",
      "//chrome/common",
      "//chrome/common:version_header",
      "//components/keyed_service/core",
      "//components/os_crypt/common",
      "//components/trusted_vault",
      "//components/webauthn/core/browser",
      "//components/webauthn/core/browser:passkey_model",
      "//crypto",
      "//google_apis",
    ]
  }

  if (is_mac) {
    public += [ "chrome_authenticator_request_delegate_mac.h" ]
  }
}

source_set("impl") {
  sources = [
    "password_credential_fetcher.cc",
    "webauthn_metrics_util.cc",
    "webauthn_switches.cc",
  ]

  public_deps = [
    ":webauthn",
    "//chrome/browser:browser_public_dependencies",
  ]

  deps = [
    "//base",
    "//chrome/browser/password_manager",
    "//chrome/browser/profiles:profile",
    "//components/password_manager/core/browser",
    "//components/password_manager/core/browser:password_form",
    "//components/password_manager/core/browser/password_store:password_store_interface",
    "//content/public/browser",
    "//url",
  ]

  if (is_android) {
    sources += [
      "android/cable_module_android.cc",
      "android/cable_registration_state.cc",
      "android/credential_sorter_android.cc",
    ]
    deps += [
      "//chrome/android:chrome_jni_headers",
      "//chrome/browser/gcm",
      "//chrome/browser/net",
      "//chrome/browser/password_manager/android:utils",
      "//chrome/browser/password_manager/android/grouped_affiliations:public",
      "//chrome/browser/sync",
      "//chrome/browser/webauthn/android:jni_headers",
      "//components/cbor",
      "//components/password_manager/core/browser/features:password_features",
      "//components/webauthn/android",
      "//components/webauthn/core/browser",
      "//components/webauthn/json",
      "//device/fido:cablev2_registration",
      "//third_party/blink/public/common:headers",
    ]
  }

  if (!is_android) {
    sources += [
      "authenticator_reference.cc",
      "authenticator_request_dialog_controller.cc",
      "authenticator_request_dialog_model.cc",
      "authenticator_request_scheduler.cc",
      "change_pin_controller.cc",
      "change_pin_controller_impl.cc",
      "chrome_authenticator_request_delegate.cc",
      "cmtg_device_key_provider_factory.cc",
      "cmtg_key_fetcher.cc",
      "credential_sorter_desktop.cc",
      "enclave_manager.cc",
      "enclave_manager_factory.cc",
      "enclave_manager_interface.cc",
      "gpm_enclave_controller.cc",
      "gpm_enclave_transaction.cc",
      "immediate_request_rate_limiter_factory.cc",
      "passkey_model_factory.cc",
      "passkey_unlock_manager.cc",
      "passkey_unlock_manager_factory.cc",
      "password_credential_ui_controller.cc",
      "ui_readiness_barrier.cc",
    ]
    deps += [
      ":chrome_web_authentication_delegate",
      ":unexportable_key_utils",
      "//chrome/app:generated_resources",
      "//chrome/app/vector_icons",
      "//chrome/browser/affiliations",
      "//chrome/browser/net",
      "//chrome/browser/profiles",
      "//chrome/browser/signin",
      "//chrome/browser/sync",
      "//chrome/browser/ui:chrome_pages",
      "//chrome/browser/ui/browser_window",
      "//chrome/browser/ui/navigator",
      "//chrome/browser/ui/passwords",
      "//chrome/browser/ui/signin",
      "//chrome/browser/ui/webauthn",
      "//components/cbor",
      "//components/device_event_log",
      "//components/password_manager/core/browser/affiliation:affiliation_fetching",
      "//components/password_manager/core/common",
      "//components/pref_registry",
      "//components/prefs",
      "//components/signin/public/identity_manager",
      "//components/sync/service",
      "//components/trusted_vault",
      "//components/trusted_vault/proto",
      "//components/user_prefs",
      "//components/vector_icons",
      "//components/webauthn/content/browser",
      "//components/webauthn/core/browser",
      "//services/network/public/cpp",
      "//services/network/public/mojom",
      "//ui/base",
      "//ui/gfx",
    ]
  }

  if (is_mac) {
    sources += [ "chrome_authenticator_request_delegate_mac.mm" ]
  }

  if (is_win) {
    deps += [ ":local_credential_management" ]
  }

  if (is_chromeos) {
    deps += [
      "//ash",
      "//chromeos/components/webauthn",
    ]
  }
}

if (is_android) {
  source_set("webauthn_request_delegate_android") {
    public = [ "android/webauthn_request_delegate_android.h" ]

    public_deps = [
      ":webauthn",
      "//base",
      "//components/password_manager/core/browser",
      "//components/password_manager/core/browser:password_form",
      "//components/webauthn/android",
      "//content/public/browser",
      "//device/fido",
    ]
  }

  source_set("webauthn_request_delegate_android_impl") {
    sources = [
      "android/chrome_webauthn_client_android.cc",
      "android/webauthn_request_delegate_android.cc",
    ]

    public_deps = [
      ":webauthn_request_delegate_android",
      "//chrome/browser:browser_public_dependencies",
    ]

    deps = [
      ":webauthn",
      "//chrome/browser/password_manager",
      "//chrome/browser/password_manager/android/grouped_affiliations:public",
      "//chrome/browser/profiles:profile",
      "//chrome/browser/touch_to_fill/password_manager:impl",
      "//components/password_manager/content/browser",
      "//components/webauthn/android",
      "//components/webauthn/core/browser",
    ]
  }
}

source_set("chrome_web_authentication_delegate") {
  public = [ "chrome_web_authentication_delegate_base.h" ]
  sources = [ "chrome_web_authentication_delegate_base.cc" ]

  public_deps = [
    "//base",
    "//content/public/browser",
  ]

  deps = [
    ":webauthn",
    "//chrome/browser/profiles:profile",
    "//chrome/common:constants",
    "//components/prefs",
    "//device/fido",
  ]

  if (is_win || is_mac || is_linux) {
    deps += [ "//chrome/browser/extensions/api/web_authentication_proxy" ]
  }

  if (!is_android) {
    public += [ "chrome_web_authentication_delegate.h" ]
    sources += [ "chrome_web_authentication_delegate.cc" ]

    deps += [
      ":unexportable_key_utils",
      "//chrome/browser/signin",
      "//chrome/browser/sync",
      "//chrome/browser/ui/passwords",
      "//components/device_event_log",
      "//components/webapps/isolated_web_apps:scheme",
      "//components/webauthn/core/browser",
      "//components/webauthn/core/browser:signal_api_utils",
    ]

    if (is_chromeos) {
      deps += [ "//chromeos/components/webauthn" ]
    }
  }

  deps += [ "//chrome/browser/enterprise" ]
}

if (!is_android) {
  source_set("local_credential_management") {
    public = [ "local_credential_management.h" ]
    sources = [ "local_credential_management.cc" ]

    public_deps = [
      "//base",
      "//chrome/browser/profiles:profile",
      "//device/fido",
      "//third_party/icu",
    ]

    deps = [
      "//base:i18n",
      "//components/prefs",
      "//net",
    ]

    if (is_win) {
      public += [ "local_credential_management_win.h" ]
      sources += [ "local_credential_management_win.cc" ]
      deps += [
        "//components/pref_registry",
        "//components/user_prefs",
      ]
    }

    if (is_mac) {
      public += [ "local_credential_management_mac.h" ]
      sources += [ "local_credential_management_mac.cc" ]
      deps += [ ":chrome_web_authentication_delegate" ]
    }
  }

  source_set("unexportable_key_utils") {
    public = [ "unexportable_key_utils.h" ]
    sources = [ "unexportable_key_utils.cc" ]

    public_deps = [
      "//base",
      "//crypto",
    ]

    deps = [
      ":webauthn",
      "//device/fido",
    ]

    if (is_chromeos) {
      sources += [ "unexportable_key_utils_chromeos.cc" ]
      deps += [
        "//ash/constants",
        "//ash/public/cpp",
        "//chromeos/ash/components/osauth/impl",
      ]
    }
  }

  static_library("test_support") {
    testonly = true

    sources = [
      "enclave_authenticator_browsertest_base.cc",
      "enclave_authenticator_browsertest_base.h",
      "enclave_keys_waiter.cc",
      "enclave_keys_waiter.h",
      "fake_magic_arch.cc",
      "fake_magic_arch.h",
      "fake_password_credential_fetcher.cc",
      "fake_password_credential_fetcher.h",
      "fake_recovery_key_store.cc",
      "fake_recovery_key_store.h",
      "fake_security_domain_service.cc",
      "fake_security_domain_service.h",
      "mock_enclave_manager.cc",
      "mock_enclave_manager.h",
      "mock_local_credential_management.cc",
      "mock_local_credential_management.h",
      "test_util.cc",
      "test_util.h",
      "webauthn_scoped_fake_unexportable_key_provider.cc",
      "webauthn_scoped_fake_unexportable_key_provider.h",
    ]

    deps = [
      ":local_credential_management",
      ":unexportable_key_utils",
      ":webauthn",
      "//base",
      "//chrome/browser/sync",
      "//chrome/browser/sync/test/integration:sync_integration_test_support",
      "//chrome/test:test_support_ui",
      "//components/signin/public/identity_manager:test_support",
      "//components/sync:test_support",
      "//components/trusted_vault",
      "//components/trusted_vault:test_support",
      "//components/trusted_vault/proto",
      "//components/webauthn/core/browser",
      "//components/webauthn/core/browser:passkey_model",
      "//crypto:test_support",
      "//device/fido",
      "//device/fido:test_support",
      "//google_apis",
      "//net",
      "//testing/gmock",
      "//testing/gtest",
      "//url",
    ]

    if (is_mac) {
      deps += [ "//device/fido:icloud_keychain_test_support" ]
    }

    data_deps = [ "//third_party/cloud_authenticator/test/local_service:cloud_authenticator_test_service" ]
  }
}

source_set("unit_tests") {
  testonly = true

  # Several of these unittests have file-scope statics of non-trivial-destructor
  # types, which -Wexit-time-destructors rejects.
  configs += [ "//build/config/compiler:no_exit_time_destructors" ]

  sources = [
    "chrome_web_authentication_delegate_base_unittest.cc",
    "password_credential_fetcher_unittest.cc",
  ]

  deps = [
    ":chrome_web_authentication_delegate",
    ":webauthn",
    "//base",
    "//base/test:test_support",
    "//chrome/browser/password_manager",
    "//chrome/browser/profiles:profile",
    "//chrome/test:test_support",
    "//components/cbor",
    "//components/password_manager/core/browser",
    "//components/password_manager/core/browser:test_support",
    "//components/sync:test_support",
    "//components/sync/protocol",
    "//components/webauthn/content/browser",
    "//components/webauthn/core/browser",
    "//components/webauthn/core/browser:passkey_model",
    "//components/webauthn/core/browser:signal_api_utils",
    "//components/webauthn/core/browser:test_support",
    "//content/test:test_support",
    "//device/fido",
    "//device/fido:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]

  if (!is_android) {
    sources += [
      "authenticator_request_dialog_model_unittest.cc",
      "authenticator_request_scheduler_unittest.cc",
      "chrome_authenticator_request_delegate_unittest.cc",
      "chrome_web_authentication_delegate_unittest.cc",
      "cmtg_key_fetcher_unittest.cc",
      "credential_sorter_desktop_unittest.cc",
      "enclave_manager_unittest.cc",
      "passkey_unlock_manager_unittest.cc",
      "password_credential_ui_controller_unittest.cc",
      "ui_readiness_barrier_unittest.cc",
    ]

    deps += [
      ":local_credential_management",
      ":test_support",
      ":unexportable_key_utils",
      "//chrome/browser/signin",
      "//chrome/browser/signin:test_support",
      "//chrome/browser/sync",
      "//chrome/browser/sync:factories",
      "//chrome/browser/ui/passwords",
      "//chrome/browser/ui/signin",
      "//components/signin/public/identity_manager",
      "//components/signin/public/identity_manager:test_support",
      "//components/trusted_vault",
      "//components/trusted_vault:test_support",
      "//components/trusted_vault/proto",
      "//crypto:test_support",
      "//google_apis",
      "//net",
    ]

    if (is_mac) {
      sources += [ "local_credential_management_mac_unittest.mm" ]
    }

    if (is_win) {
      sources += [ "local_credential_management_win_unittest.cc" ]
    }
  }

  if (is_chromeos) {
    sources += [ "unexportable_key_utils_chromeos_unittest.cc" ]
    deps += [
      ":unexportable_key_utils",
      "//chromeos/ash/components/osauth/impl",
      "//chromeos/ash/components/osauth/public",
    ]
  }

  if (is_android) {
    sources += [
      "android/cable_module_android_unittest.cc",
      "android/cable_registration_state_unittest.cc",
      "android/credential_sorter_android_unittest.cc",
    ]
  }
}

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

    defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]

    sources = [
      "chrome_webauthn_browsertest.cc",
      "passkey_unlock_manager_browsertest.cc",
    ]

    deps = [
      ":test_support",
      ":unexportable_key_utils",
      ":webauthn",
      "//base",
      "//base/test:test_support",
      "//chrome/browser/actor:test_support",
      "//chrome/browser/actor/ui:test_support",
      "//chrome/browser/password_manager",
      "//chrome/browser/password_manager/factories",
      "//chrome/browser/profiles:profile",
      "//chrome/browser/ssl:cert_verifier_test_support",
      "//chrome/browser/sync",
      "//chrome/browser/sync:factories",
      "//chrome/browser/sync/test/integration:sync_integration_test_support",
      "//chrome/browser/ui",
      "//chrome/browser/ui/browser_window",
      "//chrome/browser/ui/passwords",
      "//chrome/browser/web_applications:web_applications_test_support",
      "//chrome/test:test_support",
      "//chrome/test:test_support_ui",
      "//components/device_event_log",
      "//components/password_manager/core/browser",
      "//components/password_manager/core/browser:test_support",
      "//components/signin/public/identity_manager",
      "//components/sync:test_support",
      "//components/trusted_vault",
      "//components/trusted_vault:test_support",
      "//components/webauthn/core/browser",
      "//components/webauthn/core/browser:passkey_model",
      "//components/webauthn/core/browser:signal_api_utils",
      "//components/webauthn/core/browser:test_support",
      "//content/test:test_support",
      "//crypto:test_support",
      "//device/bluetooth:mocks",
      "//device/fido",
      "//device/fido:test_support",
      "//google_apis",
      "//net:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//ui/base",
    ]

    if (!is_chromeos) {
      sources += [
        "change_pin_controller_impl_browsertest.cc",
        "enclave_authenticator_browsertest.cc",
      ]
    }

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

    if (is_chromeos) {
      deps += [
        "//chrome/browser/ash/policy/affiliation:test_support",
        "//chrome/browser/ash/policy/core:test_support",
      ]
    }

    if (is_mac) {
      deps += [ "//device/fido:icloud_keychain_test_support" ]
    }
  }

  if (!is_chromeos_device) {
    source_set("interactive_ui_tests") {
      testonly = true

      # webauthn_immediate_get_interactive_uitest.cc has file-scope statics of
      # non-trivial-destructor types, which -Wexit-time-destructors rejects.
      configs += [ "//build/config/compiler:no_exit_time_destructors" ]

      defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]

      sources = [
        "chrome_webauthn_autofill_interactive_uitest.cc",
        "webauthn_focus_interactive_uitest.cc",
      ]

      deps = [
        ":test_support",
        ":webauthn",
        "//base",
        "//base/test:test_support",
        "//chrome/browser/devtools:test_support",
        "//chrome/browser/ssl:cert_verifier_test_support",
        "//chrome/browser/sync",
        "//chrome/browser/ui",
        "//chrome/browser/ui/autofill",
        "//chrome/browser/ui/browser_window",
        "//chrome/browser/ui/views/webauthn",
        "//chrome/test:test_support",
        "//chrome/test:test_support_ui",
        "//components/sync_device_info:test_support",
        "//components/webauthn/core/browser",
        "//components/webauthn/core/browser:signal_api_utils",
        "//components/webauthn/core/browser:test_support",
        "//content/test:test_support",
        "//crypto:test_support",
        "//device/bluetooth:mocks",
        "//device/fido",
        "//device/fido:test_support",
        "//testing/gmock",
        "//testing/gtest",
        "//ui/base",
      ]

      if (is_mac) {
        sources += [ "chrome_webauthn_autofill_mac_interactive_uitest.mm" ]
        deps += [
          ":chrome_web_authentication_delegate",
          "//chrome/browser/password_manager",
        ]
      }

      if (toolkit_views) {
        sources += [ "webauthn_immediate_get_interactive_uitest.cc" ]
      }
    }
  }
}
