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

import("//build/config/features.gni")
import("//build/config/jumbo.gni")
import("//ppapi/buildflags/buildflags.gni")

jumbo_static_library("browser") {
  sources = [
    "content_settings_constraints.h",
    "content_settings_default_provider.cc",
    "content_settings_default_provider.h",
    "content_settings_details.cc",
    "content_settings_details.h",
    "content_settings_ephemeral_provider.cc",
    "content_settings_ephemeral_provider.h",
    "content_settings_global_value_map.cc",
    "content_settings_global_value_map.h",
    "content_settings_info.cc",
    "content_settings_info.h",
    "content_settings_observable_provider.cc",
    "content_settings_observable_provider.h",
    "content_settings_observer.h",
    "content_settings_origin_identifier_value_map.cc",
    "content_settings_origin_identifier_value_map.h",
    "content_settings_policy_provider.cc",
    "content_settings_policy_provider.h",
    "content_settings_pref.cc",
    "content_settings_pref.h",
    "content_settings_pref_provider.cc",
    "content_settings_pref_provider.h",
    "content_settings_provider.h",
    "content_settings_registry.cc",
    "content_settings_registry.h",
    "content_settings_rule.cc",
    "content_settings_rule.h",
    "content_settings_usages_state.cc",
    "content_settings_usages_state.h",
    "content_settings_utils.cc",
    "content_settings_utils.h",
    "cookie_settings.cc",
    "cookie_settings.h",
    "host_content_settings_map.cc",
    "host_content_settings_map.h",
    "uma_util.cc",
    "uma_util.h",
    "user_modifiable_provider.h",
    "website_settings_info.cc",
    "website_settings_info.h",
    "website_settings_registry.cc",
    "website_settings_registry.h",
  ]

  deps = [
    "//base",
    "//components/content_settings/core/common",
    "//components/keyed_service/core",
    "//components/pref_registry:pref_registry",
    "//components/prefs",
    "//components/url_formatter",
    "//extensions/buildflags",
    "//net",
    "//services/preferences/public/cpp",
    "//url",
  ]

  if (is_android) {
    deps += [ "//media" ]
  }

  if (!is_ios) {
    sources += [
      "cookie_settings_policy_handler.cc",
      "cookie_settings_policy_handler.h",
    ]
    deps += [
      "//components/policy:generated",
      "//components/policy/core/browser",
      "//third_party/blink/public/common:headers",
    ]
  }

  configs += [
    "//build/config/compiler:no_size_t_to_int_warning",
    "//build/config/compiler:wexit_time_destructors",
  ]
}

jumbo_source_set("unit_tests") {
  testonly = true
  sources = [
    "content_settings_ephemeral_provider_unittest.cc",
    "content_settings_pref_unittest.cc",
    "content_settings_registry_unittest.cc",
    "content_settings_rule_unittest.cc",
    "content_settings_utils_unittest.cc",
    "cookie_settings_unittest.cc",
    "website_settings_registry_unittest.cc",
  ]

  if (enable_plugins) {
    sources += [ "content_settings_provider_unittest.cc" ]
  }

  deps = [
    ":browser",
    "//base",
    "//base/test:test_support",
    "//components/content_settings/core/common",
    "//components/content_settings/core/test:test_support",
    "//components/pref_registry:pref_registry",
    "//components/prefs",
    "//components/prefs:test_support",
    "//components/sync_preferences:test_support",
    "//extensions/buildflags",
    "//net",
    "//ppapi/buildflags:buildflags",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]

  if (!is_ios) {
    sources += [ "cookie_settings_policy_handler_unittest.cc" ]

    deps += [
      "//components/policy:generated",
      "//components/policy/core/browser:test_support",
      "//third_party/blink/public/common:headers",
    ]
  }
}
