# 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("//tools/json_to_struct/json_to_struct.gni")

static_library("search_engines") {
  sources = [
    "default_search_manager.cc",
    "default_search_manager.h",
    "keyword_table.cc",
    "keyword_table.h",
    "keyword_web_data_service.cc",
    "keyword_web_data_service.h",
    "search_engine_data_type_controller.cc",
    "search_engine_data_type_controller.h",
    "search_engine_type.h",
    "search_engines_pref_names.cc",
    "search_engines_pref_names.h",
    "search_engines_switches.cc",
    "search_engines_switches.h",
    "search_host_to_urls_map.cc",
    "search_host_to_urls_map.h",
    "search_terms_data.cc",
    "search_terms_data.h",
    "template_url.cc",
    "template_url.h",
    "template_url_data.cc",
    "template_url_data.h",
    "template_url_data_util.cc",
    "template_url_data_util.h",
    "template_url_fetcher.cc",
    "template_url_fetcher.h",
    "template_url_id.h",
    "template_url_parser.cc",
    "template_url_parser.h",
    "template_url_prepopulate_data.cc",
    "template_url_prepopulate_data.h",
    "template_url_service.cc",
    "template_url_service.h",
    "template_url_service_client.h",
    "template_url_service_observer.h",
    "util.cc",
    "util.h",
  ]

  public_deps = [
    "//components/metrics/proto",
  ]

  deps = [
    ":prepopulated_engines",
    "//base",
    "//base:i18n",
    "//components/google/core/browser",
    "//components/history/core/browser",
    "//components/keyed_service/core",
    "//components/metrics/proto",

    # The search_engines target is in an include cycle with
    # components/omnibox/browser. The cycle is whitelisted in the
    # omnibox/browser target, but should ideally be fixed, then this
    # dependency added:
    #"//components/omnibox/browser",
    "//components/infobars/core",
    "//components/pref_registry",
    "//components/prefs",
    "//components/rappor",
    "//components/strings",
    "//components/sync",
    "//components/url_formatter",
    "//components/webdata/common",
    "//google_apis",
    "//net",
    "//sql",
    "//third_party/libxml",
    "//ui/base",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//url",
  ]

  if (!is_ios) {
    sources += [
      "default_search_policy_handler.cc",
      "default_search_policy_handler.h",
    ]
    deps += [
      "//components/policy:generated",
      "//components/policy/core/browser",
    ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "search_engines_test_util.cc",
    "search_engines_test_util.h",
    "testing_search_terms_data.cc",
    "testing_search_terms_data.h",
  ]

  public_deps = [
    ":search_engines",
    "//base",
    "//components/sync_preferences:test_support",
    "//testing/gtest",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "default_search_manager_unittest.cc",
    "keyword_table_unittest.cc",
    "search_engine_data_type_controller_unittest.cc",
    "search_host_to_urls_map_unittest.cc",
    "template_url_prepopulate_data_unittest.cc",
    "template_url_service_util_unittest.cc",
    "template_url_unittest.cc",
  ]

  deps = [
    ":prepopulated_engines",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//components/google/core/browser",
    "//components/pref_registry:pref_registry",
    "//components/prefs",
    "//components/sync:test_support_driver",
    "//components/sync:test_support_model",
    "//components/sync_preferences:test_support",
    "//components/webdata/common",
    "//net:net",
    "//sql",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]

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

    deps += [
      "//components/policy:generated",
      "//components/policy/core/browser:test_support",
    ]
  }
}

json_to_struct("prepopulated_engines") {
  visibility = [ ":*" ]

  source = "prepopulated_engines.json"
  schema_file = "prepopulated_engines_schema.json"
  namespace = "TemplateURLPrepopulateData"
}
