# 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/chromeos/ui_mode.gni")
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 = [
    "//base",
    "//build:chromeos_buildflags",
    "//components/keyed_service/content",
    "//content/public/browser",
    "//content/public/common",
    "//extensions/browser",
    "//extensions/common",
    "//extensions/common/api",
  ]

  if (is_chromeos_ash) {
    deps += [
      "//components/app_restore",
      "//components/user_manager",
    ]
  }
}

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

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