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

component("native_theme") {
  sources = [
    "caption_style.cc",
    "caption_style.h",
    "common_theme.cc",
    "common_theme.h",
    "native_theme.cc",
    "native_theme.h",
    "native_theme_base.cc",
    "native_theme_base.h",
    "native_theme_color_id.h",
    "native_theme_export.h",
    "native_theme_features.cc",
    "native_theme_features.h",
    "native_theme_observer.cc",
    "native_theme_observer.h",
    "native_theme_utils.cc",
    "native_theme_utils.h",
    "themed_vector_icon.cc",
    "themed_vector_icon.h",
  ]

  if (is_android) {
    sources += [
      "native_theme_android.cc",
      "native_theme_android.h",
    ]
  }

  if (is_mac) {
    frameworks = [
      "CoreGraphics.framework",
      "AppKit.framework",
      "MediaAccessibility.framework",
    ]
    sources += [
      "caption_style_mac.mm",
      "native_theme_mac.h",
      "native_theme_mac.mm",
    ]
  }

  if (is_win) {
    sources += [ "caption_style_win.cc" ]
  }

  if (use_aura || toolkit_views) {
    sources += [
      "native_theme_aura.cc",
      "native_theme_aura.h",
      "overlay_scrollbar_constants_aura.h",
    ]
  }

  defines = [ "NATIVE_THEME_IMPLEMENTATION" ]

  public_deps = [ "//skia" ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//build:chromeos_buildflags",
    "//cc/paint",
    "//ui/base",
    "//ui/color",

    # http://crbug.com/730719 - No !is_android to work around gn --check.
    "//ui/color:mixers",
    "//ui/display",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/resources",
  ]
}

if (is_win) {
  component("native_theme_browser") {
    defines = [ "NATIVE_THEME_IMPLEMENTATION" ]

    # These files cannot work in the renderer on Windows.
    sources = [
      "native_theme_win.cc",
      "native_theme_win.h",
    ]

    deps = [
      ":native_theme",
      "//base",
      "//cc/paint",
      "//ui/base",
      "//ui/display",
      "//ui/gfx",
    ]

    libs = [ "uxtheme.lib" ]
  }
} else {
  source_set("native_theme_browser") {
  }
}

source_set("test_support") {
  testonly = true

  deps = [
    ":native_theme",
    "//base",
  ]

  sources = [
    "test/color_utils.cc",
    "test/color_utils.h",
    "test_native_theme.cc",
    "test_native_theme.h",
  ]
}

test("native_theme_unittests") {
  use_xvfb = use_xvfb_in_this_config

  sources = [
    "native_theme_unittest.cc",
    "themed_vector_icon_unittest.cc",
  ]

  if (use_aura) {
    sources += [ "native_theme_aura_unittest.cc" ]
  }

  if (is_win) {
    sources += [
      "caption_style_win_unittest.cc",
      "native_theme_win_unittest.cc",
    ]
  }

  deps = [
    ":native_theme",
    ":native_theme_browser",
    ":test_support",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//skia",
    "//testing/gtest",
    "//ui/base",
    "//ui/gfx/geometry:geometry",
  ]

  if (is_mac) {
    sources += [ "native_theme_mac_unittest.mm" ]
    deps += [ "//ui/color" ]
  }
}
