# 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("//tools/grit/grit_rule.gni")
import("//tools/grit/repack.gni")
import("//ui/webui/webui_features.gni")

group("resources") {
  public_deps = [
    ":ui_resources_grd",
    ":ui_unscaled_resources_grd",
    ":webui_resources_grd",
  ]
}

grit("ui_resources_grd") {
  source = "ui_resources.grd"
  outputs = [
    "grit/ui_resources.h",
    "grit/ui_resources_map.cc",
    "grit/ui_resources_map.h",
    "ui_resources_100_percent.pak",
    "ui_resources_200_percent.pak",
    "ui_resources_300_percent.pak",
  ]
}

grit("ui_unscaled_resources_grd") {
  source = "ui_unscaled_resources.grd"
  outputs = [
    "grit/ui_unscaled_resources.h",
    "ui_unscaled_resources.rc",
  ]
}

grit("webui_resources_grd") {
  defines = [ "optimize_webui=$optimize_webui" ]
  source = "../webui/resources/webui_resources.grd"

  # The .grd contains references to generated files.
  source_is_generated = true

  outputs = [
    "grit/webui_resources.h",
    "grit/webui_resources_map.cc",
    "grit/webui_resources_map.h",
    "webui_resources.pak",
  ]
  grit_flags = [
    "-E",
    "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
  ]
}

if (!is_mac) {
  copy("copy_ui_resources_100_percent") {
    sources = [
      "$root_gen_dir/ui/resources/ui_resources_100_percent.pak",
    ]
    outputs = [
      "$root_out_dir/ui_resources_100_percent.pak",
    ]
    deps = [
      "//ui/resources",
    ]
  }
}

# On iOS and Mac the string resources need to go into a locale subfolder, which
# introduces an extra dependency.
if (is_ios || is_mac) {
  group("ui_test_pak") {
    public_deps = [
      ":repack_ui_test_mac_locale_pack",
      ":repack_ui_test_pak_100_percent",
    ]
  }

  # This needs to be a separate target from ui_test_pak as ui_base_unittests
  # wants the generate .pak file in the bundle to be named en.lpro/locale.pak
  # while components_unittests wants it to be named ui_test.pak.
  bundle_data("ui_test_pak_bundle_data_locale") {
    testonly = true
    visibility = [ ":ui_test_pak_bundle_data" ]
    public_deps = [
      ":ui_test_pak",
    ]
    sources = [
      "$root_out_dir/ui_test.pak",
    ]
    outputs = [
      "{{bundle_resources_dir}}/en.lproj/locale.pak",
    ]
  }

  bundle_data("ui_test_pak_bundle_data_test_pak") {
    testonly = true
    visibility = [ ":ui_test_pak_bundle_data" ]
    public_deps = [
      ":ui_test_pak",
    ]
    sources = [
      "$root_out_dir/ui_test.pak",
    ]
    outputs = [
      "{{bundle_resources_dir}}/ui_test.pak",
    ]
  }

  bundle_data("ui_test_pak_bundle_data_100_percent") {
    testonly = true
    visibility = [ ":ui_test_pak_bundle_data" ]
    public_deps = [
      ":ui_test_pak",
    ]
    sources = [
      "$root_out_dir/ui_test.pak",
    ]
    outputs = [
      "{{bundle_resources_dir}}/chrome_100_percent.pak",
    ]
  }

  group("ui_test_pak_bundle_data") {
    testonly = true
    public_deps = [
      ":ui_test_pak_bundle_data_100_percent",
      ":ui_test_pak_bundle_data_locale",
      ":ui_test_pak_bundle_data_test_pak",
    ]
  }
} else {
  copy("ui_test_pak") {
    sources = [
      "$root_out_dir/ui_test.pak",
    ]
    outputs = [
      "$root_out_dir/ui/en-US.pak",
    ]
    public_deps = [
      ":repack_ui_test_pak_100_percent",
    ]
  }
}

# This group exists just for targets that need the data file to exist in the
# build directory so it can be loaded for test purposes. If a target requires
# 200 percent resources it should also depend on ui_test_pak_data_200_percent.
group("ui_test_pak_data") {
  data_deps = [
    ":repack_ui_test_pak_100_percent",
  ]
}

group("ui_test_pak_data_200_percent") {
  data_deps = [
    ":repack_ui_test_pak_200_percent",
  ]
}

repack("repack_ui_test_pak_100_percent") {
  # Depend on ui_test_pak or ui_test_pak_data instead of this one.
  visibility = [
    ":ui_test_pak",
    ":ui_test_pak_data",
  ]

  sources = [
    "$root_gen_dir/mojo/public/js/mojo_bindings_resources.pak",
    "$root_gen_dir/ui/resources/ui_resources_100_percent.pak",
    "$root_gen_dir/ui/resources/webui_resources.pak",
    "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak",
    "$root_gen_dir/ui/strings/ui_strings_en-US.pak",
  ]

  if (is_chromeos) {
    sources += [
      "$root_gen_dir/ui/chromeos/resources/ui_chromeos_resources_100_percent.pak",
      "$root_gen_dir/ui/chromeos/strings/ui_chromeos_strings_en-US.pak",
    ]
  }

  output = "$root_out_dir/ui_test.pak"

  deps = [
    "//mojo/public/js:resources",
    "//ui/resources",
    "//ui/strings",
  ]

  if (!is_ios) {
    deps += [ "//third_party/blink/public:resources_grit" ]
  }

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

  if (is_chromeos) {
    deps += [
      "//ui/chromeos/resources",
      "//ui/chromeos/strings",
    ]
  }

  if (toolkit_views) {
    deps += [ "//ui/views/resources" ]
    sources += [
      "$root_gen_dir/third_party/blink/public/resources/blink_resources.pak",
      "$root_gen_dir/ui/views/resources/views_resources_100_percent.pak",
    ]
  }

  if (use_aura && toolkit_views) {
    deps += [ "//ash/app_list/resources" ]
    sources += [
      "$root_gen_dir/ash/app_list/resources/app_list_resources_100_percent.pak",
    ]
  }
}

repack("repack_ui_test_pak_200_percent") {
  visibility = [ ":ui_test_pak_data_200_percent" ]

  sources = [
    "$root_gen_dir/ui/resources/ui_resources_200_percent.pak",
  ]

  output = "$root_out_dir/ui_test_200_percent.pak"

  deps = [
    "//ui/resources",
  ]

  if (toolkit_views) {
    deps += [ "//ui/views/resources" ]
    sources +=
        [ "$root_gen_dir/ui/views/resources/views_resources_200_percent.pak" ]
  }
}

# Repack just the strings for the framework locales on Mac and iOS. This
# emulates repack_locales(), but just for en-US. Note ui_test.pak is not simply
# copied, because it causes leaks from allocations within system libraries when
# trying to load non-string resources. http://crbug.com/413034.
repack("repack_ui_test_mac_locale_pack") {
  visibility = [ ":ui_test_pak" ]

  sources = [
    "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak",
    "$root_gen_dir/ui/strings/ui_strings_en-US.pak",
  ]

  output = "$root_out_dir/ui/en.lproj/locale.pak"

  deps = [
    "//ui/strings",
  ]
}
