# Copyright 2014 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/features.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/ui.gni")
import("//build/config/win/console_app.gni")
import("//build/config/win/manifest.gni")
import("//gpu/vulkan/features.gni")
import("//media/media_options.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//ppapi/buildflags/buildflags.gni")
import("//tools/grit/grit_rule.gni")
import("//tools/grit/repack.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
if (is_android) {
  import("//build/config/android/config.gni")
} else if (is_mac) {
  import("//build/config/mac/rules.gni")
  import("//build/mac/tweak_info_plist.gni")
  import("//content/public/app/mac_helpers.gni")
  import("//third_party/icu/config.gni")
  import("//ui/gl/features.gni")
  import("//v8/gni/v8.gni")
}

declare_args() {
  content_shell_product_name = "Content Shell"
  content_shell_version = "99.77.34.5"
  content_shell_major_version = "99"
}

config("content_shell_lib_warnings") {
  if (is_clang) {
    # TODO(thakis): Remove this once http://crbug.com/383820 is figured out
    cflags = [ "-Wno-nonnull" ]
  }
}

source_set("android_shell_descriptors") {
  testonly = true
  sources = [
    "android/shell_descriptors.h",
  ]
  public_deps = [
    "//content/public/common:content_descriptors",
  ]
}

source_set("web_test_messages") {
  testonly = true
  sources = [
    # Note that if this target becomes jumbofied, it should use
    # jumbo_excluded_sources to exclude the messages.cc files.
    # IPC uses multiple inclusions in different macro contexts to
    # generate the code. This is not compatible with jumbo
    # compilations since all other files need the "clean" version of
    # the message headers.
    "common/web_test/blink_test_messages.cc",
    "common/web_test/blink_test_messages.h",
    "common/web_test/web_test_messages.cc",
    "common/web_test/web_test_messages.h",
  ]

  deps = [
    "//content/public/common",
    "//ipc",
    "//net",
    "//skia",
    "//url/ipc:url_ipc",
  ]
}

source_set("web_test_switches") {
  testonly = true
  sources = [
    "common/web_test/web_test_switches.cc",
    "common/web_test/web_test_switches.h",
  ]
}

source_set("web_test_utils") {
  testonly = true
  sources = [
    "common/web_test/web_test_utils.cc",
    "common/web_test/web_test_utils.h",
  ]
  deps = [
    "//cc/paint:paint",
    "//skia",
    "//third_party/blink/public:blink_headers",
  ]
}

jumbo_static_library("content_shell_lib") {
  testonly = true
  sources = [
    "android/shell_manager.cc",
    "android/shell_manager.h",
    "app/blink_test_platform_support.h",
    "app/blink_test_platform_support_mac.mm",
    "app/blink_test_platform_support_win.cc",
    "app/paths_mac.h",
    "app/paths_mac.mm",
    "app/shell_crash_reporter_client.cc",
    "app/shell_crash_reporter_client.h",
    "app/shell_main_delegate.cc",
    "app/shell_main_delegate.h",
    "app/shell_main_delegate_mac.h",
    "app/shell_main_delegate_mac.mm",
    "browser/renderer_host/shell_render_widget_host_view_mac_delegate.h",
    "browser/renderer_host/shell_render_widget_host_view_mac_delegate.mm",
    "browser/shell.cc",
    "browser/shell.h",
    "browser/shell_android.cc",
    "browser/shell_application_mac.h",
    "browser/shell_application_mac.mm",
    "browser/shell_browser_context.cc",
    "browser/shell_browser_context.h",
    "browser/shell_browser_main_parts.cc",
    "browser/shell_browser_main_parts.h",
    "browser/shell_browser_main_parts_mac.mm",
    "browser/shell_content_browser_client.cc",
    "browser/shell_content_browser_client.h",
    "browser/shell_devtools_bindings.cc",
    "browser/shell_devtools_bindings.h",
    "browser/shell_devtools_frontend.cc",
    "browser/shell_devtools_frontend.h",
    "browser/shell_devtools_manager_delegate.cc",
    "browser/shell_devtools_manager_delegate.h",
    "browser/shell_download_manager_delegate.cc",
    "browser/shell_download_manager_delegate.h",
    "browser/shell_javascript_dialog.h",
    "browser/shell_javascript_dialog_mac.mm",
    "browser/shell_javascript_dialog_manager.cc",
    "browser/shell_javascript_dialog_manager.h",
    "browser/shell_javascript_dialog_win.cc",
    "browser/shell_mac.mm",
    "browser/shell_permission_manager.cc",
    "browser/shell_permission_manager.h",
    "browser/shell_platform_data_aura.cc",
    "browser/shell_platform_data_aura.h",
    "browser/shell_plugin_service_filter.cc",
    "browser/shell_plugin_service_filter.h",
    "browser/shell_quota_permission_context.cc",
    "browser/shell_quota_permission_context.h",
    "browser/shell_speech_recognition_manager_delegate.cc",
    "browser/shell_speech_recognition_manager_delegate.h",
    "browser/shell_web_contents_view_delegate.h",
    "browser/shell_web_contents_view_delegate_android.cc",
    "browser/shell_web_contents_view_delegate_creator.h",
    "browser/shell_web_contents_view_delegate_mac.mm",
    "browser/web_test/blink_test_controller.cc",
    "browser/web_test/blink_test_controller.h",
    "browser/web_test/devtools_protocol_test_bindings.cc",
    "browser/web_test/devtools_protocol_test_bindings.h",
    "browser/web_test/fake_bluetooth_chooser.cc",
    "browser/web_test/fake_bluetooth_chooser.h",
    "browser/web_test/fake_bluetooth_chooser_factory.cc",
    "browser/web_test/fake_bluetooth_chooser_factory.h",
    "browser/web_test/fake_bluetooth_scanning_prompt.cc",
    "browser/web_test/fake_bluetooth_scanning_prompt.h",
    "browser/web_test/leak_detector.cc",
    "browser/web_test/leak_detector.h",
    "browser/web_test/mojo_web_test_helper.cc",
    "browser/web_test/mojo_web_test_helper.h",
    "browser/web_test/secondary_test_window_observer.cc",
    "browser/web_test/secondary_test_window_observer.h",
    "browser/web_test/test_info_extractor.cc",
    "browser/web_test/test_info_extractor.h",
    "browser/web_test/web_test_background_fetch_delegate.cc",
    "browser/web_test/web_test_background_fetch_delegate.h",
    "browser/web_test/web_test_bluetooth_adapter_provider.cc",
    "browser/web_test/web_test_bluetooth_adapter_provider.h",
    "browser/web_test/web_test_bluetooth_chooser_factory.cc",
    "browser/web_test/web_test_bluetooth_chooser_factory.h",
    "browser/web_test/web_test_bluetooth_fake_adapter_setter_impl.cc",
    "browser/web_test/web_test_bluetooth_fake_adapter_setter_impl.h",
    "browser/web_test/web_test_browser_context.cc",
    "browser/web_test/web_test_browser_context.h",
    "browser/web_test/web_test_browser_main.cc",
    "browser/web_test/web_test_browser_main.h",
    "browser/web_test/web_test_browser_main_parts.cc",
    "browser/web_test/web_test_browser_main_parts.h",
    "browser/web_test/web_test_content_browser_client.cc",
    "browser/web_test/web_test_content_browser_client.h",
    "browser/web_test/web_test_content_index_provider.cc",
    "browser/web_test/web_test_content_index_provider.h",
    "browser/web_test/web_test_devtools_bindings.cc",
    "browser/web_test/web_test_devtools_bindings.h",
    "browser/web_test/web_test_download_manager_delegate.cc",
    "browser/web_test/web_test_download_manager_delegate.h",
    "browser/web_test/web_test_first_device_bluetooth_chooser.cc",
    "browser/web_test/web_test_first_device_bluetooth_chooser.h",
    "browser/web_test/web_test_javascript_dialog_manager.cc",
    "browser/web_test/web_test_javascript_dialog_manager.h",
    "browser/web_test/web_test_message_filter.cc",
    "browser/web_test/web_test_message_filter.h",
    "browser/web_test/web_test_permission_manager.cc",
    "browser/web_test/web_test_permission_manager.h",
    "browser/web_test/web_test_push_messaging_service.cc",
    "browser/web_test/web_test_push_messaging_service.h",
    "common/power_monitor_test_impl.cc",
    "common/power_monitor_test_impl.h",
    "common/shell_content_client.cc",
    "common/shell_content_client.h",
    "common/shell_origin_trial_policy.cc",
    "common/shell_origin_trial_policy.h",
    "common/shell_switches.cc",
    "common/shell_switches.h",
    "common/web_test/web_test_content_client.cc",
    "common/web_test/web_test_content_client.h",
    "gpu/shell_content_gpu_client.cc",
    "gpu/shell_content_gpu_client.h",
    "renderer/shell_content_renderer_client.cc",
    "renderer/shell_content_renderer_client.h",
    "renderer/shell_render_view_observer.cc",
    "renderer/shell_render_view_observer.h",
    "renderer/web_test/blink_test_helpers.cc",
    "renderer/web_test/blink_test_helpers.h",
    "renderer/web_test/blink_test_runner.cc",
    "renderer/web_test/blink_test_runner.h",
    "renderer/web_test/test_media_stream_renderer_factory.cc",
    "renderer/web_test/test_media_stream_renderer_factory.h",
    "renderer/web_test/test_media_stream_video_renderer.cc",
    "renderer/web_test/test_media_stream_video_renderer.h",
    "renderer/web_test/test_websocket_handshake_throttle_provider.cc",
    "renderer/web_test/test_websocket_handshake_throttle_provider.h",
    "renderer/web_test/web_test_content_renderer_client.cc",
    "renderer/web_test/web_test_content_renderer_client.h",
    "renderer/web_test/web_test_render_frame_observer.cc",
    "renderer/web_test/web_test_render_frame_observer.h",
    "renderer/web_test/web_test_render_thread_observer.cc",
    "renderer/web_test/web_test_render_thread_observer.h",
    "utility/shell_content_utility_client.cc",
    "utility/shell_content_utility_client.h",
  ]

  configs += [
    ":content_shell_lib_warnings",
    "//build/config:precompiled_headers",

    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    "//build/config/compiler:no_size_t_to_int_warning",
  ]

  defines = [
    "CONTENT_SHELL_VERSION=\"$content_shell_version\"",
    "CONTENT_SHELL_MAJOR_VERSION=\"$content_shell_major_version\"",
  ]

  public_deps = [
    ":android_shell_descriptors",

    # #include'ed by renderer/web_test/blink_test_runner.h
    ":mojo_bindings",

    # The generated mojom JS bindings are used by web tests.
    ":mojo_bindings_js",

    # This exposes all public content APIs.
    "//content/public/app:both",
    "//content/public/browser",
    "//content/public/child",
    "//content/public/common",
    "//content/public/gpu",
    "//content/public/renderer",
    "//content/public/utility",
    "//services/network:network_service",
  ]
  deps = [
    ":resources",
    ":web_test_messages",
    ":web_test_switches",
    ":web_test_utils",
    "//base",
    "//base:base_static",
    "//base/third_party/dynamic_annotations",
    "//cc",
    "//components/cdm/renderer",
    "//components/crash/content/app",
    "//components/crash/content/app:test_support",
    "//components/crash/content/browser",
    "//components/crash/core/common:crash_key",
    "//components/download/content/factory",
    "//components/download/public/background_service:public",
    "//components/download/public/common:public",
    "//components/keyed_service/content",
    "//components/network_session_configurator/browser",
    "//components/plugins/renderer",
    "//components/url_formatter",
    "//components/web_cache/renderer",
    "//content:resources",
    "//content/app/resources",
    "//content/app/strings",
    "//content/gpu",
    "//content/public/common",
    "//content/public/common:service_names",
    "//content/shell/test_runner:test_runner",
    "//content/test:content_test_mojo_bindings",
    "//content/test:mojo_web_test_bindings",
    "//content/test:mojo_web_test_old_names_bindings",
    "//content/test:test_support",
    "//content/test:web_test_support",
    "//device/bluetooth",
    "//device/bluetooth:fake_bluetooth",
    "//device/bluetooth:mocks",
    "//device/bluetooth/public/mojom:fake_bluetooth_interfaces",
    "//gin",
    "//gpu",
    "//media",
    "//media/capture",
    "//media/mojo:buildflags",
    "//net",
    "//net:net_resources",
    "//net:test_support",
    "//ppapi/buildflags",
    "//sandbox",
    "//services/device/public/cpp:test_support",
    "//services/device/public/mojom",
    "//services/network/public/cpp",
    "//services/service_manager/embedder:embedder_result_codes",
    "//services/service_manager/public/cpp",
    "//services/test/echo:lib",
    "//services/test/echo/public/mojom",
    "//skia",
    "//skia:test_fonts",
    "//storage/browser",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/blink/public:blink",
    "//third_party/blink/public:buildflags",
    "//third_party/blink/public:image_resources",
    "//third_party/blink/public:resources",
    "//third_party/blink/public:test_support",
    "//third_party/icu",
    "//ui/base",
    "//ui/base/clipboard",
    "//ui/base/ime/init",
    "//ui/display",
    "//ui/events:events_base",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gfx/ipc",
    "//ui/gfx/ipc/geometry",
    "//ui/gfx/ipc/skia",
    "//ui/gl",
    "//ui/platform_window",
    "//url",
    "//v8",
  ]

  if (is_fuchsia) {
    deps -= [
      "//components/crash/content/app",
      "//components/crash/content/app:test_support",
      "//components/crash/content/browser",
    ]
    deps += [ "//third_party/fuchsia-sdk/sdk:ui_policy" ]
  }

  # Annoyingly, this target and web_test_support have circular includes.
  allow_circular_includes_from = [ "//content/test:web_test_support" ]

  if (enable_plugins) {
    deps += [
      "//cc/paint",
      "//content/ppapi_plugin",
      "//ppapi:blink_deprecated_test_plugin",
      "//ppapi:blink_test_plugin",
      "//ppapi/shared_impl",
    ]
  }
  if (enable_vulkan) {
    deps += [
      "//gpu/vulkan:test_support",
      "//gpu/vulkan/init",
    ]
  }
  if (mojo_media_host == "browser") {
    deps += [
      "//media/mojo/mojom:constants",
      "//media/mojo/services",
    ]
  }

  if (is_win) {
    sources += [
      "common/v8_crashpad_support_win.cc",
      "common/v8_crashpad_support_win.h",
    ]
  }

  if (is_linux) {
    deps += [
      "//third_party/fontconfig",
      "//ui/gfx:test_support",
    ]
  }

  if (use_x11) {
    # Some tests rely on this tool at runtime. Note: it might be better if
    # the tests that needed it had this as a dep instead of adding it here.
    deps += [ "//ui/events/devices/x11" ]
  }

  if (is_android) {
    deps += [
      "//base/test:test_support",
      "//components/embedder_support/android:view",
      "//content/shell/android:content_shell_jni_headers",
      "//content/test:android_test_message_pump_support",
      "//mojo/public/java/system:test_support",
      "//ui/android",
    ]
  }

  if (toolkit_views) {
    deps += [ "//ui/views" ]
  }

  if (use_aura) {
    deps += [
      "//ui/aura",
      "//ui/aura:test_support",
      "//ui/events",
      "//ui/strings",
      "//ui/wm",
    ]

    if (toolkit_views) {
      sources += [
        "browser/shell_views.cc",
        "browser/shell_web_contents_view_delegate_views.cc",
      ]
      deps += [
        "//ui/resources",
        "//ui/views:test_support",
        "//ui/views/controls/webview",
        "//ui/wm:test_support",
      ]
    } else {
      sources += [
        "browser/shell_aura.cc",
        "browser/shell_web_contents_view_delegate_aura.cc",
      ]
    }
  } else {
    sources -= [
      "browser/shell_platform_data_aura.cc",
      "browser/shell_platform_data_aura.h",
    ]
  }

  if (is_chromeos) {
    deps += [
      "//chromeos/dbus",
      "//ui/wm:test_support",
    ]
  }

  if (is_linux) {
    deps += [ "//build/config/freetype" ]
  }

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

  if (!enable_plugins) {
    sources -= [
      "browser/shell_plugin_service_filter.cc",
      "browser/shell_plugin_service_filter.h",
    ]
  }
}

grit("content_shell_resources_grit") {
  testonly = true

  # External code should depend on ":resources" instead.
  visibility = [ ":*" ]
  source = "shell_resources.grd"
  outputs = [
    "grit/shell_resources.h",
    "shell_resources.pak",
  ]
}

copy("copy_shell_resources") {
  testonly = true

  sources = [
    "$target_gen_dir/shell_resources.pak",
  ]
  outputs = [
    "$root_out_dir/shell_resources.pak",
  ]

  public_deps = [
    ":content_shell_resources_grit",
  ]
}

group("resources") {
  testonly = true

  public_deps = [
    ":copy_shell_resources",
  ]
}

repack("pak") {
  testonly = true

  sources = [
    "$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/tracing/tracing_resources.pak",
    "$root_gen_dir/content/content_resources.pak",
    "$root_gen_dir/content/shell/shell_resources.pak",
    "$root_gen_dir/mojo/public/js/mojo_bindings_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_resources.pak",
    "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak",
    "$root_gen_dir/ui/strings/ui_strings_en-US.pak",
  ]

  deps = [
    ":resources",
    "//content:resources",
    "//content/app/resources",
    "//content/app/strings",
    "//content/browser/tracing:resources",
    "//mojo/public/js:resources",
    "//net:net_resources",
    "//third_party/blink/public:resources",
    "//third_party/blink/public:scaled_resources_100_percent",
    "//ui/resources",
    "//ui/strings",
  ]

  if (toolkit_views) {
    deps += [ "//ui/views/resources" ]
    sources +=
        [ "$root_gen_dir/ui/views/resources/views_resources_100_percent.pak" ]
  }
  if (!is_android) {
    sources +=
        [ "$root_gen_dir/content/browser/devtools/devtools_resources.pak" ]
    deps += [ "//content/browser/devtools:resources" ]
  }
  output = "$root_out_dir/content_shell.pak"
}

if (is_android) {
  group("content_shell") {
    testonly = true
    deps = [
      "//content/shell/android:content_shell_apk",
    ]
  }
} else if (is_mac) {
  tweak_info_plist("content_shell_plist") {
    testonly = true
    info_plist = "app/app-Info.plist"
    args = [
      "--scm=1",
      "--version",
      content_shell_version,
    ]
  }
  mac_app_bundle("content_shell") {
    testonly = true
    output_name = content_shell_product_name
    sources = [
      "app/shell_main_mac.cc",
    ]
    defines = [ "SHELL_PRODUCT_NAME=\"$content_shell_product_name\"" ]
    deps = [
      ":content_shell_framework_bundle_data",
      ":content_shell_resources_bundle_data",
    ]
    info_plist_target = ":content_shell_plist"
    data_deps = [
      ":content_shell_lib",
    ]
  }
} else {
  executable("content_shell") {
    testonly = true

    sources = [
      "app/shell_main.cc",
    ]

    if (is_win) {
      sources += [ "app/shell.rc" ]
    }

    defines = []

    deps = [
      ":content_shell_lib",
      ":pak",
      "//build/win:default_exe_manifest",
    ]

    data_deps = [
      ":pak",
      "//tools/v8_context_snapshot:v8_context_snapshot",
    ]

    if (is_win) {
      deps += [ "//sandbox" ]

      # This is a large module that can't do incremental linking in some cases.
      configs -= [ "//build/config/win:default_incremental_linking" ]
      configs +=
          [ "//build/config/win:default_large_module_incremental_linking" ]
      if (win_console_app) {
        defines += [ "WIN_CONSOLE_APP" ]
      } else {
        # Set /SUBSYSTEM:WINDOWS unless a console build has been requested.
        configs -= [ "//build/config/win:console" ]
        configs += [ "//build/config/win:windowed" ]
      }

      data_deps +=
          [ "//third_party/crashpad/crashpad/handler:crashpad_handler" ]
    }

    if (is_linux && !is_component_build) {
      # Set rpath to find our own libfreetype even in a non-component build.
      configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
    }
  }

  if (is_fuchsia) {
    fuchsia_package("content_shell_pkg") {
      testonly = true
      binary = ":content_shell"
      package_name_override = "content_shell"
    }

    fuchsia_package_runner("content_shell_fuchsia") {
      testonly = true
      package = ":content_shell_pkg"
      package_name_override = "content_shell"
    }
  }
}

if (is_mac) {
  bundle_data("content_shell_framework_resources") {
    testonly = true
    sources = [
      "$root_out_dir/content_shell.pak",
    ]

    public_deps = [
      ":pak",
    ]

    if (icu_use_data_file) {
      sources += [ "$root_out_dir/icudtl.dat" ]
      deps = [
        "//third_party/icu:icudata",
      ]
    }

    if (v8_use_external_startup_data) {
      sources += [ "$root_out_dir/natives_blob.bin" ]
      public_deps += [ "//v8" ]
      if (use_v8_context_snapshot) {
        sources += [ "$root_out_dir/v8_context_snapshot.bin" ]
        public_deps += [ "//tools/v8_context_snapshot" ]
      } else {
        sources += [ "$root_out_dir/snapshot_blob.bin" ]
      }
    }

    outputs = [
      "{{bundle_resources_dir}}/{{source_file_part}}",
    ]
  }

  if (enable_plugins) {
    bundle_data("content_shell_framework_plugins") {
      sources = [
        "$root_out_dir/blink_deprecated_test_plugin.plugin",
        "$root_out_dir/blink_test_plugin.plugin",
      ]

      outputs = [
        "{{bundle_contents_dir}}/{{source_file_part}}",
      ]

      public_deps = [
        "//ppapi:blink_deprecated_test_plugin",
        "//ppapi:blink_test_plugin",
      ]
    }
  }

  content_shell_framework_name = "$content_shell_product_name Framework"
  content_shell_helper_name = "$content_shell_product_name Helper"

  bundle_data("content_shell_framework_helpers") {
    testonly = true
    sources = [
      "$root_out_dir/chrome_crashpad_handler",
    ]
    outputs = [
      "{{bundle_contents_dir}}/Helpers/{{source_file_part}}",
    ]
    public_deps = [
      "//components/crash/content/app:chrome_crashpad_handler",
    ]
    foreach(helper_params, content_mac_helpers) {
      sources += [
        "$root_out_dir/${content_shell_helper_name}${helper_params[2]}.app",
      ]
      public_deps += [ ":content_shell_helper_app_${helper_params[0]}" ]
    }
  }

  tweak_info_plist("content_shell_framework_plist") {
    testonly = true
    info_plist = "app/framework-Info.plist"
    args = [
      "--breakpad=0",
      "--keystone=0",
      "--scm=1",
      "--version",
      content_shell_version,
      "--branding",
      content_shell_product_name,
    ]
  }

  mac_framework_bundle("content_shell_framework") {
    testonly = true

    output_name = content_shell_framework_name

    framework_version = "C"

    framework_contents = [
      "Helpers",
      "Libraries",
      "Resources",
    ]

    sources = [
      "app/shell_content_main.cc",
      "app/shell_content_main.h",
    ]

    public_deps = [
      ":content_shell_lib",
    ]
    deps = [
      ":content_shell_angle_library",
      ":content_shell_framework_helpers",
      ":content_shell_framework_resources",
      ":content_shell_swiftshader_library",
      "//third_party/icu:icudata",
    ]

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

    # Both the main :content_shell and :content_shell_helper_app executables
    # need to link the framework. Because they are at different directory
    # depths, using @executable_path as the install_name would require using
    # install_name_tool on one of the executables. However install_name_tool
    # only operates in-place, which is problematic to express in GN. Instead,
    # use rpath-based loading.
    ldflags = [ "-Wl,-install_name,@executable_path/../Frameworks/$output_name.framework/$output_name" ]

    if (is_component_build) {
      # Set up the rpath for the framework so that it can find dylibs in the
      # root output directory. The framework is at
      # Content Shell.app/Contents/Frameworks/Content Shell Framework.framework/Versions/C/Content Shell Framework
      # so use loader_path to go back to the root output directory.
      ldflags += [
        "-rpath",
        "@loader_path/../../../../../..",
      ]
    }

    info_plist_target = ":content_shell_framework_plist"
  }

  tweak_info_plist("content_shell_helper_plist") {
    testonly = true
    info_plist = "app/helper-Info.plist"
    args = [
      "--breakpad=0",
      "--keystone=0",
      "--scm=0",
      "--version",
      content_shell_version,
    ]
  }

  template("content_shell_helper_app") {
    mac_app_bundle(target_name) {
      assert(defined(invoker.helper_name_suffix))
      assert(defined(invoker.helper_bundle_id_suffix))

      testonly = true

      output_name = content_shell_helper_name + invoker.helper_name_suffix

      sources = [
        "app/shell_main_mac.cc",
      ]
      defines = [
        "HELPER_EXECUTABLE",
        "SHELL_PRODUCT_NAME=\"$content_shell_product_name\"",
      ]
      extra_substitutions = [
        "CONTENT_SHELL_HELPER_SUFFIX=${invoker.helper_name_suffix}",
        "CONTENT_SHELL_HELPER_BUNDLE_ID_SUFFIX=${invoker.helper_bundle_id_suffix}",
      ]
      deps = [
        "//sandbox/mac:seatbelt",
      ]
      ldflags = [
        # The helper is in Content Shell.app/Contents/Frameworks/
        #     Content Shell Framework.framework/Versions/C/Helpers/
        #     Content Shell Helper.app/Contents/MacOS/
        # so set rpath up to the base.
        "-rpath",
        "@executable_path/../../../../../../../../../..",
      ]
      info_plist_target = ":content_shell_helper_plist"
    }
  }

  foreach(helper_params, content_mac_helpers) {
    _helper_target = helper_params[0]
    _helper_bundle_id = helper_params[1]
    _helper_suffix = helper_params[2]
    content_shell_helper_app("content_shell_helper_app_${_helper_target}") {
      helper_name_suffix = _helper_suffix
      helper_bundle_id_suffix = _helper_bundle_id
    }
  }

  bundle_data("content_shell_framework_bundle_data") {
    testonly = true
    sources = [
      "$root_out_dir/$content_shell_framework_name.framework",
    ]
    outputs = [
      "{{bundle_contents_dir}}/Frameworks/{{source_file_part}}",
    ]
    public_deps = [
      ":content_shell_framework",
    ]
  }

  bundle_data("content_shell_resources_bundle_data") {
    testonly = true
    sources = [
      "app/app.icns",
    ]
    outputs = [
      "{{bundle_resources_dir}}/{{source_file_part}}",
    ]
  }

  if (use_egl) {
    # Add the ANGLE .dylibs in the Libraries directory of the Framework.
    bundle_data("content_shell_angle_binaries") {
      sources = [
        "$root_out_dir/egl_intermediates/libEGL.dylib",
        "$root_out_dir/egl_intermediates/libGLESv2.dylib",
      ]
      outputs = [
        "{{bundle_contents_dir}}/Libraries/{{source_file_part}}",
      ]
      public_deps = [
        "//ui/gl:angle_library_copy",
      ]
    }

    # Add the SwiftShader .dylibs in the Libraries directory of the Framework.
    bundle_data("content_shell_swiftshader_binaries") {
      sources = [
        "$root_out_dir/egl_intermediates/libswiftshader_libEGL.dylib",
        "$root_out_dir/egl_intermediates/libswiftshader_libGLESv2.dylib",
      ]
      outputs = [
        "{{bundle_contents_dir}}/Libraries/{{source_file_part}}",
      ]
      public_deps = [
        "//ui/gl:swiftshader_library_copy",
      ]
    }
  }

  group("content_shell_angle_library") {
    if (use_egl) {
      deps = [
        ":content_shell_angle_binaries",
      ]
    }
  }

  group("content_shell_swiftshader_library") {
    if (use_egl) {
      deps = [
        ":content_shell_swiftshader_binaries",
      ]
    }
  }
}

mojom("mojo_bindings") {
  sources = [
    "common/power_monitor_test.mojom",
    "common/web_test.mojom",
    "common/web_test/fake_bluetooth_chooser.mojom",
    "common/web_test/web_test_bluetooth_fake_adapter_setter.mojom",
  ]
  public_deps = [
    "//mojo/public/mojom/base",
    "//skia/public/mojom",
    "//ui/gfx/geometry/mojom",
    "//url/mojom:url_mojom_gurl",
    "//url/mojom:url_mojom_origin",
  ]
}

group("content_shell_crash_test") {
  testonly = true
  data_deps = [
    ":content_shell",
    "//third_party/mesa_headers",
  ]
  data = [
    "//content/shell/tools/breakpad_integration_test.py",
    "//testing/scripts/common.py",
    "//testing/scripts/content_shell_crash_test.py",
    "//testing/xvfb.py",
  ]
  if (is_posix) {
    data += [
      "//components/crash/content/tools/generate_breakpad_symbols.py",
      "//components/crash/content/tools/dmp2minidump.py",
    ]
  }
  if (is_win) {
    data_deps += [ "//build/win:copy_cdb_to_output" ]
  }
  if (is_posix) {
    data_deps += [
      "//third_party/breakpad:dump_syms",
      "//third_party/breakpad:minidump_stackwalk",
    ]
  }
  if (is_android) {
    data_deps += [
      "//build/android:devil_chromium_py",
      "//build/android:test_runner_py",
      "//third_party/breakpad:microdump_stackwalk",
      "//third_party/breakpad:minidump_dump",
      "//third_party/breakpad:symupload",
      "//tools/android/forwarder2",
    ]
  }
}
