# 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("//services/service_manager/public/service_manifest.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 = [
    "//content/network:manifest",
    "//media/mojo/services:cdm_manifest",
    "//media/mojo/services:media_manifest",
    "//services/data_decoder:manifest",
    "//services/device:manifest",
    "//services/metrics:manifest",
    "//services/resource_coordinator:manifest",
    "//services/shape_detection:manifest",
    "//services/video_capture:manifest",
    "//services/viz:manifest",
  ]

  if (enable_mus) {
    packaged_services += [ "//services/ui:manifest" ]
  }
}

service_manifest("browser_manifest") {
  name = "content_browser"
  source = "mojo/content_browser_manifest.json"
  packaged_services = [ "//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("renderer_manifest") {
  name = "content_renderer"
  source = "mojo/content_renderer_manifest.json"
}

service_manifest("utility_manifest") {
  name = "content_utility"
  source = "mojo/content_utility_manifest.json"
}
