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

# GYP version: ui/resources/ui_resources.gyp:ui_resources
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"
  use_qualified_include = true
  outputs = [
    "grit/ui_unscaled_resources.h",
    "ui_unscaled_resources.rc",
  ]
}

grit("webui_resources_grd") {
  source = "../webui/resources/webui_resources.grd"
  outputs = [
    "grit/webui_resources.h",
    "grit/webui_resources_map.cc",
    "grit/webui_resources_map.h",
    "webui_resources.pak",
  ]
}

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.
#
# GYP version: ui/resources/ui_resources.gyp:ui_test_pak
#              (copy_ui_test_pak action)
if (is_ios || is_mac) {
  group("ui_test_pak") {
    public_deps = [
      ":repack_ui_test_pak",
      ":repack_ui_test_mac_locale_pack",
    ]
  }
} 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",
    ]
  }
}

# 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.
group("ui_test_pak_data") {
  data_deps = [ ":repack_ui_test_pak" ]
}

# GYP version: ui/resources/ui_resources.gyp:ui_test_pak
repack("repack_ui_test_pak") {
  # 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 (enable_app_list) {
    deps += [ "//ui/app_list/resources" ]
    sources += [ "$root_gen_dir/ui/app_list/resources/app_list_resources_100_percent.pak" ]
  }
}

# Repack just the strings for the framework locales on Mac and iOS. This
# emulates repack_locales.py, 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",
    "//:gn_visibility",  # TODO(GYP): this shouldn't be necessary.
  ]

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