# 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/jumbo.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//testing/test.gni")
import("//third_party/google_input_tools/closure.gni")
import("//third_party/google_input_tools/inputview.gni")
import("//tools/grit/grit_rule.gni")

assert(is_chromeos)

jumbo_component("ui") {
  sources = [
    "container_behavior.cc",
    "container_behavior.h",
    "container_floating_behavior.cc",
    "container_floating_behavior.h",
    "container_full_width_behavior.cc",
    "container_full_width_behavior.h",
    "display_util.cc",
    "display_util.h",
    "drag_descriptor.h",
    "keyboard_controller.cc",
    "keyboard_controller.h",
    "keyboard_controller_observer.h",
    "keyboard_event_handler.cc",
    "keyboard_event_handler.h",
    "keyboard_export.h",
    "keyboard_layout_delegate.h",
    "keyboard_layout_manager.cc",
    "keyboard_layout_manager.h",
    "keyboard_ui.cc",
    "keyboard_ui.h",
    "keyboard_ui_factory.cc",
    "keyboard_ui_factory.h",
    "keyboard_ui_model.cc",
    "keyboard_ui_model.h",
    "keyboard_ukm_recorder.cc",
    "keyboard_ukm_recorder.h",
    "keyboard_util.cc",
    "keyboard_util.h",
    "notification_manager.cc",
    "notification_manager.h",
    "queued_container_type.cc",
    "queued_container_type.h",
    "queued_display_change.cc",
    "queued_display_change.h",
    "resources/keyboard_resource_util.cc",
    "resources/keyboard_resource_util.h",
    "shaped_window_targeter.cc",
    "shaped_window_targeter.h",
  ]

  defines = [ "KEYBOARD_IMPLEMENTATION" ]

  deps = [
    ":resources",
    "//ash/public/cpp",
    "//base",
    "//services/metrics/public/cpp:ukm_builders",
    "//ui/aura",
    "//ui/base",
    "//ui/base/ime",
    "//ui/compositor",
    "//ui/display:display",
    "//ui/events",
    "//ui/events:dom_keycode_converter",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/wm",
  ]

  if (use_ozone) {
    deps += [ "//ui/ozone" ]
  }

  data_deps = [
    ":resources",
  ]
}

static_library("test_support") {
  testonly = true
  sources = [
    "test/keyboard_test_util.cc",
    "test/keyboard_test_util.h",
    "test/test_keyboard_controller_observer.cc",
    "test/test_keyboard_controller_observer.h",
    "test/test_keyboard_layout_delegate.cc",
    "test/test_keyboard_layout_delegate.h",
    "test/test_keyboard_ui_factory.cc",
    "test/test_keyboard_ui_factory.h",
  ]
  deps = [
    ":ui",
    "//base",
    "//ui/aura",
    "//ui/aura:test_support",
    "//ui/base:test_support",
    "//ui/display",
  ]
}

grit("resources_grit") {
  source = "keyboard_resources.grd"
  outputs = [
    "grit/keyboard_resources.h",
    "grit/keyboard_resources_map.h",
    "keyboard_resources.pak",
  ]

  input_tools_root_dir = "//third_party/google_input_tools/src/chrome/os"
  inputview_gen_js = "$root_gen_dir/ash/keyboard/ui/resources/inputview.js"
  grit_flags = [
    "-E",
    "input_tools_root_dir=" + rebase_path(input_tools_root_dir, "."),
    "-E",
    "inputview_gen_js=" + rebase_path(inputview_gen_js, root_build_dir),
  ]

  deps = [
    ":inputview",
  ]
}

copy("resources") {
  sources = [
    "$target_gen_dir/keyboard_resources.pak",
  ]
  outputs = [
    "$root_out_dir/keyboard_resources.pak",
  ]
  public_deps = [
    ":resources_grit",
  ]
}

build_closure("inputview") {
  sources = inputview_sources
  target = "$target_gen_dir/resources/inputview.js"
  path = rebase_path("//third_party/google_input_tools")
}

test("keyboard_unittests") {
  sources = [
    "container_floating_behavior_unittest.cc",
    "container_full_width_behavior_unittest.cc",
    "keyboard_controller_unittest.cc",
    "keyboard_event_handler_unittest.cc",
    "keyboard_ukm_recorder_unittest.cc",
    "keyboard_util_unittest.cc",
    "notification_manager_unittest.cc",
    "test/run_all_unittests.cc",
  ]

  deps = [
    ":test_support",
    ":ui",
    "//ash/public/cpp",
    "//base",
    "//base/test:test_support",
    "//components/ukm:test_support",
    "//mojo/core/embedder",
    "//services/service_manager/public/cpp",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/aura:test_support",
    "//ui/base",
    "//ui/base:test_support",
    "//ui/base/ime/init",
    "//ui/compositor:test_support",
    "//ui/events:test_support",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl:test_support",
    "//ui/resources:ui_test_pak",
    "//ui/wm",
  ]

  data_deps = [
    "//ui/resources:ui_test_pak_data",
  ]

  if (use_ozone) {
    deps += [ "//ui/ozone" ]
  }
}
