# 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_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_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",
  ]

  deps = [
    ":prepopulated_engines",
    "//base",
    "//components/google/core/browser",
    "//components/keyed_service/core",
    "//components/metrics/proto",
    "//components/pref_registry",
    "//components/rappor",
    "//components/strings",
    "//components/url_fixer",
    "//components/webdata/common",
    "//google_apis",
    "//net",
    "//sql",
    "//sync",
    "//third_party/libxml",
    "//ui/gfx",
    "//url",
  ]

  if (enable_configuration_policy) {
    sources += [
      "default_search_policy_handler.cc",
      "default_search_policy_handler.h",
    ]
    deps += [
      "//components/policy",
    ]
  }
}

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

  deps = [
    ":search_engines",
    "//testing/gtest",
  ]
}

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

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