# 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("//build/config/ui.gni")
import("//testing/test.gni")
if (is_android) {
  import("//build/config/android/config.gni")
}
if (is_mac) {
  import("//build/config/mac/rules.gni")
}

jumbo_component("shell_dialogs") {
  sources = [
    "base_shell_dialog.cc",
    "base_shell_dialog.h",
    "base_shell_dialog_win.cc",
    "base_shell_dialog_win.h",
    "execute_select_file_win.cc",
    "execute_select_file_win.h",
    "select_file_dialog.cc",
    "select_file_dialog.h",
    "select_file_dialog_factory.cc",
    "select_file_dialog_factory.h",
    "select_file_dialog_mac.h",
    "select_file_dialog_mac.mm",
    "select_file_dialog_win.cc",
    "select_file_dialog_win.h",
    "select_file_policy.cc",
    "select_file_policy.h",
    "selected_file_info.cc",
    "selected_file_info.h",
    "shell_dialog_linux.cc",
    "shell_dialog_linux.h",
    "shell_dialogs_export.h",
  ]

  defines = [ "SHELL_DIALOGS_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//base:i18n",
    "//skia",
    "//ui/base",
    "//ui/strings",
    "//url",
  ]

  if (use_aura) {
    if (is_mac) {
      # Will be automatically filtered out on non-Mac.
      sources -= [ "select_file_dialog_mac.mm" ]
    }
    deps += [ "//ui/aura" ]
  }

  if (is_android) {
    sources += [
      "select_file_dialog_android.cc",
      "select_file_dialog_android.h",
    ]
    deps += [
      "//ui/android",
      "//ui/base:ui_base_jni_headers",
    ]
    include_dirs = [ "$root_gen_dir/ui" ]
    libs = [ "jnigraphics" ]
  }

  if (is_mac) {
    libs = [
      "CoreServices.framework",
      "Foundation.framework",
      "AppKit.framework",
    ]
  }

  if (is_fuchsia) {
    sources += [ "select_file_dialog_fuchsia.cc" ]
  }
}

if (is_mac) {
  mac_xib_bundle_data("shell_dialogs_unittests_xibs") {
    testonly = true
    sources = [
      "//chrome/app/nibs/SaveAccessoryView.xib",
    ]
  }

  mac_framework_bundle("shell_dialogs_unittests_bundle") {
    testonly = true
    framework_version = "S"
    framework_contents = [ "Resources" ]
    info_plist = "//ui/base/test/framework-Info.plist"
    deps = [
      ":shell_dialogs_unittests_xibs",
      "//ui/resources:ui_test_pak_bundle_data",
    ]
    extra_substitutions = [ "CHROMIUM_BUNDLE_ID=$target_name" ]
  }
}

test("shell_dialogs_unittests") {
  testonly = true
  sources = [
    "execute_select_file_win_unittest.cc",
    "run_all_unittests.cc",
    "select_file_dialog_mac_unittest.mm",
    "select_file_dialog_unittest.cc",
    "select_file_dialog_win_unittest.cc",
  ]

  deps = [
    ":shell_dialogs",
    "//base",
    "//base/test:test_support",
    "//testing/gtest",
    "//ui/base",
    "//ui/resources:ui_test_pak_data",
    "//ui/strings",
  ]

  if (is_mac) {
    deps += [ ":shell_dialogs_unittests_bundle" ]
  }
}
