# 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("//testing/test.gni")
import("//ui/base/ui_features.gni")

assert(use_aura)
assert(enable_hidpi)

gypi_values = exec_script("//build/gypi_to_gn.py",
                          [ rebase_path("ash.gyp") ],
                          "scope",
                          [ "ash.gyp" ])

component("ash") {
  sources = gypi_values.ash_sources

  configs += [ "//build/config:precompiled_headers" ]
  defines = [ "ASH_IMPLEMENTATION" ]

  public_deps = [
    "//ash/resources",
    "//ash/strings",
  ]
  deps = [
    "//base",
    "//base:i18n",
    "//base/third_party/dynamic_annotations",
    "//cc",
    "//components/device_event_log",
    "//components/onc",
    "//components/signin/core/account_id",
    "//components/user_manager",
    "//components/wallpaper",
    "//media",
    "//net",
    "//skia",
    "//third_party/icu",
    "//ui/accessibility",
    "//ui/app_list",
    "//ui/aura",
    "//ui/base",
    "//ui/base:ui_data_pack",
    "//ui/base/ime",
    "//ui/compositor",
    "//ui/display/types",
    "//ui/events",
    "//ui/events:events_base",
    "//ui/events:gesture_detection",
    "//ui/events/devices",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/keyboard",
    "//ui/message_center",
    "//ui/native_theme",
    "//ui/platform_window",
    "//ui/platform_window/stub",
    "//ui/resources",
    "//ui/strings",
    "//ui/views",
    "//ui/wm",
    "//url",
  ]

  if (is_win) {
    sources -= [
      "sticky_keys/sticky_keys_controller.cc",
      "sticky_keys/sticky_keys_controller.h",
    ]

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

  if (use_x11) {
    configs += [
      "//build/config/linux:x11",
      "//build/config/linux:xfixes",
    ]
    deps += [
      "//ui/events/platform",
      "//ui/gfx/x",
    ]
  } else {
    sources -= [
      "host/ash_window_tree_host_x11.cc",
      "host/ash_window_tree_host_x11.h",
      "wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_x11.cc",
      "wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_x11.h",
    ]
  }

  if (use_ozone) {
    deps += [
      "//ui/events:dom_keycode_converter",
      "//ui/events/ozone:events_ozone",
      "//ui/ozone",
    ]
  }

  if (is_chromeos) {
    deps += [
      "//chromeos",
      "//chromeos:power_manager_proto",
      "//device/bluetooth",

      # TODO(msw): Remove this; only ash_with_content should depend on webkit.
      "//third_party/WebKit/public:blink_headers",
      "//third_party/qcms",
      "//ui/chromeos:ui_chromeos",
      "//ui/chromeos/resources",
      "//ui/chromeos/strings",
      "//ui/display",
      "//ui/display/util",
    ]
  } else {
    sources -= [
      "accelerators/key_hold_detector.cc",
      "accelerators/key_hold_detector.h",
      "accelerators/magnifier_key_scroller.cc",
      "accelerators/magnifier_key_scroller.h",
      "accelerators/spoken_feedback_toggler.cc",
      "accelerators/spoken_feedback_toggler.h",
      "display/resolution_notification_controller.cc",
      "display/resolution_notification_controller.h",
      "system/tray/media_security/media_capture_observer.h",
      "system/tray/media_security/multi_profile_media_tray_item.cc",
      "system/tray/media_security/multi_profile_media_tray_item.h",
      "touch/touch_transformer_controller.cc",
      "touch/touch_transformer_controller.h",
      "touch/touchscreen_util.cc",
      "touch/touchscreen_util.h",
      "virtual_keyboard_controller.cc",
      "virtual_keyboard_controller.h",
    ]
  }

  if (!use_ozone) {
    sources -= [
      "wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.cc",
      "wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.h",
    ]
  }
}

component("ash_with_content") {
  sources = gypi_values.ash_with_content_sources

  defines = [ "ASH_WITH_CONTENT_IMPLEMENTATION" ]

  public_deps = [
    ":ash",
  ]
  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//content/public/browser",
    "//gpu/config",
    "//ipc",
    "//skia",
    "//ui/aura",
    "//ui/base",
    "//ui/compositor",
    "//ui/events",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/keyboard:keyboard_with_content",
    "//ui/resources",
    "//ui/strings",
    "//ui/views",
    "//ui/views/controls/webview",
    "//ui/web_dialogs",
    "//url",
  ]
}

# TODO(msw): Move support code with content deps to test_support_with_content.
source_set("test_support") {
  testonly = true
  sources = gypi_values.ash_test_support_sources
  configs += [ "//build/config:precompiled_headers" ]

  public_deps = [
    ":ash",
  ]
  deps = [
    ":test_support_with_content",  # TODO(beng): reverse this direction.
    "//ash/resources",
    "//base:i18n",
    "//base/test:test_support",
    "//components/signin/core/account_id",
    "//components/user_manager:user_manager",
    "//content/public/browser",
    "//content/test:test_support",
    "//device/bluetooth",
    "//skia",
    "//testing/gtest",
    "//ui/accessibility",
    "//ui/app_list",
    "//ui/app_list:test_support",
    "//ui/aura",
    "//ui/aura:test_support",
    "//ui/base:test_support",
    "//ui/compositor:test_support",
    "//ui/display/types",
    "//ui/events:events_base",
    "//ui/events:test_support",
    "//ui/events/devices",
    "//ui/gl",
    "//ui/gl:test_support",
    "//ui/keyboard",
    "//ui/message_center",
    "//ui/views",
    "//ui/views:test_support",
    "//ui/wm",
  ]

  if (is_win) {
    deps += [ "//ui/platform_window/win" ]
  }

  if (use_x11) {
    deps += [ "//ui/gfx/x" ]
  }

  if (is_chromeos) {
    deps += [
      "//chromeos",
      "//ui/display",
    ]
  }
}

source_set("test_support_with_content") {
  testonly = true
  sources = gypi_values.ash_test_support_with_content_sources
  configs += [ "//build/config:precompiled_headers" ]

  deps = [
    ":ash_with_content",
    "//content/test:test_support",
    "//skia",
  ]
}

source_set("interactive_ui_test_support") {
  testonly = true
  configs += [ "//build/config:precompiled_headers" ]
  public_deps = [
    ":ash",
    ":test_support",
  ]
  sources = [
    "test/ash_interactive_ui_test_base.cc",
    "test/ash_interactive_ui_test_base.h",
  ]
  deps = [
    ":ash",
    ":test_support",
    "//base",
    "//skia",
    "//testing/gtest",
    "//ui/aura",
    "//ui/base",
    "//ui/gl:test_support",
  ]
}

static_library("ash_shell_lib") {
  testonly = true
  sources = gypi_values.ash_shell_lib_sources

  deps = [
    ":ash",
    ":ash_with_content",
    ":test_support",
    "//ash/resources",
    "//ash/strings",
    "//base",
    "//base:i18n",
    "//components/user_manager",
    "//net",
    "//skia",
    "//third_party/icu",
    "//ui/app_list",
    "//ui/aura",
    "//ui/base",
    "//ui/base/ime",
    "//ui/compositor",
    "//ui/events",
    "//ui/events:events_base",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/keyboard",
    "//ui/keyboard:keyboard_with_content",
    "//ui/message_center",
    "//ui/resources",
    "//ui/views",
    "//ui/views:test_support",
    "//ui/views/examples:views_examples_lib",
    "//ui/views/examples:views_examples_with_content_lib",
    "//ui/wm",
  ]
}

static_library("ash_shell_lib_with_content") {
  testonly = true
  sources = gypi_values.ash_shell_with_content_lib_sources

  deps = [
    ":ash_shell_lib",
    ":ash_with_content",
    "//base:i18n",
    "//chrome:packed_resources",
    "//content",
    "//content/shell:content_shell_lib",
    "//device/bluetooth",
    "//net",
    "//skia",
    "//ui/aura",
    "//ui/base",
    "//ui/compositor",
    "//ui/events/devices",
    "//ui/message_center",
    "//ui/views:test_support",
    "//ui/wm",
  ]

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

test("ash_unittests") {
  sources = gypi_values.ash_unittests_sources
  configs += [ "//build/config:precompiled_headers" ]

  deps = [
    ":ash",
    ":ash_with_content",
    ":test_support",
    ":test_support_with_content",
    "//ash/resources",
    "//ash/strings",
    "//base",
    "//base/test:test_support",
    "//components/signin/core/account_id",
    "//components/user_manager",
    "//content/public/browser",
    "//content/test:test_support",
    "//skia",
    "//testing/gtest",
    "//third_party/icu",
    "//ui/accessibility",
    "//ui/app_list",
    "//ui/aura",
    "//ui/aura:test_support",
    "//ui/base",
    "//ui/base:test_support",
    "//ui/base/ime",
    "//ui/compositor",
    "//ui/compositor:test_support",
    "//ui/display/types",
    "//ui/events",
    "//ui/events:gesture_detection",
    "//ui/events:test_support",
    "//ui/events/devices",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/keyboard",
    "//ui/keyboard:keyboard_with_content",
    "//ui/message_center",
    "//ui/message_center:test_support",
    "//ui/resources",
    "//ui/strings",
    "//ui/views",
    "//ui/views:test_support",
    "//ui/views/controls/webview:test_support",
    "//ui/web_dialogs:test_support",
    "//ui/wm",
    "//url",
  ]

  data_deps = [
    "//ash/strings:ash_test_strings",
    "//ash/resources:ash_test_resources_100_percent",
    "//ash/resources:ash_test_resources_200_percent",
  ]

  if (!is_chromeos) {
    sources -= [
      # TODO(zork): fix this test to build on Windows. See: crosbug.com/26906
      "focus_cycler_unittest.cc",

      # All tests for multiple displays: not supported on Windows Ash.
      "wm/drag_window_resizer_unittest.cc",

      # Accelerometer is only available on Chrome OS.
      "wm/maximize_mode/maximize_mode_controller_unittest.cc",

      # Can't resize on Windows Ash. http://crbug.com/165962
      "autoclick/autoclick_unittest.cc",
      "magnifier/magnification_controller_unittest.cc",
      "sticky_keys/sticky_keys_overlay_unittest.cc",
      "system/tray/media_security/multi_profile_media_tray_item_unittest.cc",
      "virtual_keyboard_controller_unittest.cc",
      "wm/workspace/workspace_window_resizer_unittest.cc",
    ]
    sources += [
      #'<(SHARED_INTERMEDIATE_DIR)/ui/resources/ui_unscaled_resources.rc',  TODO(GYP)
    ]
  }

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

  if (!use_x11) {
    sources -= [ "host/ash_window_tree_host_x11_unittest.cc" ]
  }
  if (is_chromeos) {
    sources += [ "first_run/first_run_helper_unittest.cc" ]
    deps += [
      "//chromeos",
      "//chromeos:power_manager_proto",
      "//chromeos:test_support_without_gmock",
      "//device/bluetooth",
      "//ui/chromeos:ui_chromeos",
      "//ui/display",
      "//ui/display:test_support",
      "//ui/display:test_util",
    ]
  } else {
    sources -= [
      "accelerators/magnifier_key_scroller_unittest.cc",
      "accelerators/spoken_feedback_toggler_unittest.cc",
      "display/resolution_notification_controller_unittest.cc",
      "touch/touchscreen_util_unittest.cc",
    ]
  }

  if (!use_x11 || !is_chromeos) {
    sources -= [ "touch/touch_transformer_controller_unittest.cc" ]
  }

  if (!is_chromeos) {
    sources -= [ "sticky_keys/sticky_keys_unittest.cc" ]
  }
}

executable("ash_shell_with_content") {
  testonly = true
  sources = [
    "shell/content/shell_with_content_main.cc",
  ]

  deps = [
    ":ash_shell_lib_with_content",
    "//base",
    "//build/config/sanitizers:deps",
    "//components/user_manager",
    "//content",
    "//content/public/app:both",
  ]

  data_deps = [
    "//ash/strings:ash_test_strings",
    "//ash/resources:ash_test_resources_100_percent",
    "//ash/resources:ash_test_resources_200_percent",
  ]

  if (is_win) {
    configs -= [ "//build/config/win:console" ]
    configs += [ "//build/config/win:windowed" ]
    deps += [ "//sandbox" ]
  }

  if (is_chromeos) {
    deps += [ "//device/bluetooth" ]
  }
}
# When adding support for isolates, please have a look at run-time dependencies
# in the ash_unittests_run target in ash.gyp.
