# 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/crypto.gni")
import("//build/config/features.gni")
import("//build/config/sysroot.gni")
import("//chrome/common/features.gni")
import("//chromeos/assistant/assistant.gni")
import("//device/vr/buildflags/buildflags.gni")
import("//extensions/buildflags/buildflags.gni")
import("//printing/buildflags/buildflags.gni")
import("//services/service_manager/public/service_manifest.gni")

static_library("utility") {
  sources = [
    "chrome_content_utility_client.cc",
    "chrome_content_utility_client.h",
  ]

  defines = []
  configs += [
    "//build/config:precompiled_headers",
    "//build/config/compiler:wexit_time_destructors",
  ]

  public_deps = []
  deps = [
    "//base",
    "//chrome:resources",
    "//chrome:strings",
    "//chrome/common",
    "//chrome/common:mojo_bindings",
    "//components/mirroring/mojom:constants",
    "//components/mirroring/service:mirroring_service",
    "//components/search_engines",
    "//components/services/heap_profiling",
    "//components/services/heap_profiling/public/cpp",
    "//components/services/unzip:lib",
    "//components/strings",
    "//components/url_formatter",
    "//content/public/child",
    "//content/public/common",
    "//content/public/utility",
    "//device/vr/buildflags",
    "//extensions/buildflags",
    "//ipc",
    "//media",
    "//net:net_with_v8",
    "//printing/buildflags",
    "//services/network:network_service",
    "//services/service_manager/public/cpp",
    "//skia",
    "//sql",
    "//third_party/libxml",
    "//third_party/zlib/google:zip",
    "//ui/base:ui_features",
  ]

  if (!is_android) {
    sources += [
      "importer/bookmark_html_reader.cc",
      "importer/bookmark_html_reader.h",
      "importer/bookmarks_file_importer.cc",
      "importer/bookmarks_file_importer.h",
      "importer/edge_database_reader_win.cc",
      "importer/edge_database_reader_win.h",
      "importer/edge_importer_win.cc",
      "importer/edge_importer_win.h",
      "importer/external_process_importer_bridge.cc",
      "importer/external_process_importer_bridge.h",
      "importer/favicon_reencode.cc",
      "importer/favicon_reencode.h",
      "importer/firefox_importer.cc",
      "importer/firefox_importer.h",
      "importer/ie_importer_win.cc",
      "importer/ie_importer_win.h",
      "importer/importer.cc",
      "importer/importer.h",
      "importer/importer_creator.cc",
      "importer/importer_creator.h",
      "importer/nss_decryptor.cc",
      "importer/nss_decryptor.h",
      "importer/nss_decryptor_mac.h",
      "importer/nss_decryptor_mac.mm",
      "importer/nss_decryptor_win.cc",
      "importer/nss_decryptor_win.h",
      "importer/profile_import_impl.cc",
      "importer/profile_import_impl.h",
      "importer/profile_import_service.cc",
      "importer/profile_import_service.h",
      "importer/safari_importer.h",
      "importer/safari_importer.mm",
    ]
    deps += [
      "//chrome/common:mojo_bindings",
      "//chrome/common/importer:interfaces",
      "//components/autofill/core/common",
      "//components/services/patch:lib",
      "//services/data_decoder:lib",
      "//services/proxy_resolver:lib",
    ]
  }

  if (enable_extensions) {
    sources += [
      "image_writer/disk_unmounter_mac.cc",
      "image_writer/disk_unmounter_mac.h",
      "image_writer/error_messages.cc",
      "image_writer/error_messages.h",
      "image_writer/image_writer.cc",
      "image_writer/image_writer.h",
      "image_writer/image_writer_handler.cc",
      "image_writer/image_writer_handler.h",
      "image_writer/image_writer_mac.cc",
      "image_writer/image_writer_win.cc",
    ]
    deps += [
      "//chrome/common/extensions/api",
      "//chrome/services/removable_storage_writer:lib",
    ]

    public_deps += [ "//chrome/common/extensions/api" ]

    # Prevent wininet from loading in the renderer. http://crbug.com/460679
    if (is_win) {
      ldflags = [ "/DELAYLOAD:wininet.dll" ]

      # Add ESE library for Edge Import support.
      libs = [ "esent.lib" ]
      ldflags += [ "/DELAYLOAD:esent.dll" ]

      deps += [
        "//chrome/services/util_win:lib",
        "//chrome/services/wifi_util_win:lib",
      ]
    }

    if (is_win || is_mac) {
      deps += [ "//components/wifi" ]
    } else {
      sources += [ "image_writer/image_writer_stub.cc" ]
    }
  }

  if (is_chromeos) {
    sources += [
      "mash_service_factory.cc",
      "mash_service_factory.h",
    ]
    deps += [
      "//ash",
      "//ash/components/quick_launch:lib",
      "//ash/components/quick_launch/public/mojom",
      "//ash/components/shortcut_viewer:lib",
      "//ash/components/shortcut_viewer/public/mojom",
      "//ash/components/tap_visualizer:lib",
      "//ash/components/tap_visualizer/public/mojom",
      "//chrome/services/file_util:lib",
      "//chromeos/assistant:buildflags",
      "//chromeos/services/ime:lib",
      "//chromeos/services/ime/public/mojom",
      "//services/ws/public/mojom",
    ]

    if (enable_cros_libassistant) {
      deps += [
        "//chromeos/services/assistant/audio_decoder:lib",
        "//chromeos/services/assistant/public/mojom",
      ]
    }
  }

  if (use_nss_certs) {
    sources += [
      "importer/nss_decryptor_system_nss.cc",
      "importer/nss_decryptor_system_nss.h",
    ]
    deps += [
      "//crypto",
      "//crypto:platform",
    ]
  }

  if (enable_basic_printing) {
    deps += [
      "//components/services/pdf_compositor/public/cpp:factory",
      "//components/services/pdf_compositor/public/interfaces",
    ]

    if (is_chromeos) {
      deps += [
        "//chrome/services/cups_ipp_parser:lib",
        "//chrome/services/cups_ipp_parser/public/mojom:mojom",
      ]
    }
  }

  if (enable_print_preview) {
    deps += [ "//chrome/services/printing:lib" ]

    if (is_win) {
      sources += [
        "printing_handler.cc",
        "printing_handler.h",
      ]
    }
  }

  if (safe_browsing_mode == 1) {
    deps += [ "//chrome/services/file_util:lib" ]
    if (is_mac) {
      deps += [ "//chrome/utility/safe_browsing/mac" ]
    }
  }

  if (is_android || enable_extensions) {
    deps += [ "//chrome/services/media_gallery_util:lib" ]
  }

  if (enable_isolated_xr_service) {
    deps += [
      "//chrome/services/isolated_xr_device:lib",
      "//device/vr/public/mojom",
    ]
  }

  if (enable_simple_browser_service_out_of_process) {
    deps += [
      "//services/content/simple_browser",
      "//services/content/simple_browser/public/mojom",
    ]
  }
}

if (!is_android) {
  service_manifest("profile_import_manifest") {
    name = "profile_import"
    source = "importer/profile_import_manifest.json"
  }
}
