| # Copyright 2022 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("//chrome/common/features.gni") |
| import("//tools/grit/preprocess_if_expr.gni") |
| import("//tools/typescript/webui_ts_library.gni") |
| import("//ui/webui/resources/tools/eslint_ts.gni") |
| import("//ui/webui/resources/tools/generate_grd.gni") |
| |
| template("build_webui_tests") { |
| not_needed([ "target_name" ]) |
| |
| forward_variables_from(invoker, [ "files" ]) |
| |
| preprocess_dir = "${target_gen_dir}/preprocessed" |
| tsc_dir = "${target_gen_dir}/tsc" |
| |
| # Generated Mojo TS files. |
| if (defined(invoker.mojo_files)) { |
| assert(defined(invoker.mojo_files_deps)) |
| mojo_files = [] |
| foreach(mojo_file, invoker.mojo_files) { |
| mojo_files += [ get_path_info(invoker.mojo_files, "file") ] |
| } |
| } |
| |
| if (defined(invoker.static_files)) { |
| static_files_filter = [ |
| "*.html", |
| "*.json", |
| ] |
| static_files = filter_include(invoker.static_files, static_files_filter) |
| assert(static_files == invoker.static_files, |
| "Static files must be .html,.json files") |
| preprocess_if_expr("preprocess_static_files") { |
| visibility = [ ":build_grdp" ] |
| defines = chrome_grit_defines |
| in_folder = "." |
| out_folder = preprocess_dir |
| in_files = static_files |
| out_manifest = "${target_gen_dir}/preprocess_static_files_manifest.json" |
| } |
| } |
| |
| preprocess_if_expr("preprocess") { |
| visibility = [ |
| ":build_ts", |
| ":lint", |
| ] |
| defines = chrome_grit_defines |
| in_folder = "." |
| out_folder = preprocess_dir |
| in_files = files |
| } |
| |
| if (defined(invoker.mojo_files_deps)) { |
| copy("copy_mojo") { |
| visibility = [ ":build_ts" ] |
| deps = invoker.mojo_files_deps |
| sources = invoker.mojo_files |
| outputs = [ "${preprocess_dir}/{{source_file_part}}" ] |
| } |
| } |
| |
| webui_ts_library("build_ts") { |
| composite = false |
| if (defined(invoker.ts_composite)) { |
| composite = invoker.ts_composite |
| } |
| if (!composite) { |
| visibility = [ |
| ":build_grdp", |
| ":lint", |
| ] |
| } |
| root_dir = preprocess_dir |
| out_dir = tsc_dir |
| |
| # Default tsconfig is set to |
| # //chrome/test/data/webui/tsconfig_base_lit.json for targets |
| # with a Lit dependency, and //chrome/test/data/webui/tsconfig_base.json |
| # for other targets. |
| tsconfig_base = "//chrome/test/data/webui/tsconfig_base.json" |
| if (defined(invoker.ts_tsconfig_base)) { |
| tsconfig_base = invoker.ts_tsconfig_base |
| } else if (defined(invoker.ts_deps)) { |
| has_lit = filter_include(invoker.ts_deps, |
| [ "//third_party/lit/v3_0:build_ts" ]) != [] |
| if (has_lit) { |
| tsconfig_base = "//chrome/test/data/webui/tsconfig_base_lit.json" |
| } |
| } |
| |
| path_mappings = [] |
| |
| # Add invoker provided path_mappings before the default one, because the |
| # order matters. |
| if (defined(invoker.ts_path_mappings)) { |
| path_mappings += invoker.ts_path_mappings |
| } |
| if (defined(invoker.is_chrome_untrusted) && invoker.is_chrome_untrusted) { |
| path_mappings += [ "chrome-untrusted://webui-test/*|" + rebase_path( |
| "$root_gen_dir/chrome/test/data/webui/tsc/*", |
| target_gen_dir) ] |
| webui_context_type = "untrusted" |
| } else { |
| path_mappings += [ "chrome://webui-test/*|" + rebase_path( |
| "$root_gen_dir/chrome/test/data/webui/tsc/*", |
| target_gen_dir) ] |
| webui_context_type = "trusted" |
| } |
| in_files = files |
| |
| if (defined(invoker.ts_definitions)) { |
| definitions = invoker.ts_definitions |
| } |
| deps = [ "//chrome/test/data/webui:build_ts" ] |
| if (defined(invoker.ts_deps)) { |
| deps += invoker.ts_deps |
| } |
| extra_deps = [ ":preprocess" ] |
| |
| if (defined(invoker.mojo_files)) { |
| target_outputs = get_target_outputs(":copy_mojo") |
| |
| # Add all Mojo JS files produced by `:copy_mojo` as inputs to the TS |
| # compiler. |
| foreach(o, target_outputs) { |
| in_files += [ rebase_path(o, preprocess_dir) ] |
| } |
| extra_deps += [ ":copy_mojo" ] |
| } |
| if (defined(invoker.ts_extra_deps)) { |
| extra_deps += invoker.ts_extra_deps |
| } |
| } |
| |
| enable_type_aware_eslint_checks = |
| !defined(invoker.enable_type_aware_eslint_checks) || |
| invoker.enable_type_aware_eslint_checks |
| |
| if (enable_type_aware_eslint_checks) { |
| eslint_ts("lint") { |
| in_folder = preprocess_dir |
| in_files = filter_exclude(files, [ "*.js" ]) |
| tsconfig = "$target_gen_dir/tsconfig_build_ts.json" |
| deps = [ |
| ":build_ts", |
| ":preprocess", |
| ] |
| } |
| } |
| |
| # This target is public so that it can be depended on by |
| # chrome/test/data/webui:build_grd which will place this grdp file into a grd |
| # file. |
| generate_grd("build_grdp") { |
| resource_path_prefix = rebase_path(".", "//chrome/test/data/webui") |
| if (defined(invoker.resource_path_prefix)) { |
| resource_path_prefix = invoker.resource_path_prefix |
| } |
| grd_prefix = "webui_" + string_replace(resource_path_prefix, "/", "_") |
| out_grd = "$target_gen_dir/resources.grdp" |
| deps = [ ":build_ts" ] |
| manifest_files = |
| filter_include(get_target_outputs(":build_ts"), [ "*_manifest.json" ]) |
| if (defined(invoker.static_files)) { |
| deps += [ ":preprocess_static_files" ] |
| manifest_files += |
| [ "${target_gen_dir}/preprocess_static_files_manifest.json" ] |
| } |
| |
| if (enable_type_aware_eslint_checks) { |
| # Adding as a dependency so that it runs as part of the build, even though |
| # this `generate_grd()` target does not use any outputs from it. |
| deps += [ ":lint" ] |
| } |
| } |
| } |