# Copyright 2017 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.

source_set("password_protection") {
  if (!is_android && !is_ios) {
    sources = [
      "password_protection_navigation_throttle.cc",
      "password_protection_navigation_throttle.h",
      "password_protection_request.cc",
      "password_protection_request.h",
      "password_protection_service.cc",
      "password_protection_service.h",
      "visual_utils.cc",
      "visual_utils.h",
    ]

    public_deps = [
      "//google_apis:google_apis",
    ]

    deps = [
      ":password_protection_metrics_util",
      "//base:base",
      "//components/content_settings/core/browser:browser",
      "//components/data_use_measurement/core:core",
      "//components/history/core/browser:browser",
      "//components/password_manager/core/browser:browser",
      "//components/safe_browsing:csd_proto",
      "//components/safe_browsing:features",
      "//components/safe_browsing/common:common",
      "//components/safe_browsing/common:safe_browsing_prefs",
      "//components/safe_browsing/db:database_manager",
      "//components/safe_browsing/db:v4_protocol_manager_util",
      "//components/safe_browsing/db:whitelist_checker_client",
      "//components/safe_browsing/web_ui:web_ui",
      "//components/sessions",
      "//components/zoom",
      "//content/public/browser:browser",
      "//net:net",
      "//third_party/protobuf:protobuf_lite",
    ]
  }
}

source_set("password_protection_metrics_util") {
  sources = [
    "metrics_util.cc",
    "metrics_util.h",
  ]

  deps = [
    "//base",
    "//components/safe_browsing:csd_proto",
    "//net:net",
    "//ui/gfx/geometry:geometry",
  ]
}

source_set("password_protection_unittest") {
  testonly = true
  if (!is_android && !is_ios) {
    sources = [
      "password_protection_service_unittest.cc",
      "visual_utils_unittest.cc",
    ]
    deps = [
      ":mock_password_protection",
      ":password_protection",
      ":password_protection_metrics_util",
      "//base",
      "//base/test:test_support",
      "//components/content_settings/core/browser:browser",
      "//components/history/core/browser:browser",
      "//components/password_manager/core/browser:browser",
      "//components/safe_browsing:features",
      "//components/safe_browsing/db:test_database_manager",
      "//components/sync_preferences:test_support",
      "//content/test:test_support",
      "//net:test_support",
      "//services/network:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/protobuf:protobuf_lite",
    ]
  }
}

source_set("mock_password_protection") {
  testonly = true
  if (!is_android && !is_ios) {
    sources = [
      "mock_password_protection_service.cc",
      "mock_password_protection_service.h",
    ]
    deps = [
      ":password_protection",
      "//base",
      "//components/content_settings/core/browser:browser",
      "//components/safe_browsing/db:database_manager",
      "//net:test_support",
      "//services/network/public/cpp:cpp",
      "//testing/gmock",
      "//testing/gtest",
    ]
  }
}
