# 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/ui.gni")

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

component("base") {
  output_name = "ui_base"
  sources = [
    "android/system_ui_resource_manager.h",
    "android/ui_base_jni_registrar.cc",
    "android/ui_base_jni_registrar.h",
    "android/view_android.cc",
    "android/view_android.h",
    "android/window_android.cc",
    "android/window_android.h",
    "android/window_android_compositor.h",
    "android/window_android_observer.h",
    "ui_base_export.h",
  ]

  defines = [ "UI_BASE_IMPLEMENTATION" ]

  public_deps = [
    "//base",
    "//skia",
    "//ui/events",
    "//ui/events/platform",
    "//ui/events:events_base",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]
  deps = [
    "//base/third_party/dynamic_annotations",
    "//base:base_static",
    "//base:i18n",
    "//net",
    "//third_party/icu",
    "//url",
  ]

  if (is_linux) {
    configs += [ "//build/config/linux:fontconfig" ]
  }

  libs = []
  if (is_win) {
    cflags = [
      "/wd4267",  # TODO(jschuh): C4267: http://crbug.com/167187 size_t -> int.
      "/wd4324",  # Structure was padded due to __declspec(align()), which is
                  # uninteresting.
    ]
    ldflags = [
      "/DELAYLOAD:d2d1.dll",
      "/DELAYLOAD:d3d10_1.dll",
      "/DELAYLOAD:dwmapi.dll",
    ]
    libs += [
      "d2d1.lib",
      "d3d10_1.lib",
      "dwmapi.lib",
      "imm32.lib",
      "d2d1.lib",
      "dwmapi.lib",
      "oleacc.lib",
    ]
  }

  if (is_mac) {
    deps += [ "//third_party/mozilla" ]

    libs += [
      "Accelerate.framework",
      "AudioUnit.framework",
      "CoreVideo.framework",
    ]
  }

  if (use_x11) {
    #'all_dependent_settings': {
    #'ldflags': [
    #'-L<(PRODUCT_DIR)',
    #],
    #},
    configs += [ "//build/config/linux:x11" ]
  }

  if (is_android) {
    deps += [ ":ui_base_jni_headers" ]

    libs += [ "jnigraphics" ]
  }

  if (is_android && is_android_webview_build) {
    deps += [
      #TODO(GYP): port this component to GN.
      #"//ui/android:ui_java",
    ]
  }
}

if (is_android) {
  generate_jni("ui_base_jni_headers") {
    sources = [
      "../android/java/src/org/chromium/ui/base/DeviceFormFactor.java",
      "../android/java/src/org/chromium/ui/base/SelectFileDialog.java",
      "../android/java/src/org/chromium/ui/base/ViewAndroid.java",
      "../android/java/src/org/chromium/ui/base/WindowAndroid.java",
    ]
    jni_package = "base"
  }
}

if (false) {
  # TODO(GYP): Make this work on Android and reenable it.
  if (!is_android) {
    # TODO(tfarina): Rename this target to ui_base_unittests.
    # In order to do this we will need to keep this target, add a dummy
    # ui_base_unittests target that just points to ui_unittests, change
    # buildbot code to reference the new 'ui_base_unittests' target.
    # After buildbot is updated, we can make the changes in Chromium and
    # remove 'ui_unittests' target. crbug.com/331829
    test("ui_unittests") {
      sources = [
        "test/run_all_unittests.cc",
      ]

      sources += [ "test/data/resource.h" ]

      deps = [
        "//base",
        "//base/allocator",
        "//base/test:test_support",
        "//net",
        "//skia",
        "//testing/gmock",
        "//testing/gtest",
        "//third_party/icu",
        "//ui/base",
        "//ui/events:events_base",
        "//ui/events:test_support",
        "//ui/gfx:test_support",
        "//url",
      ]

      if (is_win) {
        ldflags = [
          "/DELAYLOAD:d2d1.dll",
          "/DELAYLOAD:d3d10_1.dll",
        ]
        libs = [
          "d2d1.lib",
          "d3d10_1.lib",
          "imm32.lib",
          "oleacc.lib",
        ]

        # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
        cflags = [ "/wd4267" ]
      }

      if (is_android) {
        deps += [
          #"testing/android/native_test.gyp:native_test_native_code"  TODO(GYP)
        ]
      }

      if (use_x11) {
        configs += [ "//build/config/linux:x11" ]

        deps += [ "//ui/gfx/x" ]

        datadeps = [
          "//tools/xdisplaycheck",
        ]
      }

      if (!is_win) {
        sources -= [ "view_prop_unittest.cc" ]
      }

      if (is_mac) {
        deps += [
          "//third_party/mozilla",
          #'ui_unittests_bundle',  TODO(GYP)
        ]
      }

      if (is_chromeos) {
        sources += [ "../chromeos/touch_exploration_controller_unittest.cc" ]
        deps += [
          "//chromeos",
          "//ui/aura:test_support",
          "//ui/events:gesture_detection",
          "//ui/chromeos:ui_chromeos",
        ]
      }
    }
  }
}
# TODO(GYP) Mac (ui_unittest_bundle) and Android (ui_unittests_apk).
