# 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")

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

component("views") {
  sources = gypi_values.views_sources

  defines = [ "VIEWS_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//base:i18n",
    "//base/third_party/dynamic_annotations",
    "//skia",
    "//third_party/icu",
    "//third_party/wtl",
    "//ui/accessibility",
    "//ui/accessibility:ax_gen",
    "//ui/aura",
    "//ui/base",
    "//ui/compositor",
    "//ui/events",
    "//ui/events:events_base",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/native_theme",
    "//ui/resources",
    "//ui/strings",
    "//ui/wm",
    "//url",
  ]

  forward_dependent_configs_from = [ "//ui/accessibility:ax_gen" ]

  if (!use_ash) {
    sources -= [
      "bubble/tray_bubble_view.cc",
      "bubble/tray_bubble_view.h",
    ]
  }
  if (use_x11 && !is_chromeos) {
    deps += [ "//ui/display/util" ]
  }
  if (is_linux && !is_chromeos) {
    sources -= [ "window/window_button_order_provider.cc" ]
    deps += [ "//ui/shell_dialogs" ]
  } else {
    sources -= [
      "linux_ui/linux_ui.h",
      "linux_ui/linux_ui.cc",
      "linux_ui/status_icon_linux.h",
      "linux_ui/status_icon_linux.cc",
      "linux_ui/window_button_order_observer.h",
      "linux_ui/window_button_order_provider.cc",
    ]
  }

  if (is_win) {
    sources += gypi_values.views_win_sources
    cflags = [ "/wd4267" ]  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    libs = [ "/imm32.lib", "oleacc.lib" ]
    ldflags = [ "/DELAYLOAD:user32.dll" ]
    deps += [
      "//third_party/iaccessible2",
      "//third_party/wtl",
    ]
  }

  if (use_ozone) {
    deps += [ "//ui/ozone" ]
  }
  if (use_x11) {
    configs += [
      "//build/config/linux:x11",
      "//build/config/linux:xrandr",
    ]
    deps += [
      "//ui/events/platform/x11",
    ]
  }

  if (use_aura) {
    sources += gypi_values.views_aura_sources
    if (!is_chromeos) {
      if (use_x11) {
        sources += gypi_values.views_desktop_aura_x11_sources
      } else if (is_win) {
        sources += gypi_values.views_desktop_aura_win_sources
      } else if (use_ozone) {
        sources += gypi_values.views_desktop_aura_ozone_sources
      }
    }
  }
}

static_library("test_support") {
  sources = gypi_values.views_test_support_sources

  deps = [
    ":views",
    "//base",
    "//ipc",
    "//skia",
    "//testing/gtest",
    "//ui/aura",
    "//ui/base",
    "//ui/compositor",
    "//ui/events",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/wm",
  ]

  if (is_chromeos) {
    sources -= [
      "test/ui_controls_factory_desktop_aurax11.cc",
      "test/ui_controls_factory_desktop_aurax11.h",
    ]
  }
  if (use_aura) {
    sources += gypi_values.views_test_support_aura_sources
    deps += [ "//ui/aura:test_support" ]
  }
}

if (false) {  # TODO(GYP) enable once this links

test("views_unittests") {
  sources = gypi_values.views_unittests_sources

  deps = [
    ":test_support",
    ":views",
    "//base",
    "//base:i18n",
    "//base/allocator",
    "//base/test:test_support",
    "//skia",
    "//testing/gtest",
    "//third_party/icu",
    "//ui/accessibility",
    "//ui/aura",
    "//ui/base",
    "//ui/base:test_support",
    "//ui/compositor",
    "//ui/compositor:test_support",
    "//ui/events",
    "//ui/events:events_base",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/wm",
    "//url",
  ]

  if (is_chromeos) {
    sources -= [
      "ime/input_method_bridge_unittest.cc",
      "widget/desktop_aura",
    ]
  }

  if (is_win) {
    deps += [
      "//third_party/iaccessible2",
      "//third_party/wtl",
    ]
    libs = [
      "imm32.lib",
      "oleacc.lib",
      "comctl32.lib",
    ]
    # TOOD(GYP)
    #'msvs_settings': {
    #  'VCManifestTool': {
    #    'AdditionalManifestFiles': [
    #      '$(ProjectDir)\\test\\views_unittest.manifest',
    #    ],
    #  },
    #},
  }

  if (use_x11) {
    configs += [
      "//build/config/linux:x11",
      "//build/config/linux:xext",
    ]
    deps += [
      "//ui/events/platform/x11",
    ]
  }

  if (use_ozone) {
    sources -= [
      "corewm/capture_controller_unittest.cc",
    ]
  }
  if (use_aura) {
    sources += gypi_values.views_unittests_aura_sources
    deps = [ "//ui/aura:test_support" ]
    if (!is_chromeos) {
      sources += gypi_values.views_unittests_desktop_aura_sources
    }
  }
  if (use_x11) {
    deps += [ "//ui/events/platform/x11" ]
  }

  if (is_mac) {
    # views_unittests not yet compiling on Mac. http://crbug.com/378134
    sources -= [
      "bubble/bubble_window_targeter_unittest.cc",
      "controls/button/custom_button_unittest.cc",
      "controls/button/menu_button_unittest.cc",
      "controls/native/native_view_host_unittest.cc",
      "controls/menu/menu_controller_unittest.cc",
      "ime/input_method_bridge_unittest.cc",
      "focus/focus_manager_unittest.cc",
      "widget/window_reorderer_unittest.cc",
      "widget/widget_unittest.cc",
    ]
  }
}

if (is_mac) {
  test("macviews_interactive_ui_tests") {
    sources = [
      "run_all_unittests.cc",
      "widget/native_widget_mac_interactive_uitest.mm",
    ]
    deps = [
      ":test_support",
      ":views",
      "//base",
      "//base/test:test_support",
      "//skia",
      "//testing/gtest",
      "//ui/aura",
      "//ui/compositor",
      "//ui/resources",
      "//ui/resources:ui_test_pak",
      "//ui/string",
      "//ui/wm",
    ]
  }
}

}  # if false
