# 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("//tools/grit/grit_rule.gni")
import("//tools/grit/repack.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") {
  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),
  ]
  deps = [
    "//mojo/public/js:new_bindings",
  ]
}

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/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 = [
    "//ui/resources",
    "//ui/strings",
  ]

  if (!is_ios) {
    deps += [ "//third_party/WebKit/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/blink/public/resources/blink_resources.pak",
      "$root_gen_dir/ui/views/resources/views_resources_100_percent.pak",
    ]
  }

  if (use_aura && toolkit_views) {
    deps += [ "//ui/app_list/resources" ]
    sources += [ "$root_gen_dir/ui/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",
  ]
}
