# 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")
}

# Reset sources_assignment_filter for the BUILD.gn file to prevent
# regression during the migration of Chromium away from the feature.
# See docs/no_sources_assignment_filter.md for more information.
# TODO(crbug.com/1018739): remove this when migration is done.
set_sources_assignment_filter([])

jumbo_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) {
    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",
    "//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",
    ]
    deps += [
      "//components/remote_cocoa/app_shim",
      "//components/remote_cocoa/browser",
      "//components/remote_cocoa/common:mojo",
    ]
  }

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

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" ]
}
