# 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/android/config.gni")
import("//build/config/features.gni")
import("//components/safe_browsing/buildflags.gni")
import("//components/site_isolation/site_isolation.gni")
import("//components/supervised_user/buildflags.gni")
import("//pdf/features.gni")
import("//printing/buildflags/buildflags.gni")
import("//tools/grit/grit_rule.gni")
import("//ui/webui/webui_features.gni")

declare_args() {
  # Generating the credits page requires a filesystem traversal for licenses
  # that is slow in some environments.
  generate_about_credits = is_official_build
}

if (is_android) {
  import("//build/config/android/rules.gni")
}

if (is_ios) {
  import("//build/config/ios/bundle_data_from_filelist.gni")
}

about_credits_file = "$target_gen_dir/about_credits.html"

group("resources") {
  public_deps = [
    ":components_resources",
    ":components_scaled_resources",
    ":dev_ui_components_resources",
    "../autofill/core/browser/autofill_and_password_manager_internals:resources",
    "../crash/core/browser/resources:resources",
    "../gcm_driver/resources:resources",
    "../net_log/resources",
    "../signin/core/browser/resources",
    "../translate/translate_internals:resources",
    "../webui:resources",
  ]

  if (is_ios) {
    public_deps += [ "../management/resources:resources" ]
  }
}

grit("components_resources") {
  source = "components_resources.grd"

  inputs = [ about_credits_file ]

  outputs = [
    "grit/components_resources.h",
    "components_resources.pak",
  ]
  output_dir = "$root_gen_dir/components"

  use_brotli = true

  grit_flags = [
    "-E",
    "about_credits_file=" + rebase_path(about_credits_file, root_build_dir),
  ]

  defines = [
    "enable_pdf=$enable_pdf",
    "enable_printing=$enable_printing",
    "enable_print_preview=$enable_print_preview",
    "enable_supervised_users=$enable_supervised_users",
    "safe_browsing_mode=$safe_browsing_mode",
    "is_fuchsia=$is_fuchsia",
    "optimize_webui=$optimize_webui",
    "use_blink=$use_blink",
    "use_internal_isolated_origins=$use_internal_isolated_origins",
  ]

  deps = [
    ":about_credits",
    "//components/neterror/resources:bundle_js",
    "//components/security_interstitials/content/resources:build_ts",
    "//components/security_interstitials/core/browser/resources:bundle_js",
  ]

  if (enable_supervised_users) {
    deps += [ "//components/supervised_user/core/browser/resources:bundle_js" ]
  }

  if (use_blink) {
    deps += [ "//components/resources/ssl/ssl_error_assistant:make_ssl_error_assistant_protobuf" ]
  }

  if (safe_browsing_mode > 0) {
    deps += [
      "//components/safe_browsing/content/resources:make_file_types_protobuf",
    ]
  }

  if (is_android && safe_browsing_mode == 2) {
    deps += [ "//components/safe_browsing/content/resources/real_time_url_checks_allowlist:make_real_time_url_allowlist_protobuf" ]
  }
}

grit("dev_ui_components_resources") {
  source = "dev_ui_components_resources.grd"

  outputs = [
    "grit/dev_ui_components_resources.h",
    "dev_ui_components_resources.pak",
  ]

  deps = [ "//components/local_state:build" ]
  output_dir = "$root_gen_dir/components"
}

grit("components_scaled_resources") {
  source = "components_scaled_resources.grd"

  outputs = [
    "grit/components_scaled_resources.h",
    "grit/components_scaled_resources_map.cc",
    "grit/components_scaled_resources_map.h",
    "components_resources_100_percent.pak",
    "components_resources_200_percent.pak",
    "components_resources_300_percent.pak",
  ]
  output_dir = "$root_gen_dir/components"
}

if (generate_about_credits) {
  action("about_credits") {
    script = "//tools/licenses/licenses.py"
    depfile = "$target_gen_dir/$target_name.d"

    inputs = [
      "../webui/about/resources/about_credits.tmpl",
      "../webui/about/resources/about_credits_entry.tmpl",
      "../webui/about/resources/about_credits_reciprocal.tmpl",
    ]

    outputs = [ about_credits_file ]

    args = [
      "--target-os=$target_os",
      "--depfile",
      rebase_path(depfile, root_build_dir),
      "credits",
      rebase_path(about_credits_file, root_build_dir),
    ]

    # Defined by downstream projects.
    if (defined(extra_third_party_notice_dirs)) {
      args += [ "--extra-third-party-dirs=$extra_third_party_notice_dirs" ]
    }
  }
} else {
  copy("about_credits") {
    sources = [ "sample_credits.html" ]
    outputs = [ about_credits_file ]
  }
}

if (is_android) {
  source_set("android_resources") {
    sources = [
      "android/autofill_resource_id.h",
      "android/blocked_content_resource_id.h",
      "android/page_info_resource_id.h",
      "android/permissions_resource_id.h",
      "android/sms_resource_id.h",
      "android/theme_resources.h",
      "android/webxr_resource_id.h",
    ]

    public_deps = [ "//device/vr/buildflags" ]
  }
}

if (is_ios) {
  bundle_data_from_filelist("terms_resources") {
    # On iOS, the terms of service file need to be loaded from the application
    # bundle, not from a datapack. As GetTermsOfServicePath() returns path to
    # those files, they are added to the bundle resources dir.
    filelist_name = "terms_resources.filelist"
    outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
  }
}
