# 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/buildflags/buildflags.gni")

assert(!is_android && !is_ios)
assert(enable_extensions,
       "Cannot depend on extensions because enable_extensions=false.")

static_library("apps") {
  sources = []

  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",
    "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",
  ]
}
