# Copyright 2015 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/c++/c++.gni") import("//build/config/chrome_build.gni") import("//build/config/python.gni") import("//build/util/lastchange.gni") import("//build/util/process_version.gni") import("//headless/headless.gni") import("//mojo/public/tools/bindings/mojom.gni") import("//pdf/features.gni") import("//printing/buildflags/buildflags.gni") import("//testing/test.gni") import("//third_party/closure_compiler/compile_js.gni") import("//third_party/inspector_protocol/inspector_protocol.gni") import("//tools/grit/grit_rule.gni") import("//tools/grit/repack.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") if (headless_use_policy) { assert(headless_use_prefs, "'headless_use_policy' requires 'headless_use_prefs'.") } # Headless defines config applied to every target below. config("headless_defines_config") { defines = [] if (headless_use_prefs) { defines += [ "HEADLESS_USE_PREFS" ] } if (headless_use_policy) { defines += [ "HEADLESS_USE_POLICY" ] } if (headless_mode_policy_supported) { defines += [ "HEADLESS_MODE_POLICY_SUPPORTED" ] } } # For code inside the build component "headless". config("inside_headless_component") { defines = [ "HEADLESS_IMPLEMENTATION" ] } group("headless_lib") { deps = [ ":headless_non_renderer" ] } repack("resource_pack_data") { sources = [ "$root_gen_dir/components/components_resources.pak", "$root_gen_dir/content/content_resources.pak", "$root_gen_dir/content/dev_ui_content_resources.pak", "$root_gen_dir/net/net_resources.pak", "$root_gen_dir/third_party/blink/public/resources/blink_resources.pak", "$root_gen_dir/third_party/blink/public/resources/blink_scaled_resources_100_percent.pak", "$root_gen_dir/ui/resources/ui_resources_100_percent.pak", "$root_gen_dir/ui/resources/webui_generated_resources.pak", ] deps = [ "//components/resources:components_resources", "//content:content_resources", "//content:dev_ui_content_resources", "//net:net_resources", "//third_party/blink/public:resources", "//third_party/blink/public:scaled_resources_100_percent", "//ui/resources", ] output = "$root_out_dir/headless_lib_data.pak" } repack("resource_pack_strings") { sources = [ "$root_gen_dir/components/strings/components_strings_en-US.pak", "$root_gen_dir/third_party/blink/public/strings/blink_strings_en-US.pak", "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak", "$root_gen_dir/ui/strings/ax_strings_en-US.pak", "$root_gen_dir/ui/strings/ui_strings_en-US.pak", ] if (is_chrome_branded) { sources += [ "${root_gen_dir}/components/strings/components_google_chrome_strings_en-US.pak" ] } else { sources += [ "${root_gen_dir}/components/strings/components_chromium_strings_en-US.pak" ] } deps = [ "//components/strings", "//third_party/blink/public/strings", "//ui/strings", ] if (!is_fuchsia) { sources += [ "$root_gen_dir/content/browser/devtools/devtools_resources.pak" ] deps += [ "//content/browser/devtools:devtools_resources" ] } output = "$root_out_dir/headless_lib_strings.pak" } action("embedded_resource_pack_data") { # TODO(altimin): Consider zipping file here, it can reduce size up to 80%. script = "lib/embed_data.py" inputs = [ "$root_out_dir/headless_lib_data.pak" ] outputs = [ "$root_gen_dir/headless/embedded_resource_pack_data.cc", "$root_gen_dir/headless/embedded_resource_pack_data.h", ] args = [ "--data_file", rebase_path("$root_out_dir/headless_lib_data.pak", root_build_dir), "--gendir", rebase_path("$root_gen_dir", root_build_dir), "--header_file", "headless/embedded_resource_pack_data.h", "--source_file", "headless/embedded_resource_pack_data.cc", "--namespace", "headless", "--variable_name", "kHeadlessResourcePackData", ] deps = [ ":resource_pack_data" ] } action("embedded_resource_pack_strings") { # TODO(altimin): Consider zipping file here, it can reduce size up to 80%. script = "lib/embed_data.py" inputs = [ "$root_out_dir/headless_lib_strings.pak" ] outputs = [ "$root_gen_dir/headless/embedded_resource_pack_strings.cc", "$root_gen_dir/headless/embedded_resource_pack_strings.h", ] args = [ "--data_file", rebase_path("$root_out_dir/headless_lib_strings.pak", root_build_dir), "--gendir", rebase_path("$root_gen_dir", root_build_dir), "--header_file", "headless/embedded_resource_pack_strings.h", "--source_file", "headless/embedded_resource_pack_strings.cc", "--namespace", "headless", "--variable_name", "kHeadlessResourcePackStrings", ] deps = [ ":resource_pack_strings" ] } devtools_domains = [ "accessibility", "animation", "browser", "cache_storage", "console", "css", "database", "debugger", "device_orientation", "dom", "dom_debugger", "dom_snapshot", "dom_storage", "emulation", "fetch", "headless_experimental", "heap_profiler", "indexeddb", "input", "inspector", "io", "layer_tree", "log", "memory", "network", "page", "performance", "profiler", "runtime", "security", "service_worker", "target", "tracing", ] generated_devtools_api_sources = [] generated_devtools_api_headers = [] foreach(domain, devtools_domains) { generated_devtools_api_headers += [ "$target_gen_dir/public/devtools/domains/" + domain + ".h", "$target_gen_dir/public/devtools/domains/types_" + domain + ".h", "$target_gen_dir/public/devtools/internal/type_conversions_" + domain + ".h", "$target_gen_dir/public/devtools/internal/" + "types_forward_declarations_" + domain + ".h", ] generated_devtools_api_sources += [ "$target_gen_dir/public/devtools/domains/" + domain + ".cc", "$target_gen_dir/public/devtools/domains/types_" + domain + ".cc", ] } action("gen_devtools_client_api") { script = "lib/browser/devtools_api/client_api_generator.py" deps = [ ":protocol_sources", "//third_party/blink/public/devtools_protocol:protocol_version", ] inputs = [ "$root_gen_dir/third_party/blink/public/devtools_protocol/protocol.json", ] outputs = generated_devtools_api_headers + generated_devtools_api_sources sources = [ "lib/browser/devtools_api/domain_cc.template", "lib/browser/devtools_api/domain_h.template", "lib/browser/devtools_api/domain_type_conversions_h.template", "lib/browser/devtools_api/domain_types_cc.template", "lib/browser/devtools_api/domain_types_forward_declarations_h.template", "lib/browser/devtools_api/domain_types_h.template", ] args = [ "--protocol", rebase_path(inputs[0], root_build_dir), "--output_dir", rebase_path(target_gen_dir, root_build_dir) + "/public", ] } inspector_protocol_generate("protocol_sources") { visibility = [ ":backend_cdp_bindings", ":gen_devtools_client_api", ] deps = [ "//third_party/blink/public/devtools_protocol:protocol_version" ] _blink_protocol_path = rebase_path( "$root_gen_dir/third_party/blink/public/devtools_protocol/protocol.json", root_build_dir) inspector_protocol_dir = "//third_party/inspector_protocol" out_dir = target_gen_dir config_file = "protocol_config.json" config_values = [ "protocol.path=$_blink_protocol_path" ] use_embedder_types = true inputs = [ "$root_gen_dir/third_party/blink/public/devtools_protocol/protocol.json", config_file, ] # These are relative to $target_gen_dir. outputs = [ "lib/browser/protocol/browser.cc", "lib/browser/protocol/browser.h", "lib/browser/protocol/headless_experimental.cc", "lib/browser/protocol/headless_experimental.h", "lib/browser/protocol/page.cc", "lib/browser/protocol/page.h", "lib/browser/protocol/target.cc", "lib/browser/protocol/target.h", "lib/browser/protocol/protocol.h", ] } static_library("backend_cdp_bindings") { deps = [ ":protocol_sources", "//base", "//third_party/inspector_protocol:crdtp", ] sources = get_target_outputs(":protocol_sources") visibility = [ ":headless_non_renderer" ] configs += [ ":headless_defines_config", ":inside_headless_component", ] } # Code needed in both processes. Only exposed through the |headless_renderer| # target and the |headless_non_renderer| component. source_set("headless_shared_sources") { visibility = [ ":headless_non_renderer", ":headless_renderer", ] defines = [] sources = [ "app/headless_shell_switches.cc", "app/headless_shell_switches.h", "lib/headless_content_client.cc", "lib/headless_content_client.h", "lib/headless_content_main_delegate.cc", "lib/headless_content_main_delegate.h", "public/headless_browser.cc", "public/headless_browser.h", "public/headless_export.h", "public/internal/headless_devtools_client_impl.h", "public/internal/message_dispatcher.h", "public/internal/value_conversions.h", "public/util/error_reporter.cc", "public/util/error_reporter.h", "public/util/user_agent.cc", "public/util/user_agent.h", ] sources += generated_devtools_api_headers + generated_devtools_api_sources if (!is_fuchsia) { sources += [ "lib/headless_crash_reporter_client.cc", "lib/headless_crash_reporter_client.h", ] } deps = [ ":gen_devtools_client_api", ":version_header", "//base:base_static", "//components/embedder_support/origin_trials", "//content/public/common", "//ui/base", "//url", ] if (!is_fuchsia) { deps += [ "//components/crash/content/browser", "//components/crash/core/app", ] } if (is_win) { deps += [ "//sandbox" ] } configs += [ ":inside_headless_component" ] configs += [ ":headless_defines_config" ] # TODO(caseq): this is only here because headless_content_main_delegate.cc is here. # Move it to the browser-specific part. if (headless_use_embedded_resources) { defines += [ "HEADLESS_USE_EMBEDDED_RESOURCES" ] deps += [ ":embedded_resource_pack_data", ":embedded_resource_pack_strings", ] sources += [ "$root_gen_dir/headless/embedded_resource_pack_data.cc", "$root_gen_dir/headless/embedded_resource_pack_data.h", "$root_gen_dir/headless/embedded_resource_pack_strings.cc", "$root_gen_dir/headless/embedded_resource_pack_strings.h", ] } } # Code that is not needed in a renderer process. component("headless_non_renderer") { sources = [ "lib/browser/headless_browser_context_impl.cc", "lib/browser/headless_browser_context_impl.h", "lib/browser/headless_browser_context_options.cc", "lib/browser/headless_browser_context_options.h", "lib/browser/headless_browser_impl.cc", "lib/browser/headless_browser_impl.h", "lib/browser/headless_browser_main_parts.cc", "lib/browser/headless_browser_main_parts.h", "lib/browser/headless_devtools.cc", "lib/browser/headless_devtools.h", "lib/browser/headless_devtools_agent_host_client.cc", "lib/browser/headless_devtools_agent_host_client.h", "lib/browser/headless_devtools_client_impl.cc", "lib/browser/headless_devtools_manager_delegate.cc", "lib/browser/headless_devtools_manager_delegate.h", "lib/browser/headless_permission_manager.cc", "lib/browser/headless_permission_manager.h", "lib/browser/headless_platform_event_source.cc", "lib/browser/headless_platform_event_source.h", "lib/browser/headless_quota_permission_context.cc", "lib/browser/headless_quota_permission_context.h", "lib/browser/headless_request_context_manager.cc", "lib/browser/headless_request_context_manager.h", "lib/browser/headless_select_file_dialog_factory.cc", "lib/browser/headless_select_file_dialog_factory.h", "lib/browser/headless_web_contents_impl.cc", "lib/browser/headless_web_contents_impl.h", "lib/browser/headless_window_tree_host.h", "lib/browser/protocol/browser_handler.cc", "lib/browser/protocol/browser_handler.h", "lib/browser/protocol/domain_handler.h", "lib/browser/protocol/headless_devtools_session.cc", "lib/browser/protocol/headless_devtools_session.h", "lib/browser/protocol/headless_handler.cc", "lib/browser/protocol/headless_handler.h", "lib/browser/protocol/page_handler.cc", "lib/browser/protocol/page_handler.h", "lib/browser/protocol/target_handler.cc", "lib/browser/protocol/target_handler.h", "public/headless_browser_context.h", "public/headless_devtools_channel.h", "public/headless_devtools_client.h", "public/headless_devtools_target.h", "public/headless_web_contents.h", ] if (is_mac) { sources += [ "lib/browser/headless_browser_impl_mac.mm", "lib/browser/headless_browser_main_parts_mac.mm", "lib/browser/headless_shell_application_mac.h", "lib/browser/headless_shell_application_mac.mm", ] } if (is_linux || is_chromeos || is_tizen) { sources += [ "lib/browser/headless_browser_main_parts_linux.cc" ] } if (headless_use_policy) { sources += [ "lib/browser/headless_pref_names.cc", "lib/browser/headless_pref_names.h", "lib/browser/policy/headless_browser_policy_connector.cc", "lib/browser/policy/headless_browser_policy_connector.h", "lib/browser/policy/headless_mode_policy.cc", "lib/browser/policy/headless_mode_policy.h", "lib/browser/policy/headless_policies.cc", "lib/browser/policy/headless_policies.h", ] } if (use_aura) { sources += [ "lib/browser/headless_browser_impl_aura.cc", "lib/browser/headless_clipboard.cc", "lib/browser/headless_clipboard.h", "lib/browser/headless_focus_client.cc", "lib/browser/headless_focus_client.h", "lib/browser/headless_screen.cc", "lib/browser/headless_screen.h", "lib/browser/headless_window_parenting_client.cc", "lib/browser/headless_window_parenting_client.h", "lib/browser/headless_window_tree_host.cc", ] } public_deps = [ ":headless_shared_sources", "//base", "//net", ] data_deps = [] data = [] defines = [] if (enable_basic_printing) { public_deps += [ "//skia" ] } deps = [ ":backend_cdp_bindings", ":version_header", "//base:base_static", "//build:branding_buildflags", "//build:chromeos_buildflags", "//components/cookie_config", "//components/embedder_support", "//components/keyed_service/content", "//components/os_crypt:os_crypt", "//components/policy:generated", "//components/policy/core/browser", "//components/policy/core/common:common_constants", "//components/pref_registry", "//components/prefs", "//components/profile_metrics", "//components/security_state/core", "//content/public/app", "//content/public/browser", "//content/public/common", "//printing/buildflags", "//services/cert_verifier/public/mojom", "//services/device/public/cpp/geolocation", "//services/service_manager/public/cpp", "//third_party/inspector_protocol:crdtp", "//ui/base", "//ui/base/clipboard", "//ui/compositor", "//ui/display", "//ui/events/devices", "//ui/gfx", "//ui/shell_dialogs", "//url", ] if (enable_basic_printing) { deps += [ "//components/printing/browser", "//components/printing/browser/headless", "//components/printing/browser/print_to_pdf:print_to_pdf", "//components/printing/common:mojo_interfaces", "//printing", "//printing/mojom", ] } if (headless_use_prefs) { deps += [ "//components/origin_trials:browser", "//components/origin_trials:common", "//components/user_prefs", "//third_party/blink/public/common", ] } if (is_component_build) { sources += [ "lib/browser/headless_content_browser_client.cc", "lib/browser/headless_content_browser_client.h", "lib/renderer/headless_content_renderer_client.cc", "lib/renderer/headless_content_renderer_client.h", "lib/utility/headless_content_utility_client.cc", "lib/utility/headless_content_utility_client.h", ] if (is_mac) { sources += [ "lib/headless_content_main_delegate_mac.mm" ] } if (enable_basic_printing) { sources += [ "lib/renderer/headless_print_render_frame_helper_delegate.cc", "lib/renderer/headless_print_render_frame_helper_delegate.h", ] } deps += [ "//components/crash/core/common", "//components/security_state/content", "//gin", "//third_party/blink/public:blink", "//ui/gl", "//v8", ] if (!is_fuchsia) { deps += [ "//components/crash/content/browser", "//components/crash/core/app", ] } if (enable_basic_printing) { deps += [ "//components/printing/browser", "//components/printing/renderer", "//components/services/print_compositor", "//components/services/print_compositor/public/mojom", ] } if (headless_use_prefs) { deps += [ "//components/os_crypt" ] } if (headless_use_policy) { deps += [ "//components/policy/content" ] } } if (is_linux || is_chromeos) { data_deps += [ "//components/crash/core/app:chrome_crashpad_handler" ] } # Normally set to false (see build/args/headless.gn), but we can optionally # use external v8 startup data too. if ((!is_win || is_component_build) && v8_use_external_startup_data) { public_deps += [ "//v8" ] if (use_v8_context_snapshot) { data += [ "$root_out_dir/$v8_context_snapshot_filename" ] data_deps += [ "//tools/v8_context_snapshot" ] } else { data += [ "$root_out_dir/snapshot_blob.bin" ] } } if (is_mac) { deps += [ ":mac_helpers" ] frameworks = [ "AppKit.framework", "CoreFoundation.framework", ] } else { deps += [ "//ui/aura" ] } if (headless_use_embedded_resources) { defines += [ "HEADLESS_USE_EMBEDDED_RESOURCES" ] deps += [ ":embedded_resource_pack_data", ":embedded_resource_pack_strings", ] sources += [ "$root_gen_dir/headless/embedded_resource_pack_data.cc", "$root_gen_dir/headless/embedded_resource_pack_data.h", "$root_gen_dir/headless/embedded_resource_pack_strings.cc", "$root_gen_dir/headless/embedded_resource_pack_strings.h", ] } else { deps += [ ":resource_pack_data", ":resource_pack_strings", ] } if (use_ozone) { deps += [ "//ui/ozone" ] } if (use_dbus) { defines += [ "USE_DBUS" ] deps += [ "//device/bluetooth" ] } configs += [ ":inside_headless_component" ] configs += [ ":headless_defines_config" ] } # Headless renderer is a convenience library for non component builds that # includes headless classes that depend on the renderer. if (!is_component_build) { static_library("headless_renderer") { defines = [] sources = [ "lib/browser/headless_web_contents_impl.cc", "lib/browser/headless_web_contents_impl.h", "lib/renderer/headless_content_renderer_client.cc", "lib/renderer/headless_content_renderer_client.h", "lib/utility/headless_content_utility_client.cc", "lib/utility/headless_content_utility_client.h", ] if (is_mac) { sources += [ "lib/headless_content_main_delegate_mac.mm" ] } if (enable_basic_printing) { sources += [ "lib/renderer/headless_print_render_frame_helper_delegate.cc", "lib/renderer/headless_print_render_frame_helper_delegate.h", ] } public_deps = [ ":headless_shared_sources" ] deps = [ "//build:chromeos_buildflags", "//components/crash/core/common", "//components/security_state/content", "//components/security_state/core", "//content/public/app", "//content/public/browser", "//content/public/common", "//content/public/renderer", "//content/public/utility", "//printing/buildflags", "//third_party/blink/public:blink_headers", "//ui/base", "//ui/compositor", "//v8", ] if (use_ozone) { deps += [ "//ui/ozone" ] } if (enable_basic_printing) { deps += [ "//components/printing/browser/headless:headless", "//components/printing/renderer", "//components/services/print_compositor", "//components/services/print_compositor/public/mojom", ] } configs += [ ":headless_defines_config" ] if (is_mac || is_win || is_linux || is_chromeos) { deps += [ "//components/crash/core/app" ] } } } else { # For component builds all dependencies are already included in the headless # component. group("headless_renderer") { public_deps = [ ":headless_non_renderer" ] } } group("headless_tests") { testonly = true deps = [ ":headless_browsertests", ":headless_example", ":headless_unittests", ] } test("headless_unittests") { sources = [ "public/domains/types_unittest.cc", "public/util/error_reporter_unittest.cc", # Headers for code under test that aren't normally exposed. "public/headless_export.h", "public/util/error_reporter.h", ] # Headers for generated API code under test. sources += generated_devtools_api_headers defines = [] deps = [ ":gen_devtools_client_api", ":headless_non_renderer", ":headless_shell_lib", "//base/test:run_all_unittests", "//base/test:test_support", "//components/security_state/content", "//content/public/app", "//content/public/child:child", "//content/public/common", "//testing/gmock", "//testing/gtest", ] if (is_win) { deps += [ "//components/crash/core/app:crash_export_thunks" ] } if (enable_basic_printing) { deps += [ "//components/printing/browser", "//components/printing/browser/headless", "//printing", "//printing/buildflags", "//third_party/blink/public:blink", ] } configs += [ ":headless_defines_config" ] } if (is_mac) { copy("mac_helpers") { sources = [ "$root_out_dir/chrome_crashpad_handler" ] deps = [ "//components/crash/core/app:chrome_crashpad_handler" ] outputs = [ "$root_out_dir/Helpers/{{source_file_part}}" ] } } test("headless_browsertests") { configs += [ "//net:net_test_config", "//tools/v8_context_snapshot:use_v8_context_snapshot", "//v8:external_startup_data", ] sources = [ "test/headless_browser_browsertest.cc", "test/headless_browser_context_browsertest.cc", "test/headless_browser_test.cc", "test/headless_browser_test.h", "test/headless_client_browsertest.cc", "test/headless_devtools_client_browsertest.cc", "test/headless_origin_trials_browsertest.cc", "test/headless_test_launcher.cc", "test/headless_web_contents_browsertest.cc", "test/test_network_interceptor.cc", "test/test_network_interceptor.h", ] if (enable_basic_printing && enable_pdf) { sources += [ "test/headless_printtopdf_browsertest.cc" ] } if (headless_use_policy) { sources += [ "test/headless_policy_browsertest.cc", "test/headless_policy_browsertest.h", ] } # TODO(crbug.com/1318548): Enable on Fuchsia when no longer flakily timeout. if (!is_fuchsia) { sources += [ "test/headless_compositor_browsertest.cc", "test/headless_protocol_browsertest.cc", "test/headless_protocol_browsertest.h", ] } data = [ "test/data/", "test/dom_tree_extraction_expected_nodes.txt", "test/dom_tree_extraction_expected_styles.txt", "$root_out_dir/headless_lib_data.pak", "$root_out_dir/headless_lib_strings.pak", "//net/tools/testserver/", "//third_party/blink/web_tests/http/tests/inspector-protocol/", "//third_party/pywebsocket3/", ] data_deps = [] if (is_fuchsia) { # TODO(https://crbug.com/1185811): Investigate removing the requirement for # job_policy_ambient_mark_vmo_exec for the sake of V8's allocator in tests. test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml" additional_manifest_fragments = [ "//build/config/fuchsia/test/fonts.shard.test-cml", "//build/config/fuchsia/test/mark_vmo_executable.shard.test-cml", "//build/config/fuchsia/test/network.shard.test-cml", "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml", ] } if (is_mac) { data_deps += [ ":mac_helpers" ] } defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] deps = [ ":headless_shell_lib", "//base", "//cc:test_support", "//components/policy/core/browser", "//components/security_state/content", "//content/test:browsertest_support", "//content/test:test_support", "//gin", "//net:test_support", "//pdf:buildflags", "//printing/buildflags", "//services/device/public/cpp:test_support", "//services/network/public/mojom", "//testing/gmock", "//testing/gtest", "//ui/base/clipboard", "//ui/shell_dialogs", ] if (is_mac) { deps += [ "//services/device/public/cpp:test_support" ] } if (!is_fuchsia) { deps += [ "//third_party/crashpad/crashpad/client" ] } if (enable_basic_printing) { deps += [ "//components/printing/browser", "//printing", ] if (enable_pdf) { deps += [ "//pdf" ] } } if (headless_use_policy) { deps += [ "//components/policy/core/common:test_support" ] } configs += [ ":headless_defines_config" ] } if (is_win) { # Headless library with only browser dependencies. This is used when no child # dependencies are needed in the target (e.g. chrome:main_dll). static_library("headless_shell_browser_lib") { sources = [ "app/headless_shell.cc", "app/headless_shell.h", "app/headless_shell_switches.h", "lib/browser/headless_content_browser_client.cc", "lib/browser/headless_content_browser_client.h", "public/headless_shell.h", ] deps = [ ":headless_non_renderer", "//build:branding_buildflags", "//components/crash/core/app:app", "//components/crash/core/app:run_as_crashpad_handler", "//components/embedder_support", "//content:sandbox_helper_win", "//content/public/app", "//content/public/browser", "//content/public/common", "//net", "//printing/buildflags", "//sandbox", ] if (headless_use_policy) { deps += [ "//components/policy/content" ] } if (enable_basic_printing) { deps += [ "//components/printing/browser/headless:headless" ] } configs += [ ":headless_defines_config" ] } } # Headless library with all included dependencies. Use this library unless you # have browser/child dependencies restrictions. static_library("headless_shell_lib") { sources = [ "app/headless_shell.cc", "app/headless_shell.h", "app/headless_shell_switches.h", "public/headless_shell.h", ] defines = [] if (!is_component_build) { sources += [ "lib/browser/headless_content_browser_client.cc", "lib/browser/headless_content_browser_client.h", "lib/utility/headless_content_utility_client.cc", "lib/utility/headless_content_utility_client.h", ] } deps = [ "//build:branding_buildflags", "//components/embedder_support", "//components/policy/content", "//components/security_state/content", "//content", "//content/public/app", "//content/public/browser", "//content/public/child:child", "//content/public/common", "//content/public/utility", "//printing/buildflags", ] public_deps = [ ":headless_renderer", "//base", "//third_party/inspector_protocol:crdtp", ] if (!is_component_build) { public_deps += [ ":headless_non_renderer" ] } if (!is_fuchsia) { deps += [ "//components/crash/content/browser" ] } if (enable_basic_printing) { deps += [ "//components/printing/browser", "//components/printing/browser/headless:headless", "//components/printing/renderer", "//components/services/print_compositor", "//components/services/print_compositor/public/mojom", ] } if (headless_use_policy && !is_component_build) { deps += [ "//components/policy/content" ] } if (is_win) { defines = [ "HEADLESS_USE_CRASHPAD" ] deps += [ "//components/crash/core/app:run_as_crashpad_handler", "//content:sandbox_helper_win", "//sandbox", ] } if (is_mac) { deps += [ "//components/os_crypt" ] } if (is_win || (is_posix && !is_mac)) { deps += [ "//components/crash/core/app" ] } configs += [ ":headless_defines_config" ] } executable("headless_shell") { configs -= [ "//build/config/compiler:thinlto_optimize_default" ] configs += [ "//build/config/compiler:thinlto_optimize_max" ] sources = [ "app/headless_shell_main.cc" ] defines = [] deps = [ ":headless_shell_lib" ] if (!headless_use_embedded_resources) { data = [ "$root_out_dir/headless_lib_data.pak", "$root_out_dir/headless_lib_strings.pak", ] } if (is_win) { deps += [ "//build/win:default_exe_manifest", "//content/public/app", ] } if (is_mac) { deps += [ "//sandbox/mac:seatbelt" ] } configs += [ ":headless_defines_config" ] } process_version("version_header") { template_file = "public/version.h.in" sources = [ "//chrome/VERSION", lastchange_file, ] output = "$target_gen_dir/public/version.h" } executable("headless_example") { sources = [ "app/headless_example.cc" ] defines = [] deps = [ ":headless_shell_lib", "//content", "//sandbox", "//skia", # we need this to override font render hinting in headless build "//ui/gfx/geometry", ] if (is_win) { deps += [ "//content/public/app" ] } configs += [ ":headless_defines_config" ] }