# 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/ui.gni")
import("//mojo/public/mojo.gni")
import("//mojo/public/mojo_application.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//mojo/tools/embed/rules.gni")
import("//testing/test.gni")

# We don't support building in the component build since mojo apps are
# inherently components.
assert(!is_component_build)

group("shell") {
  testonly = true

  deps = [
    ":copy_symbols",
    ":mojo_shell",
    ":tests",
  ]

  if (is_android) {
    deps += [
      ":mojo_shell_apk",
      ":mojo_shell_tests_apk",
    ]
  }
}

group("tests") {
  testonly = true
  deps = [
    ":apptests",
    ":mojo_shell_tests",
    ":shell_nfc_apptests",
    "//shell/application_manager:mojo_application_manager_unittests",
  ]

  # TODO(cstout): fix breakpad build for fnl/musl
  # https://code.google.com/p/google-breakpad/issues/detail?id=631
  if ((is_android || is_linux) && !is_fnl) {
    deps += [ "//shell/crash:crash_unittests" ]
  }
}

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

if (!mojo_use_prebuilt_mojo_shell) {
  shell_common_deps = [
    ":parent_lib",
    "//base",
    "//base/allocator",
    "//build/config/sanitizers:deps",
    "//mojo/environment:chromium",
    "//mojo/message_pump",
  ]
  shell_common_data_deps = [ ":mojo_shell_child" ]

  # TODO(cstout): fix breakpad build for fnl/musl
  # (see comment above)
  if ((is_android || is_linux) && !is_fnl) {
    shell_common_deps += [ "//shell/crash" ]
  }

  if (is_android) {
    shared_library("mojo_shell") {
      sources = [
        "android/library_loader.cc",
        "android/main.cc",
        "android/main.h",
      ]

      deps = shell_common_deps + [
               ":jni_headers",
               "//gpu/config",
               "//mojo/android:libsystem_java",
               "//mojo/common",
               "//services/native_viewport:lib",
               "//shell/application_manager",
               "//ui/gl",
             ]

      data_deps = shell_common_data_deps
    }
  } else {
    executable("mojo_shell") {
      sources = [
        "desktop/main.cc",
      ]

      deps = shell_common_deps + [ ":mojo_shell_child_32_bit" ]

      data_deps = shell_common_data_deps
    }
  }

  executable("mojo_shell_child") {
    sources = [
      "child_main.cc",
    ]

    deps = [
      ":child_controller_bindings",
      ":common_lib",
      "//base",
      "//base/allocator",
      "//build/config/sanitizers:deps",
      "//mojo/edk/base_edk",
      "//mojo/edk/system",
      "//mojo/environment:chromium",
      "//mojo/message_pump",
    ]
  }

  if (current_cpu == "x86") {
    # The 32-bit version of the mojo_shell_child should be accessible in the
    # root build directory, just like the regular mojo_shell_child, so that
    # the 32-bit version can be accessed by simply adding a suffix to the path.
    copy("mojo_shell_child_32_bit_copy") {
      sources = [
        "${root_out_dir}/mojo_shell_child",
      ]
      outputs = [
        "${root_build_dir}/mojo_shell_child_32",
      ]
      deps = [
        ":mojo_shell_child",
      ]
    }
  }

  group("mojo_shell_child_32_bit") {
    # This group is required to run any 32-bit child process.
    deps = []
    if ((target_cpu == "x64" || target_cpu == "x86") && is_linux && !is_fnl) {
      # The toolchain is hardcoded as 32-bit clang here -- although it must
      # be 32 bit (for nonsfi), it assumes clang. Ideally, the toolchain would
      # be defined as the 32 bit variant of whatever is being used (be it clang,
      # gcc, or something else).
      deps = [
        ":mojo_shell_child_32_bit_copy(//build/toolchain/linux:clang_x86)",
      ]
    }
  }
}  # !mojo_use_prebuilt_mojo_shell

# Files used both by mojo_shell and mojo_shell_child (and tests).
source_set("common_lib") {
  sources = [
    "child_switches.cc",
    "child_switches.h",
    "init.cc",
    "init.h",
  ]

  deps = [
    "//base",
  ]

  public_deps = [
    ":native_application_support",
  ]
}

source_set("parent_lib") {
  sources = [
    "background_application_loader.cc",
    "background_application_loader.h",
    "child_process_host.cc",
    "child_process_host.h",
    "command_line_util.cc",
    "command_line_util.h",
    "context.cc",
    "context.h",
    "filename_util.cc",
    "filename_util.h",
    "in_process_native_runner.cc",
    "in_process_native_runner.h",
    "out_of_process_native_runner.cc",
    "out_of_process_native_runner.h",
    "switches.cc",
    "switches.h",
    "task_runners.cc",
    "task_runners.h",
    "tracer.cc",
    "tracer.h",
    "url_resolver.cc",
    "url_resolver.h",
    "url_response_disk_cache_loader.cc",
    "url_response_disk_cache_loader.h",
  ]

  deps = [
    ":child_controller_bindings",
    "//base",
    "//base:base_static",
    "//base/third_party/dynamic_annotations",
    "//mojo/application",
    "//mojo/common",
    "//mojo/common:tracing_impl",
    "//mojo/data_pipe_utils",
    "//mojo/edk/base_edk",
    "//mojo/edk/system",
    "//mojo/public/cpp/bindings",
    "//mojo/public/interfaces/application",
    "//mojo/services/media/audio/interfaces",
    "//mojo/services/media/common/interfaces",
    "//mojo/services/media/control/interfaces",
    "//mojo/services/network/interfaces",
    "//mojo/services/tracing/interfaces",
    "//services/url_response_disk_cache",
    "//shell/application_manager",
    "//url",
  ]

  public_deps = [
    ":common_lib",
  ]

  if (is_android) {
    sources += [
      "android/android_handler.cc",
      "android/android_handler.h",
      "android/android_handler_loader.cc",
      "android/android_handler_loader.h",
      "android/java_application_loader.cc",
      "android/java_application_loader.h",
      "android/native_handler_thread.cc",
      "android/native_handler_thread.h",
      "android/native_viewport_application_loader.cc",
      "android/native_viewport_application_loader.h",
      "android/ui_application_loader_android.cc",
      "android/ui_application_loader_android.h",
      "android/url_response_disk_cache_delegate_impl.cc",
      "android/url_response_disk_cache_delegate_impl.h",
    ]

    deps += [
      ":jni_headers",
      ":run_android_application_function",
      "//mojo/application:content_handler",
      "//mojo/services/content_handler/interfaces",
      "//mojo/services/gpu/interfaces",
      "//mojo/services/native_viewport/interfaces",
      "//services/gles2",
      "//services/native_viewport:lib",
    ]
  }

  if (is_mac) {
    sources -= [
      "url_response_disk_cache_loader.cc",
      "url_response_disk_cache_loader.h",
    ]

    deps -= [ "//services/url_response_disk_cache" ]
  }
}

# This is a separate target mainly since it suppresses check_includes.
# TODO(vtl): Make it so that the suppression isn't needed.
source_set("native_application_support") {
  sources = [
    "native_application_support.cc",
    "native_application_support.h",
  ]

  public_deps = [
    "//mojo/public/cpp/bindings",
  ]

  deps = [
    "//base",
    "//mojo/gles2:control_thunks",
    "//mojo/gles2:gles2",
    "//mojo/gles2:mgl",
  ]

  # This target has to include the public thunk headers, which generally
  # shouldn't be included without picking an implementation. We are providing
  # the implementation but the thunk header target cannot declare that we are
  # permitted to include it since it's in the public SDK and we are not.
  # Suppress include checking so we can still check the rest of the targets in
  # this file.
  check_includes = false
}

if (is_android) {
  generate_jni("jni_headers") {
    sources = [
      "android/apk/src/org/chromium/mojo/shell/AndroidHandler.java",
      "android/apk/src/org/chromium/mojo/shell/Bootstrap.java",
      "android/apk/src/org/chromium/mojo/shell/JavaApplicationRegistry.java",
      "android/apk/src/org/chromium/mojo/shell/NativeHandlerThread.java",
      "android/apk/src/org/chromium/mojo/shell/ShellService.java",
      "android/tests/src/org/chromium/mojo/shell/ShellTestBase.java",
    ]
    jni_package = "mojo/shell"
  }

  android_library("bootstrap_java") {
    java_files = [ "android/apk/src/org/chromium/mojo/shell/Bootstrap.java" ]

    deps = [
      "//base:base_java",
    ]

    dex_path = "$target_out_dir/bootstrap_java.dex.jar"
  }

  shared_library("bootstrap") {
    sources = [
      "android/bootstrap.cc",
    ]
    deps = [
      ":jni_headers",
      ":run_android_application_function",
      "//base",
    ]
  }

  # Shared header between the bootstrap and the main shell .so.
  source_set("run_android_application_function") {
    sources = [
      "android/run_android_application_function.h",
    ]

    deps = [
      "//base",
    ]
  }

  android_library("java") {
    java_files = [
      "android/apk/src/org/chromium/mojo/shell/AndroidFactory.java",
      "android/apk/src/org/chromium/mojo/shell/AndroidHandler.java",
      "android/apk/src/org/chromium/mojo/shell/BaseActivity.java",
      "android/apk/src/org/chromium/mojo/shell/FileHelper.java",
      "android/apk/src/org/chromium/mojo/shell/InputFactory.java",
      "android/apk/src/org/chromium/mojo/shell/IntentReceiverActivity.java",
      "android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java",
      "android/apk/src/org/chromium/mojo/shell/JavaApplicationRegistry.java",
      "android/apk/src/org/chromium/mojo/shell/KeyboardFactory.java",
      "android/apk/src/org/chromium/mojo/shell/MojoShellActivity.java",
      "android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java",
      "android/apk/src/org/chromium/mojo/shell/NativeHandlerThread.java",
      "android/apk/src/org/chromium/mojo/shell/NativeViewportSupportApplicationDelegate.java",
      "android/apk/src/org/chromium/mojo/shell/NfcApplicationDelegate.java",
      "android/apk/src/org/chromium/mojo/shell/NfcDbManager.java",
      "android/apk/src/org/chromium/mojo/shell/NfcImpl.java",
      "android/apk/src/org/chromium/mojo/shell/NfcReceiverActivity.java",
      "android/apk/src/org/chromium/mojo/shell/NfcServiceFactoryBinder.java",
      "android/apk/src/org/chromium/mojo/shell/SharingActivity.java",
      "android/apk/src/org/chromium/mojo/shell/SharingApplicationDelegate.java",
      "android/apk/src/org/chromium/mojo/shell/ShellService.java",
      "android/apk/src/org/chromium/mojo/shell/ViewportActivity.java",
      "android/apk/src/org/chromium/mojo/shell/VsyncFactory.java",
    ]

    deps = [
      ":resources",
      "//base:base_java",
      "//mojo/android:system_java",
      "//mojo/public/interfaces/application:application_java",
      "//mojo/public/java:application",
      "//mojo/public/java:bindings",
      "//mojo/public/java:system",
      "//mojo/services/android/interfaces:interfaces_java",
      "//mojo/services/input/interfaces:interfaces_java",
      "//mojo/services/keyboard/interfaces:interfaces_java",
      "//mojo/services/nfc/interfaces:interfaces_java",
      "//mojo/services/vsync/interfaces:interfaces_java",
      "//services/android",
      "//services/authentication",
      "//services/input",
      "//services/intent_receiver:bindings_java",
      "//services/keyboard",
      "//services/location",
      "//services/native_viewport:interfaces_java",
      "//services/native_viewport:native_viewport_java",
      "//services/nfc_message_sink:bindings_java",
      "//services/sharing_sink:bindings_java",
      "//services/vsync",
      "//third_party/android_tools:android_support_v13_java",
      "//ui/gl:gl_java",
    ]
  }

  if (is_official_build) {
    icon_dir = "android/apk/res-official"
  } else {
    icon_dir = "android/apk/res-dev"
  }

  android_resources("resources") {
    resource_dirs = [
      "android/apk/res",
      icon_dir,
    ]
    custom_package = "org.chromium.mojo.shell"
  }

  mojo_shell_assets_dir = "$root_build_dir/mojo_shell_assets"
  mojo_shell_test_assets_dir = "$root_build_dir/mojo_shell_test_assets"

  copy_ex("copy_mojo_shell_assets") {
    clear_dir = true
    dest = mojo_shell_assets_dir
    sources = [
      "$root_out_dir/exe.stripped/mojo_shell_child",
      "$root_out_dir/lib.stripped/libbootstrap.so",
      "$root_out_dir/network_service.mojo",
      "$root_out_dir/obj/shell/bootstrap_java.dex.jar",
    ]
    deps = [
      ":bootstrap",
      ":bootstrap_java",
      ":mojo_shell_child",
      "//mojo/public/tools:copy_network_service",
    ]

    if (!is_debug) {
      sources += [
        "$root_out_dir/authenticating_url_loader_interceptor.mojo",
        "$root_out_dir/dart_content_handler.mojo",
        "$root_out_dir/device_info.mojo",
        "$root_out_dir/icu_data.mojo",
        "$root_out_dir/java_handler.mojo",
        "$root_out_dir/tracing.mojo",
      ]

      deps += [
        "//services/authenticating_url_loader_interceptor",
        "//services/dart:dart_content_handler",
        "//services/device_info",
        "//services/icu_data",
        "//services/java_handler",
        "//services/tracing",
      ]
    }
  }

  copy_ex("copy_mojo_shell_test_assets") {
    clear_dir = true
    dest = mojo_shell_test_assets_dir
    sources = [
      "$root_out_dir/test_app.mojo",
      "$root_out_dir/test_request_tracker_app.mojo",
    ]
    deps = [
      "//services/test_service:test_app",
      "//services/test_service:test_request_tracker_app",
    ]
  }

  if (!is_official_build) {
    manifest_package = "org.chromium.mojo.shell"
    apk_name = "Mojo Shell (dev)"
    debuggable = "true"
  } else {
    manifest_package = "io.mojoapps.launcher"
    apk_name = "Mojo Shell"
    debuggable = "false"
  }

  if (is_official_build) {
    # Force GN to re-generate ninja files when a new commit is present.
    read_file("//.git/index", "")
    version_code =
        exec_script("//mojo/public/tools/gn/last_commit_timestamp.py",
                    [
                      "--directory",
                      rebase_path("//", root_build_dir),
                    ],
                    "trim string")

    # Download the keystore for signing.
    keystore_path = "$root_build_dir/mojo_shell-official.keystore"
    action("download_keystore") {
      script = "//mojo/tools/download_keystore.py"
      outputs = [
        keystore_path,
      ]
      args = [
        "keystore_file",
        rebase_path(keystore_path, root_build_dir),
      ]
    }
    keystore_password = exec_script("//mojo/tools/download_keystore.py",
                                    [ "keystore_password" ],
                                    "trim string")
  } else {
    version_code = "1"
  }
  version_name = "0.0.1"

  jinja_variables = [
    "manifest_package=$manifest_package",
    "apk_name=$apk_name",
    "debuggable=$debuggable",
    "version_code=$version_code",
    "version_name=$version_name",
  ]

  mojo_shell_manifest =
      "$target_gen_dir/mojo_shell_manifest/AndroidManifest.xml"

  jinja_template("mojo_shell_manifest") {
    variables = jinja_variables
    input = "android/apk/AndroidManifest.xml.jinja2"
    output = mojo_shell_manifest
  }

  android_apk("mojo_shell_apk") {
    apk_name = "MojoShell"

    android_manifest = mojo_shell_manifest

    native_libs = [ "libmojo_shell.so" ]

    asset_location = mojo_shell_assets_dir

    deps = [
      ":copy_mojo_shell_assets",
      ":java",
      ":mojo_shell",
      ":mojo_shell_manifest",
      ":resources",
      "//base:base_java",
      "//services/native_viewport:native_viewport_java",
      "//third_party/android_tools:google_play_services_default_resources",
    ]

    if (is_official_build) {
      deps += [ ":download_keystore" ]
      keystore_path = keystore_path
      keystore_name = "official"
      keystore_password = keystore_password
    }
  }

  android_library("mojo_shell_tests_java") {
    java_files =
        [ "android/tests/src/org/chromium/mojo/shell/ShellTestBase.java" ]

    deps = [
      ":java",
      "//base:base_java",
    ]
  }
}

mojom("child_controller_bindings") {
  sources = [
    "child_controller.mojom",
  ]

  deps = [
    "//mojo/public/interfaces/application",
  ]
}

test("mojo_shell_tests") {
  sources = [
    "background_application_loader_unittest.cc",
    "child_process_host_unittest.cc",
    "command_line_util_unittest.cc",
    "context_unittest.cc",
    "data_pipe_peek_unittest.cc",
    "in_process_native_runner_unittest.cc",
    "native_runner_unittest.cc",
    "shell_test_base.cc",
    "shell_test_base.h",
    "shell_test_base_android.cc",
    "shell_test_base_unittest.cc",
    "shell_test_main.cc",
    "url_resolver_unittest.cc",
  ]

  deps = [
    ":parent_lib",
    "//base",
    "//base:i18n",
    "//base/test:test_support",
    "//mojo/common",
    "//mojo/edk/system",
    "//mojo/environment:chromium",
    "//mojo/message_pump",
    "//mojo/public/cpp/bindings",
    "//services/test_service:bindings",
    "//shell/application_manager",
    "//testing/gtest",
    "//url",
  ]

  data_deps = [
    ":mojo_shell_child",
    "//services/test_service:test_app",
    "//services/test_service:test_request_tracker_app",
  ]

  if (is_android) {
    deps += [ ":jni_headers" ]

    apk_deps = [
      ":copy_mojo_shell_test_assets",
      ":mojo_shell_tests_java",
    ]

    apk_asset_location = mojo_shell_test_assets_dir
  }
}

# Shared library propagation will happen up to executable, shared library,
# or complete static library boundaries.
# Workaround from brettw to prevent gn from linking pingable app into the
# apptests executable.
static_library("pingable_app_dummy") {
  complete_static_lib = true
  testonly = true
  public_deps = [
    "//shell/test:pingable_app($default_toolchain)",
  ]
  sources = [
    "pingable_app_dummy_empty.cc",
  ]
}

embed_file("embed_pingable") {
  source = "$root_build_dir/pingable_app.mojo"
  namespace = "shell::test"
  variable = "kPingable"
  testonly = true
  deps = [
    ":pingable_app_dummy",
  ]
}

mojo_native_application("apptests") {
  output_name = "shell_apptests"

  testonly = true

  sources = [
    "shell_apptest.cc",
  ]

  deps = [
    ":embed_pingable",
    "//base",
    "//mojo/application",
    "//mojo/application:test_support",
    "//mojo/converters/base",
    "//mojo/data_pipe_utils",
    "//mojo/public/cpp/bindings:callback",
    "//mojo/public/cpp/environment",
    "//mojo/public/cpp/system:system",
    "//mojo/public/interfaces/application",
    "//mojo/services/http_server/cpp",
    "//mojo/services/http_server/interfaces",
    "//mojo/services/network/interfaces",
    "//shell/test:bindings",
  ]

  data_deps = [
    "//services/http_server:http_server($default_toolchain)",
  ]
}

mojo_native_application("shell_nfc_apptests") {
  output_name = "shell_nfc_apptests"

  testonly = true

  sources = [
    "android/nfc_apptest.cc",
  ]

  deps = [
    "//base",
    "//mojo/application",
    "//mojo/application:test_support",
    "//mojo/common:common",
    "//mojo/public/cpp/bindings:callback",
    "//mojo/public/cpp/environment",
    "//mojo/public/cpp/system:system",
    "//mojo/services/nfc/interfaces",
    "//shell/test:bindings",
  ]
}

copy("copy_symbols") {
  testonly = true

  deps = [
    ":mojo_shell",
    ":mojo_shell_child",
  ]
  if (is_android) {
    deps += [ ":bootstrap" ]
  }

  sources = [
    "${root_out_dir}/mojo_shell_child",
  ]
  if (is_android) {
    sources += [
      "${root_out_dir}/libbootstrap.so",
      "${root_out_dir}/libmojo_shell.so",
    ]
  } else {
    sources += [ "${root_out_dir}/mojo_shell" ]
  }

  outputs = [
    "${root_out_dir}/symbols/{{source_file_part}}",
  ]
}
