# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/chrome_build.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//extensions/buildflags/buildflags.gni")
import("//tools/grit/repack.gni")

assert(!is_ios, "Chromium/iOS shouldn't use anything in //chrome")

# Wraps repack_locales(), setting the source_patterns and deps required for
# Chrome.
#
# Extra Parameters:
#
#   additional_source_patterns [optional]
#      Extra source_patterns for repack_locales().
template("chrome_repack_locales") {
  repack_locales(target_name) {
    forward_variables_from(invoker, "*", [ "additional_source_patterns" ])

    # Each input pak file should also have a deps line.
    source_patterns = [
      "${root_gen_dir}/chrome/generated_resources_",
      "${root_gen_dir}/chrome/locale_settings_",
      "${root_gen_dir}/chrome/platform_locale_settings_",
      "${root_gen_dir}/components/omnibox/resources/omnibox_pedal_synonyms_",
      "${root_gen_dir}/components/strings/components_locale_settings_",
      "${root_gen_dir}/components/strings/components_strings_",
      "${root_gen_dir}/third_party/blink/public/strings/blink_accessibility_strings_",
      "${root_gen_dir}/third_party/blink/public/strings/blink_strings_",
      "${root_gen_dir}/device/bluetooth/strings/bluetooth_strings_",
      "${root_gen_dir}/device/fido/strings/fido_strings_",
      "${root_gen_dir}/services/strings/services_strings_",
      "${root_gen_dir}/third_party/libaddressinput/address_input_strings_",
      "${root_gen_dir}/ui/strings/app_locale_settings_",
      "${root_gen_dir}/ui/strings/ax_strings_",
      "${root_gen_dir}/ui/strings/ui_strings_",
    ]
    if (!defined(deps)) {
      deps = []
    }
    deps += [
      "//chrome/app:branded_strings",
      "//chrome/app:generated_resources",
      "//chrome/app/resources:locale_settings",
      "//chrome/app/resources:platform_locale_settings",
      "//components/omnibox/resources:omnibox_pedal_synonyms",
      "//components/strings:components_branded_strings",
      "//components/strings:components_locale_settings",
      "//components/strings:components_strings",
      "//device/bluetooth/strings",
      "//device/fido/strings",
      "//services/strings",
      "//third_party/blink/public/strings",
      "//third_party/blink/public/strings:accessibility_strings",
      "//third_party/libaddressinput:strings",
      "//ui/strings:app_locale_settings",
      "//ui/strings:ax_strings",
      "//ui/strings:ui_strings",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    if (is_chromeos) {
      source_patterns +=
          [ "${root_gen_dir}/ui/chromeos/strings/ui_chromeos_strings_" ]
      deps += [ "//ui/chromeos/strings" ]
    }
    if (is_chromeos_ash) {
      source_patterns += [
        "${root_gen_dir}/ash/shortcut_viewer/strings/shortcut_viewer_strings_",
        "${root_gen_dir}/ash/strings/ash_strings_",
        "${root_gen_dir}/ash/webui/camera_app_ui/resources/strings/ash_camera_app_strings_",
        "${root_gen_dir}/chromeos/strings/chromeos_strings_",
        "${root_gen_dir}/remoting/resources/",
      ]
      deps += [
        "//ash/shortcut_viewer/strings",
        "//ash/strings",
        "//ash/webui/camera_app_ui/resources/strings",
        "//chromeos/strings",
        "//remoting/resources",
      ]
      compress = true
    }
    if (is_chromeos_lacros) {
      source_patterns +=
          [ "${root_gen_dir}/chromeos/strings/chromeos_strings_" ]
      deps += [ "//chromeos/strings" ]
    }
    if (!is_android) {
      source_patterns += [ "${root_gen_dir}/components/strings/search_engine_descriptions_strings_" ]
      deps += [ "//components/strings:search_engine_descriptions_strings" ]
    }
    if (enable_extensions) {
      source_patterns +=
          [ "${root_gen_dir}/extensions/strings/extensions_strings_" ]
      deps += [ "//extensions/strings" ]
    }

    # src-internal strings only available on Chrome branded builds.
    if (is_chrome_branded) {
      source_patterns += [ "${root_gen_dir}/chrome/browser/nearby_sharing/internal/resources/nearby_share_internal_strings_" ]
      deps += [ "//chrome/browser/nearby_sharing/internal/resources:nearby_share_internal_strings" ]
    }

    source_patterns += [
      "${root_gen_dir}/chrome/${branding_path_product}_strings_",
      "${root_gen_dir}/components/strings/components_${branding_path_product}_strings_",
    ]

    if (defined(invoker.additional_source_patterns)) {
      source_patterns += invoker.additional_source_patterns
    }
  }
}
