# 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/web/sandbox_policy"
}

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

source_set("webrunner_common") {
  sources = [
    "app/common/web_component.cc",
    "app/common/web_component.h",
    "app/common/web_content_runner.cc",
    "app/common/web_content_runner.h",
  ]
  deps = [
    ":web_fidl",
    "//base",
    "//url",
  ]
}

executable("webrunner_exe") {
  sources = [
    "app/web/main.cc",
  ]
  deps = [
    ":web_fidl",
    ":webrunner_common",
    "//base",
  ]
}

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