# 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.

# App different than the regular content subcomponents (see comments in
# //content/BUILD.gn) because it has to support the browser/child process split
# (the "both" target include both browser and child process files and is used
# for testing).
#
# In non-component mode, browser, child, and both all follow the same structure:
# foo ->
#   //content/public/app:child (group) ->
#     //content/public/app:child_sources (source set) ->
#       //content/app:child (source set)

# In component mode, content is linked as one big turd so there is only one
# app target containing sources ("both") and the other ones forward to it:
# foo ->
#   //content/public/app:child (group; "browser" and "both" ones look the same)
#     //content (shared library) ->
#       //content/public/app:both_sources (source set)

import("//build/config/chrome_build.gni")
import("//build/config/ui.gni")
import("//chromeos/assistant/assistant.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
import("//ui/base/ui_features.gni")

public_app_shared_sources = [
  "content_jni_onload.h",
  "content_main.h",
  "content_main_delegate.cc",
  "content_main_delegate.h",
  "content_main_runner.h",
  "sandbox_helper_win.h",
]

public_app_shared_deps = [
  "//base",
  "//base:i18n",
  "//content:export",
  "//content/public/common:common_sources",
  "//services/service_manager/background:lib",
  "//services/service_manager/embedder",
  "//services/service_manager/public/cpp",
]

if (enable_mus) {
  public_app_shared_deps += [ "//ui/aura" ]
}

if (is_component_build) {
  source_set("both_sources") {
    # Only the main content shared library can pull this in.
    visibility = [ "//content:content" ]

    sources = public_app_shared_sources

    configs += [ "//content:content_implementation" ]

    deps = public_app_shared_deps + [
             "//content/app:both",
             "//content/public/browser:browser_sources",
             "//content/public/gpu:gpu_sources",
             "//content/public/renderer:renderer_sources",
             "//content/public/utility:utility_sources",
           ]

    allow_circular_includes_from = [
      # This target is a pair with the non-public version. They always go
      # together and include headers from each other.
      "//content/app:both",
    ]
  }

  # These all just forward to content, which in turn depends on "both_sources".
  group("browser") {
    public_deps = [
      "//content",
    ]
  }
  group("child") {
    public_deps = [
      "//content",
    ]
  }
  group("both") {
    public_deps = [
      "//content",
    ]
  }
} else {
  # content_main_delegate.cc conditionally includes content_browser_client.h
  # from //content/public/browser when it's not the child build. However,
  # the header checker doesn't know this doesn't apply and throws an error.
  # So all of these targets set check_includes = false.
  #
  # TODO(brettw) either teach the header checker to understand simple
  # ifdefs or split the file apart so we can enable header checking here.
  # Furthermore, since this file exists in more than one target, they all
  # have to opt-out of header checking (a file is checked once for all
  # targets using a source file).

  source_set("both") {
    check_includes = false  # See comment above.

    sources = public_app_shared_sources
    configs += [ "//content:content_implementation" ]
    deps = public_app_shared_deps + [
             "//content/app:both",
             "//content/public/browser",
             "//content/public/common",
             "//content/public/gpu:gpu_sources",
             "//content/public/renderer:renderer_sources",
             "//content/public/utility:utility_sources",
           ]

    allow_circular_includes_from = [
      # This target is a pair with the non-public version. They always go
      # together and include headers from each other.
      "//content/app:both",
    ]
  }

  if (is_multi_dll_chrome) {
    source_set("browser") {
      check_includes = false  # See comment above.

      sources = public_app_shared_sources

      defines = [ "CHROME_MULTIPLE_DLL_BROWSER" ]
      configs += [ "//content:content_implementation" ]

      deps = public_app_shared_deps + [
               "//content/app:browser",
               "//content/public/browser",
               "//content/public/common",
             ]

      allow_circular_includes_from = [
        # This target is a pair with the non-public version. They always go
        # together and include headers from each other.
        "//content/app:browser",
      ]
    }

    source_set("child") {
      check_includes = false  # See comment above.

      sources = public_app_shared_sources

      defines = [ "CHROME_MULTIPLE_DLL_CHILD" ]
      configs += [ "//content:content_implementation" ]

      deps = public_app_shared_deps + [
               "//content/app:child",
               "//content/public/common",
             ]

      allow_circular_includes_from = [
        # This target is a pair with the non-public version. They always go
        # together and include headers from each other.
        "//content/app:child",
      ]
    }
  } else {
    # When the multi-DLL build is disabled, there is only one type of the
    # "app" target, and "browser" and "child" are the same as "both".
    group("browser") {
      deps = [
        ":both",
      ]
    }
    group("child") {
      deps = [
        ":both",
      ]
    }
  }
}

service_manifest("packaged_services_manifest") {
  name = "content_packaged_services"
  source = "mojo/content_packaged_services_manifest.json"
  packaged_services = [
    "//components/services/heap_profiling:manifest",
    "//media/mojo/services:cdm_manifest",
    "//media/mojo/services:media_manifest",
    "//services/audio:manifest",
    "//services/data_decoder:manifest",
    "//services/device:manifest",
    "//services/media_session:manifest",
    "//services/metrics:manifest",
    "//services/network:manifest",
    "//services/resource_coordinator:manifest",
    "//services/shape_detection:manifest",
    "//services/tracing:manifest",
    "//services/video_capture:manifest",
    "//services/viz:manifest",
  ]

  if (is_linux) {
    packaged_services += [ "//components/services/font:manifest" ]
  }

  if (enable_cros_libassistant) {
    packaged_services +=
        [ "//chromeos/services/assistant/audio_decoder:manifest" ]
  }
}

service_manifest("browser_manifest") {
  name = "content_browser"
  source = "mojo/content_browser_manifest.json"
  packaged_services = [
    "//services/content:manifest",
    "//services/file:manifest",
  ]
}

service_manifest("gpu_manifest") {
  name = "content_gpu"
  source = "mojo/content_gpu_manifest.json"
}

service_manifest("plugin_manifest") {
  name = "content_plugin"
  source = "mojo/content_plugin_manifest.json"
}

service_manifest("snapshot_manifest") {
  if (use_v8_context_snapshot) {
    source = "mojo/context_snapshot_manifest.json"
  } else {
    source = "mojo/snapshot_blob_manifest.json"
  }
}

service_manifest("renderer_manifest") {
  name = "content_renderer"
  source = "mojo/content_renderer_manifest.json"
  overlays = [ ":snapshot_manifest" ]
}

service_manifest("utility_manifest") {
  name = "content_utility"
  source = "mojo/content_utility_manifest.json"
  overlays = [ ":snapshot_manifest" ]
}
