# 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:i18n",
    "//base/third_party/dynamic_annotations",
    "//skia",
    "//third_party/icu",
    "//ui/accessibility",
    "//ui/aura",
    "//ui/native_theme",
    "//ui/resources",
    "//ui/strings",
    "//ui/wm",
    "//url",
  ]

  public_deps = [
    "//base",
    "//ui/accessibility:ax_gen",
    "//ui/base",
    "//ui/compositor",
    "//ui/events",
    "//ui/events:events_base",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]

  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/window_button_order_observer.h",
      "linux_ui/window_button_order_provider.cc",
    ]
  }

  if (is_chromeos) {
    sources -= [
      "linux_ui/status_icon_linux.h",
      "linux_ui/status_icon_linux.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",
      "//ui/gfx/x",
    ]
  }

  if (use_aura) {
    sources += gypi_values.views_aura_sources
    if (!is_chromeos) {
      sources += gypi_values.views_desktop_aura_sources
      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") {
  testonly = true
  sources = gypi_values.views_test_support_sources

  public_deps = [
    ":views",
  ]
  deps = [
    "//base",
    "//ipc:test_support",
    "//skia",
    "//testing/gtest",
    "//ui/aura",
    "//ui/base",
    "//ui/compositor",
    "//ui/compositor:test_support",
    "//ui/events",
    "//ui/events:events_base",
    "//ui/events:test_support",
    "//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 (use_x11) {
    deps += [ "//ui/gfx/x" ]
  }
}

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

  deps = [
    ":test_support",
    "//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:test_support",
    "//ui/events:test_support",
    "//ui/events:events_base",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
    "//ui/resources",
    "//ui/strings",
    "//ui/wm",
    "//url",
  ]

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

  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",
      "//ui/gfx/x",
    ]
  }

  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",
      "//ui/gfx/x",
    ]
  }

  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/strings",
      "//ui/wm",
    ]
  }
}
