# Copyright 2015 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("//build/config/chrome_build.gni")
import("//build/util/process_version.gni")
import("//headless/headless.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//printing/features/features.gni")
import("//testing/test.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
import("//tools/grit/repack.gni")

config("headless_implementation") {
  defines = [ "HEADLESS_IMPLEMENTATION" ]

  if (headless_use_embedded_resources) {
    defines += [ "HEADLESS_USE_EMBEDDED_RESOURCES" ]
  }
}

group("headless_lib") {
  deps = [
    ":headless",
  ]
}

repack("pak") {
  sources = [
    "$root_gen_dir/blink/public/resources/blink_image_resources_100_percent.pak",
    "$root_gen_dir/blink/public/resources/blink_resources.pak",
    "$root_gen_dir/components/components_resources.pak",
    "$root_gen_dir/components/strings/components_strings_en-US.pak",
    "$root_gen_dir/content/app/resources/content_resources_100_percent.pak",
    "$root_gen_dir/content/app/strings/content_strings_en-US.pak",
    "$root_gen_dir/content/browser/devtools/devtools_resources.pak",
    "$root_gen_dir/content/browser/tracing/tracing_resources.pak",
    "$root_gen_dir/content/content_resources.pak",
    "$root_gen_dir/headless/headless_lib_resources.pak",
    "$root_gen_dir/net/net_resources.pak",
    "$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_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 = [
    ":resources",
    "//components/resources:components_resources",
    "//components/strings",
    "//content:resources",
    "//content/app/resources",
    "//content/app/strings",
    "//content/browser/devtools:resources",
    "//content/browser/tracing:resources",
    "//net:net_resources",
    "//third_party/WebKit/public:image_resources",
    "//third_party/WebKit/public:resources",
    "//ui/resources",
    "//ui/strings",
  ]

  output = "$root_out_dir/headless_lib.pak"
}

action("embed_resources") {
  # TODO(altimin): Consider zipping file here, it can reduce size up to 80%.
  script = "lib/embed_data.py"

  inputs = [
    "$root_out_dir/headless_lib.pak",
  ]

  outputs = [
    "$root_gen_dir/headless/embedded_resource_pak.cc",
    "$root_gen_dir/headless/embedded_resource_pak.h",
  ]

  args = [
    "--data_file",
    rebase_path("$root_out_dir/headless_lib.pak", root_build_dir),
    "--gendir",
    rebase_path("$root_gen_dir", root_build_dir),
    "--header_file",
    "headless/embedded_resource_pak.h",
    "--source_file",
    "headless/embedded_resource_pak.cc",
    "--namespace",
    "headless",
    "--variable_name",
    "kHeadlessResourcePak",
  ]

  deps = [
    ":pak",
  ]
}

mojom("tab_socket") {
  sources = [
    "lib/tab_socket.mojom",
  ]
}

mojom("headless_render_frame_controller") {
  sources = [
    "lib/headless_render_frame_controller.mojom",
  ]
}

grit("resources") {
  source = "lib/resources/headless_lib_resources.grd"
  outputs = [
    "grit/headless_lib_resources.h",
    "$root_gen_dir/headless/headless_lib_resources.pak",
  ]
  grit_flags = [
    "-E",
    "mojom_root=" + rebase_path(root_gen_dir, root_build_dir),
  ]
  deps = [
    ":headless_render_frame_controller_js",
    ":tab_socket_js",
  ]
}

devtools_domains = [
  "accessibility",
  "animation",
  "application_cache",
  "browser",
  "cache_storage",
  "console",
  "css",
  "database",
  "debugger",
  "device_orientation",
  "dom",
  "dom_debugger",
  "dom_snapshot",
  "dom_storage",
  "emulation",
  "heap_profiler",
  "indexeddb",
  "input",
  "inspector",
  "io",
  "layer_tree",
  "log",
  "memory",
  "network",
  "page",
  "profiler",
  "runtime",
  "security",
  "service_worker",
  "target",
  "tracing",
]

generated_devtools_api = []
generated_devtools_api_js = []
generated_devtools_api_js_externs = []
foreach(domain, devtools_domains) {
  generated_devtools_api_js +=
      [ "$target_gen_dir/public/devtools_js/" + domain + ".js" ]
  generated_devtools_api_js_externs +=
      [ "$target_gen_dir/public/devtools_js/externs/externs_" + domain + ".js" ]
  generated_devtools_api += [
    "$target_gen_dir/public/devtools/domains/" + domain + ".cc",
    "$target_gen_dir/public/devtools/domains/" + domain + ".h",
    "$target_gen_dir/public/devtools/domains/types_" + domain + ".h",
    "$target_gen_dir/public/devtools/domains/types_" + domain + ".cc",
    "$target_gen_dir/public/devtools/internal/type_conversions_" + domain +
        ".h",
    "$target_gen_dir/public/devtools/internal/" +
        "types_forward_declarations_" + domain + ".h",
  ]
}

action("gen_devtools_client_api") {
  script = "lib/browser/devtools_api/client_api_generator.py"
  deps = [
    "//third_party/WebKit/Source/core/inspector:protocol_version",
  ]
  inputs = [
    "$root_gen_dir/blink/core/inspector/protocol.json",
  ]

  outputs = generated_devtools_api + generated_devtools_api_js +
            generated_devtools_api_js_externs

  sources = [
    "lib/browser/devtools_api/domain_cc.template",
    "lib/browser/devtools_api/domain_externs_js.template",
    "lib/browser/devtools_api/domain_h.template",
    "lib/browser/devtools_api/domain_js.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",
  ]
}

js_library("js_devtools_bindings_lib") {
  sources = [ "lib/browser/devtools_api/devtools_connection.js" ] +
            generated_devtools_api_js
  deps = []
  extra_deps = [ ":gen_devtools_client_api" ]
}

if (headless_fontconfig_utils) {
  static_library("headless_fontconfig_utils") {
    sources = [
      "public/util/fontconfig.cc",
      "public/util/fontconfig.h",
    ]

    deps = [
      "//third_party/fontconfig",
      "//third_party/freetype",
    ]

    configs += [ ":headless_implementation" ]
  }
}

component("headless") {
  sources = [
    "app/headless_shell_switches.cc",
    "app/headless_shell_switches.h",
    "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_impl_mac.mm",
    "lib/browser/headless_browser_main_parts.cc",
    "lib/browser/headless_browser_main_parts.h",
    "lib/browser/headless_browser_main_parts_mac.mm",
    "lib/browser/headless_devtools.cc",
    "lib/browser/headless_devtools.h",
    "lib/browser/headless_devtools_client_impl.cc",
    "lib/browser/headless_devtools_client_impl.h",
    "lib/browser/headless_devtools_manager_delegate.cc",
    "lib/browser/headless_devtools_manager_delegate.h",
    "lib/browser/headless_net_log.cc",
    "lib/browser/headless_net_log.h",
    "lib/browser/headless_network_delegate.cc",
    "lib/browser/headless_network_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_resource_dispatcher_host_delegate.cc",
    "lib/browser/headless_resource_dispatcher_host_delegate.h",
    "lib/browser/headless_shell_application_mac.h",
    "lib/browser/headless_shell_application_mac.mm",
    "lib/browser/headless_tab_socket_impl.cc",
    "lib/browser/headless_tab_socket_impl.h",
    "lib/browser/headless_url_request_context_getter.cc",
    "lib/browser/headless_url_request_context_getter.h",
    "lib/browser/headless_window_tree_host.h",
    "lib/headless_content_client.cc",
    "lib/headless_content_client.h",
    "lib/headless_crash_reporter_client.cc",
    "lib/headless_crash_reporter_client.h",
    "public/headless_browser.cc",
    "public/headless_browser.h",
    "public/headless_browser_context.h",
    "public/headless_devtools_client.h",
    "public/headless_devtools_target.h",
    "public/headless_export.h",
    "public/headless_web_contents.h",
    "public/internal/message_dispatcher.h",
    "public/internal/value_conversions.h",
    "public/util/black_hole_protocol_handler.cc",
    "public/util/black_hole_protocol_handler.h",
    "public/util/deterministic_dispatcher.cc",
    "public/util/deterministic_dispatcher.h",
    "public/util/deterministic_http_protocol_handler.cc",
    "public/util/deterministic_http_protocol_handler.h",
    "public/util/error_reporter.cc",
    "public/util/error_reporter.h",
    "public/util/expedited_dispatcher.cc",
    "public/util/expedited_dispatcher.h",
    "public/util/generic_url_request_job.cc",
    "public/util/generic_url_request_job.h",
    "public/util/http_url_fetcher.cc",
    "public/util/http_url_fetcher.h",
    "public/util/in_memory_protocol_handler.cc",
    "public/util/in_memory_protocol_handler.h",
    "public/util/in_memory_request_job.cc",
    "public/util/in_memory_request_job.h",
    "public/util/managed_dispatch_url_request_job.cc",
    "public/util/managed_dispatch_url_request_job.h",
    "public/util/navigation_request.h",
    "public/util/testing/generic_url_request_mocks.cc",
    "public/util/testing/generic_url_request_mocks.h",
    "public/util/throttled_dispatcher.cc",
    "public/util/throttled_dispatcher.h",
    "public/util/url_fetcher.cc",
    "public/util/url_fetcher.h",
    "public/util/url_request_dispatcher.h",
    "public/util/user_agent.cc",
    "public/util/user_agent.h",
  ]

  sources += generated_devtools_api

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

  if (enable_basic_printing) {
    sources += [
      "lib/browser/headless_print_manager.cc",
      "lib/browser/headless_print_manager.h",
      "lib/renderer/headless_print_render_frame_helper_delegate.cc",
      "lib/renderer/headless_print_render_frame_helper_delegate.h",
    ]
  }

  public_deps = [
    "//base",
    "//net",
  ]

  if (enable_basic_printing) {
    public_deps += [ "//skia" ]
  }

  deps = [
    ":gen_devtools_client_api",
    ":headless_render_frame_controller",
    ":tab_socket",
    ":version_header",
    "//components/security_state/core",
    "//content/public/common",
    "//content/public/common:service_names",
    "//services/service_manager/public/cpp",
    "//ui/base",
    "//ui/compositor",
    "//ui/display",
    "//ui/events/devices",
    "//url",
  ]

  if (is_component_build) {
    sources += [
      "lib/browser/headless_content_browser_client.cc",
      "lib/browser/headless_content_browser_client.h",
      "lib/browser/headless_web_contents_impl.cc",
      "lib/browser/headless_web_contents_impl.h",
      "lib/headless_content_main_delegate.cc",
      "lib/headless_content_main_delegate.h",
      "lib/renderer/headless_content_renderer_client.cc",
      "lib/renderer/headless_content_renderer_client.h",
      "lib/renderer/headless_render_frame_controller_impl.cc",
      "lib/renderer/headless_render_frame_controller_impl.h",
      "lib/renderer/headless_tab_socket_bindings.cc",
      "lib/renderer/headless_tab_socket_bindings.h",
    ]

    deps += [
      "//components/crash/content/browser",
      "//components/security_state/content",
      "//third_party/WebKit/public:blink_headers",
    ]

    if (enable_basic_printing) {
      deps += [
        "//components/printing/browser",
        "//components/printing/renderer",
      ]
    }
  }

  if (is_mac) {
    deps += [ ":mac_helpers" ]
  } else {
    deps += [ "//ui/aura" ]
  }

  if (headless_use_embedded_resources) {
    deps += [ ":embed_resources" ]
    sources += [
      "$root_gen_dir/headless/embedded_resource_pak.cc",
      "$root_gen_dir/headless/embedded_resource_pak.h",
    ]
  } else {
    deps += [ ":pak" ]
  }

  if (use_ozone) {
    deps += [ "//ui/ozone" ]
  }

  if (headless_fontconfig_utils) {
    deps += [ ":headless_fontconfig_utils" ]
  }

  configs += [ ":headless_implementation" ]
}

# 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") {
    sources = [
      "lib/browser/headless_web_contents_impl.cc",
      "lib/browser/headless_web_contents_impl.h",
      "lib/headless_content_main_delegate.cc",
      "lib/headless_content_main_delegate.h",
      "lib/renderer/headless_content_renderer_client.cc",
      "lib/renderer/headless_content_renderer_client.h",
      "lib/renderer/headless_render_frame_controller_impl.cc",
      "lib/renderer/headless_render_frame_controller_impl.h",
      "lib/renderer/headless_tab_socket_bindings.cc",
      "lib/renderer/headless_tab_socket_bindings.h",
    ]

    deps = [
      ":headless",
      "//third_party/WebKit/public:blink_headers",
      "//ui/base",
      "//v8",
    ]
    if (enable_basic_printing) {
      deps += [ "//components/printing/renderer" ]
    }

    configs += [ ":headless_implementation" ]
  }
} else {
  # For component builds all dependencies are already included in the headless
  # component.
  group("headless_renderer") {
    deps = [
      ":headless",
    ]
  }
}

group("headless_tests") {
  testonly = true

  deps = [
    ":headless_browsertests",
    ":headless_example",
    ":headless_unittests",
  ]
}

test("headless_unittests") {
  sources = [
    "public/domains/types_unittest.cc",
    "public/util/deterministic_dispatcher_test.cc",
    "public/util/error_reporter_unittest.cc",
    "public/util/expedited_dispatcher_test.cc",
    "public/util/generic_url_request_job_test.cc",
    "public/util/testing/fake_managed_dispatch_url_request_job.cc",
    "public/util/testing/fake_managed_dispatch_url_request_job.h",
    "public/util/throttled_dispatcher_test.cc",
  ]

  if (!is_component_build) {
    sources += [
      "lib/browser/headless_content_browser_client.cc",
      "lib/browser/headless_content_browser_client.h",
    ]
  }

  deps = [
    ":headless_renderer",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//components/crash/content/browser",
    "//components/security_state/content",
    "//content/public/app:both",
    "//content/public/child:child",
    "//content/public/common",
    "//testing/gmock",
    "//testing/gtest",
  ]

  if (enable_basic_printing) {
    sources += [ "lib/browser/headless_printing_unittest.cc" ]
    deps += [ "//components/printing/browser" ]
  }
}

if (is_mac) {
  copy("mac_helpers") {
    sources = [
      "$root_out_dir/crashpad_handler",
    ]

    if (is_component_build) {
      sources += [ "$root_out_dir/libbase.dylib" ]
    }

    deps = [
      "//base",
      "//third_party/crashpad/crashpad/handler:crashpad_handler",
    ]

    outputs = [
      "$root_out_dir/Helpers/{{source_file_part}}",
    ]
  }
}

# The js_binary rule doesn't currently work on windows. Apparently there are
# problems on mac too where java isn't necessarily installed.
if (is_linux) {
  js_binary("js_devtools_bindings_test") {
    sources = [
      "test/bindings_test.js",
    ]
    deps = [
      ":js_devtools_bindings_lib",
    ]
    externs_list = [ "lib/tab_socket_externs.js" ]
    outputs = [
      "$target_gen_dir/devtools_bindings_test.js",
    ]
    config_files = []
    closure_flags = [
      "jscomp_error=checkTypes",
      "dependency_mode=STRICT",

      # Currently the bindings do not support property renaming so we can't use
      # ADVANCED_OPTIMIZATIONS here.  We could add support via either moving all
      # the types to externs, or via applying the same renaming to the json
      # dictionaries sent between C++ and JS.  The closure compiler can produce
      # files which contain those mappings with the appropriate flag.
      "compilation_level=SIMPLE",
      "language_out=ES5_STRICT",
      "entry_point=chromium.BindingsTest",
    ]
  }

  grit("headless_browsertest_resources_grit") {
    source = "headless_browsertest_resources.grd"
    outputs = [
      "grit/headless_browsertest_resources.h",
      "$root_gen_dir/headless/headless_browsertest_resources.pak",
    ]
    grit_flags = [
      "-E",
      "gen_root=" + rebase_path(root_gen_dir),
    ]
    deps = [
      ":js_devtools_bindings_test",
    ]
    resource_ids = "lib/headless_browsertest_resource_ids"
  }

  repack("headless_browser_tests_pak") {
    sources = [
      "$root_gen_dir/headless/headless_browsertest_resources.pak",
    ]
    output = "$root_out_dir/headless_browser_tests.pak"
    deps = [
      ":headless_browsertest_resources_grit",
    ]
  }
}

test("headless_browsertests") {
  sources = [
    "lib/frame_id_browsertest.cc",
    "lib/headless_browser_browsertest.cc",
    "lib/headless_browser_context_browsertest.cc",
    "lib/headless_devtools_client_browsertest.cc",
    "lib/headless_web_contents_browsertest.cc",
    "lib/virtual_time_browsertest.cc",
    "test/headless_browser_test.cc",
    "test/headless_browser_test.h",
    "test/headless_test_launcher.cc",
    "test/tab_socket_test.cc",
    "test/tab_socket_test.h",
    "test/test_protocol_handler.cc",
    "test/test_protocol_handler.h",
    "test/test_url_request_job.cc",
    "test/test_url_request_job.h",
  ]

  data = [
    "lib/dom_tree_extraction_expected_nodes.txt",
    "lib/dom_tree_extraction_expected_styles.txt",
    "$root_out_dir/headless_lib.pak",
    "//net/tools/testserver/",
    "//third_party/pyftpdlib/",
    "//third_party/pywebsocket/",
    "//third_party/tlslite/",
    "test/data/",
  ]

  if (is_mac) {
    data_deps = [
      ":mac_helpers",
    ]
  }

  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]

  if (!is_component_build) {
    sources += [
      "lib/browser/headless_content_browser_client.cc",
      "lib/browser/headless_content_browser_client.h",
    ]
  }

  deps = [
    ":headless_renderer",
    "//base",
    "//components/crash/content/browser",
    "//components/security_state/content",
    "//content/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]

  # Only include this if we built the js_binary
  if (is_linux) {
    data += [ "$root_out_dir/headless_browser_tests.pak" ]
    sources += [ "test/headless_js_bindings_browsertest.cc" ]
    deps += [ ":headless_browser_tests_pak" ]
  }

  if (enable_basic_printing) {
    deps += [
      "//components/printing/browser",
      "//pdf",
    ]
  }
}

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.cc",
      "app/headless_shell_switches.h",
      "app/headless_shell_win.cc",
      "app/shell_navigation_request.cc",
      "app/shell_navigation_request.h",
      "lib/browser/headless_content_browser_client.cc",
      "lib/browser/headless_content_browser_client.h",
      "public/headless_shell.h",
    ]
    deps = [
      ":headless",
      "//content:sandbox_helper_win",
      "//content/public/browser",
      "//content/public/common",
      "//net",
      "//sandbox",
    ]

    if (is_multi_dll_chrome) {
      defines = [ "CHROME_MULTIPLE_DLL_BROWSER" ]
      sources += [
        "lib/browser/headless_web_contents_impl.cc",
        "lib/browser/headless_web_contents_impl.h",
        "lib/headless_content_main_delegate.cc",
        "lib/headless_content_main_delegate.h",
        "lib/headless_content_main_delegate_win.cc",
      ]
      deps += [ "//third_party/WebKit/public:blink_headers" ]
    }

    configs += [ ":headless_implementation" ]
  }

  # Headless library with child specific dependencies (e.g., renderer). This
  # is used when no browser depencendies are needed (e.g. chrome:child_dll).
  static_library("headless_shell_child_lib") {
    sources = [
      "app/headless_shell.cc",
      "app/headless_shell.h",
      "app/headless_shell_switches.cc",
      "app/headless_shell_switches.h",
      "app/headless_shell_win.cc",
      "app/shell_navigation_request.cc",
      "app/shell_navigation_request.h",
      "public/headless_shell.h",
    ]
    deps = [
      ":headless_renderer",
      "//content/public/child:child",
      "//net",
      "//ui/base",
    ]

    if (is_multi_dll_chrome) {
      defines = [ "CHROME_MULTIPLE_DLL_CHILD" ]
      sources += [
        "lib/browser/headless_web_contents_impl.cc",
        "lib/browser/headless_web_contents_impl.h",
        "lib/headless_content_main_delegate.cc",
        "lib/headless_content_main_delegate.h",
        "lib/headless_content_main_delegate_win.cc",
      ]
      deps += [ "//third_party/WebKit/public:blink_headers" ]
    }

    configs += [ ":headless_implementation" ]
  }
}

# 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.cc",
    "app/headless_shell_switches.h",
    "app/shell_navigation_request.cc",
    "app/shell_navigation_request.h",
    "lib/browser/headless_content_browser_client.cc",
    "lib/browser/headless_content_browser_client.h",
    "public/headless_shell.h",
  ]

  deps = [
    ":headless_renderer",
    "//components/crash/content/browser",
    "//components/security_state/content",
    "//content/public/app:both",
    "//content/public/browser",
    "//content/public/child:child",
    "//content/public/common",
  ]

  if (enable_basic_printing) {
    deps += [
      "//components/printing/browser",
      "//components/printing/renderer",
    ]
  }

  if (is_win) {
    defines = [ "HEADLESS_USE_CRASPHAD" ]

    deps += [
      "//components/crash/content/app:run_as_crashpad_handler",
      "//content:sandbox_helper_win",
      "//sandbox",
    ]
  }
}

executable("headless_shell") {
  sources = [
    "app/headless_shell_main.cc",
  ]

  deps = [
    ":headless_shell_lib",
    "//build/config:exe_and_shlib_deps",
  ]

  if (is_win) {
    deps += [ "//build/win:default_exe_manifest" ]
  }
}

process_version("version_header") {
  template_file = "public/version.h.in"
  sources = [
    "//build/util/LASTCHANGE",
    "//chrome/VERSION",
  ]
  output = "$target_gen_dir/public/version.h"
}

executable("headless_example") {
  sources = [
    "app/headless_example.cc",
  ]

  deps = [
    ":headless_shell_lib",
    "//build/config:exe_and_shlib_deps",
  ]
}
