# 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/chromeos/ui_mode.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")
}

component("shell_dialogs") {
  sources = [
    "base_shell_dialog.cc",
    "base_shell_dialog.h",
    "select_file_dialog.cc",
    "select_file_dialog.h",
    "select_file_dialog_factory.cc",
    "select_file_dialog_factory.h",
    "select_file_policy.cc",
    "select_file_policy.h",
    "selected_file_info.cc",
    "selected_file_info.h",
    "shell_dialogs_export.h",
  ]

  if (is_linux || is_chromeos) {
    sources += [
      "shell_dialog_linux.cc",
      "shell_dialog_linux.h",
    ]
  }

  if (is_mac) {
    sources += [
      "select_file_dialog_mac.h",
      "select_file_dialog_mac.mm",
    ]
  }

  if (is_win) {
    sources += [
      "base_shell_dialog_win.cc",
      "base_shell_dialog_win.h",
      "execute_select_file_win.cc",
      "execute_select_file_win.h",
      "select_file_dialog_win.cc",
      "select_file_dialog_win.h",
    ]
  }

  defines = [ "SHELL_DIALOGS_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//base:i18n",
    "//build:chromeos_buildflags",
    "//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) {
    frameworks = [
      "CoreServices.framework",
      "Foundation.framework",
      "AppKit.framework",
    ]
    deps += [
      "//components/remote_cocoa/app_shim",
      "//components/remote_cocoa/browser",
      "//components/remote_cocoa/common:mojo",
    ]
  }

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

  # TODO(crbug.com/1052397): Rename is_chromeos_lacros.
  if (is_chromeos_lacros) {
    sources += [
      "select_file_dialog_lacros.cc",
      "select_file_dialog_lacros.h",
    ]
    deps += [
      "//chromeos/crosapi/mojom",
      "//chromeos/lacros",
      "//mojo/public/cpp/bindings",
      "//ui/platform_window",
    ]
  }
}

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

  if (is_mac) {
    sources += [ "select_file_dialog_mac_unittest.mm" ]
  }

  if (is_win) {
    sources += [
      "execute_select_file_win_unittest.cc",
      "select_file_dialog_win_unittest.cc",
    ]
  }

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

  if (is_mac) {
    deps += [ "//components/remote_cocoa/app_shim" ]
  }

  # TODO: Remove once http://crbug.com/951419 is fixed.
  if (is_android) {
    deps += [ "//ui/android:ui_java" ]
  }
}

source_set("test_support") {
  testonly = true
  sources = [
    "fake_select_file_dialog.cc",
    "fake_select_file_dialog.h",
  ]
  public_deps = [ ":shell_dialogs" ]
  deps = [ "//base" ]
}
