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

assert(is_fuchsia)

import("//build/config/fuchsia/fidl_library.gni")
import("//build/config/fuchsia/rules.gni")
import("//build/util/process_version.gni")
import("//testing/test.gni")
import("//tools/grit/repack.gni")

config("webrunner_implementation") {
  defines = [ "WEBRUNNER_IMPLEMENTATION" ]
}

fuchsia_package("webrunner_pkg") {
  binary = ":webrunner_exe"
  package_name_override = "web_runner"
  sandbox_policy = "app/sandbox_policy"
}

fuchsia_package_runner("webrunner") {
  package = ":webrunner_pkg"
  package_name_override = "web_runner"
  install_only = true
  package_deps = [ [
        ":service_pkg",
        "chromium",
      ] ]
}

executable("webrunner_exe") {
  sources = [
    "app/component_controller_impl.cc",
    "app/component_controller_impl.h",
    "app/main.cc",
    "app/web_content_runner.cc",
    "app/web_content_runner.h",
  ]
  deps = [
    ":web_fidl",
    "//base",
    "//url",
  ]
}

fuchsia_package("service_pkg") {
  binary = ":service_exe"
  package_name_override = "chromium"
  sandbox_policy = "service/sandbox_policy"
}

executable("service_exe") {
  deps = [
    ":service_lib",
    ":web_fidl",
    "//base",
    "//content/public/app:both",
    "//services/service_manager/embedder:embedder_switches",
  ]
  sources = [
    "service/web_content_service_main.cc",
  ]
}

fuchsia_package_runner("service_runner") {
  package = ":service_pkg"
  package_name_override = "chromium"
  install_only = true
}

component("service_lib") {
  deps = [
    ":service_pak",
    "//base",
    "//components/version_info",
    "//content/public/app:both",
    "//content/public/browser",
    "//content/public/child",
    "//content/public/common",
    "//content/public/renderer",
    "//services/network/public/cpp",
    "//ui/aura",
    "//ui/display",
    "//ui/ozone",
    "//ui/platform_window",
    "//ui/wm",
    "//ui/wm/public",
  ]

  data_deps = [
    ":service_pak",
  ]
  data = [
    "$root_out_dir/webrunner.pak",
  ]
  public_deps = [
    ":web_fidl",
  ]
  configs += [ ":webrunner_implementation" ]

  sources = [
    "browser/context_impl.cc",
    "browser/context_impl.h",
    "browser/frame_impl.cc",
    "browser/frame_impl.h",
    "browser/webrunner_browser_context.cc",
    "browser/webrunner_browser_context.h",
    "browser/webrunner_browser_main.cc",
    "browser/webrunner_browser_main.h",
    "browser/webrunner_browser_main_parts.cc",
    "browser/webrunner_browser_main_parts.h",
    "browser/webrunner_content_browser_client.cc",
    "browser/webrunner_content_browser_client.h",
    "browser/webrunner_net_log.cc",
    "browser/webrunner_net_log.h",
    "browser/webrunner_screen.cc",
    "browser/webrunner_screen.h",
    "browser/webrunner_url_request_context_getter.cc",
    "browser/webrunner_url_request_context_getter.h",
    "common/webrunner_content_client.cc",
    "common/webrunner_content_client.h",
    "common/webrunner_export.h",
    "service/common.cc",
    "service/common.h",
    "service/context_provider_impl.cc",
    "service/context_provider_impl.h",
    "service/context_provider_main.cc",
    "service/context_provider_main.h",
    "service/webrunner_main_delegate.cc",
    "service/webrunner_main_delegate.h",
  ]
}

repack("service_pak") {
  sources = [
    "$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/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 = [
    "//components/resources:components_resources",
    "//components/strings",
    "//content:resources",
    "//content/app/resources",
    "//content/app/strings",
    "//content/browser/devtools:resources",
    "//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",
  ]

  output = "$root_out_dir/webrunner.pak"
}

test("webrunner_browsertests") {
  sources = [
    "browser/context_impl_browsertest.cc",
    "browser/frame_impl_browsertest.cc",
    "browser/test_common.cc",
    "browser/test_common.h",
    "browser/webrunner_browser_test.cc",
    "browser/webrunner_browser_test.h",
    "browser/webrunner_test_launcher.cc",
  ]
  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
  data = [
    "browser/test/data",
  ]
  deps = [
    ":service_lib",
    ":web_fidl",
    "//base/test:test_support",
    "//content/test:test_support",
    "//net:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/ozone",
  ]
}

test("webrunner_unittests") {
  sources = [
    "service/context_provider_impl_unittest.cc",
  ]
  deps = [
    ":service_lib",
    ":web_fidl",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

fidl_library("web_fidl") {
  library_name = "web"
  namespace = "chromium"

  sources = [
    "fidl/web/context.fidl",
    "fidl/web/context_provider.fidl",
    "fidl/web/frame.fidl",
    "fidl/web/navigation_controller.fidl",
    "fidl/web/navigation_event_observer.fidl",
  ]

  public_deps = [
    "//third_party/fuchsia-sdk/sdk:gfx",
    "//third_party/fuchsia-sdk/sdk:sys",
    "//third_party/fuchsia-sdk/sdk:viewsv1",
  ]
}

# gn binary location.
if (host_os == "mac") {
  _gn_path = "//buildtools/mac/gn"
} else if (host_os == "linux") {
  _gn_path = "//buildtools/linux64/gn"
}

# Build location where all Fuchsia archive source files are placed.
_artifact_root = "$root_out_dir/fuchsia_artifacts"

# Produces a LICENSE file for webrunner and its transitive dependencies.
_license_path = "$_artifact_root/LICENSE"
action("license") {
  script = "//tools/licenses.py"
  inputs = [
    "$_gn_path",
  ]
  outputs = [
    _license_path,
  ]
  args = [
    "license_file",
    rebase_path(_license_path, root_build_dir),
    "--gn-target",
    "//webrunner:webrunner_pkg",
    "--gn-out-dir",
    ".",
  ]
}

# Extracts the numeric Chrome build ID and writes it to a file in the output
# directory.
#
# To check out the repository on the commit where the build ID was generated,
# simply call `git checkout <build-id>`, and Git will check out the commit
# associated with the <build-id> tag.
process_version("build_id") {
  template_file = "cipd/build_id.template"
  sources = [
    "//chrome/VERSION",
  ]
  output = "$_artifact_root/build_id.txt"
  process_only = true
}

# Puts copies of files at the top level of the CIPD archive's structure.
copy("restaged_packages") {
  sources = [
    "$root_gen_dir/webrunner/chromium/chromium.far",
    "$root_gen_dir/webrunner/net_http/http/http.far",
    "$root_gen_dir/webrunner/web_runner/web_runner.far",
  ]
  outputs = [
    "$_artifact_root/{{source_file_part}}",
  ]
  deps = [
    ":service_pkg",
    ":webrunner_pkg",
    "net_http:http_pkg",
  ]
}

# Specifies the build steps that must be performed before the creation of
# a CIPD archive.
group("archive_sources") {
  deps = [
    ":build_id",
    ":license",
    ":restaged_packages",
  ]
}
