# 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/ui.gni")
import("//extensions/features/features.gni")

assert(!is_android && !is_ios)

static_library("apps") {
  sources = []

  if (enable_extensions) {
    sources += [
      "app_lifetime_monitor.cc",
      "app_lifetime_monitor.h",
      "app_lifetime_monitor_factory.cc",
      "app_lifetime_monitor_factory.h",
      "app_restore_service.cc",
      "app_restore_service.h",
      "app_restore_service_factory.cc",
      "app_restore_service_factory.h",
      "browser_context_keyed_service_factories.cc",
      "browser_context_keyed_service_factories.h",
      "launcher.cc",
      "launcher.h",
      "metrics_names.h",
      "saved_files_service.cc",
      "saved_files_service.h",
      "saved_files_service_factory.cc",
      "saved_files_service_factory.h",
      "switches.cc",
      "switches.h",
    ]

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

    deps = [
      "//components/keyed_service/content",
      "//content/public/browser",
      "//content/public/common",
      "//extensions/browser",
      "//extensions/common",
      "//extensions/common/api",
    ]

    if (is_chromeos) {
      deps += [ "//components/user_manager" ]
    }
  }

  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
}

static_library("test_support") {
  testonly = true
  sources = [
    "test/app_window_waiter.cc",
    "test/app_window_waiter.h",
  ]

  public_deps = [
    "//content/public/browser",
  ]
}
