# Copyright 2017 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/buildflag_header.gni")
import("//chrome/browser/vr/features.gni")
import("//chrome/common/features.gni")
import("//device/vr/buildflags/buildflags.gni")
import("//testing/test.gni")
import("//tools/grit/repack.gni")

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

assert(enable_vr)

buildflag_header("vr_build_features") {
  header = "vr_features.h"
  flags = [ "USE_VR_ASSETS_COMPONENT=$use_vr_assets_component" ]
}

source_set("vr_gl_utils") {
  sources = [
    "vr_gl_util.cc",
    "vr_gl_util.h",
  ]

  deps = [
    "//skia",
    "//ui/gl/init",
  ]
}

source_set("vr_ui") {
  sources = [
    "animation.cc",
    "animation.h",
    "audio_delegate.h",
    "content_input_delegate.cc",
    "content_input_delegate.h",
    "databinding/binding.h",
    "databinding/binding_base.h",
    "databinding/vector_binding.h",
    "databinding/vector_element_binding.h",
    "elements/button.cc",
    "elements/button.h",
    "elements/content_element.cc",
    "elements/content_element.h",
    "elements/controller.cc",
    "elements/controller.h",
    "elements/corner_radii.h",
    "elements/disc_button.cc",
    "elements/disc_button.h",
    "elements/draw_phase.cc",
    "elements/draw_phase.h",
    "elements/environment/background.cc",
    "elements/environment/background.h",
    "elements/environment/grid.cc",
    "elements/environment/grid.h",
    "elements/environment/stars.cc",
    "elements/environment/stars.h",
    "elements/full_screen_rect.cc",
    "elements/full_screen_rect.h",
    "elements/indicator_spec.cc",
    "elements/indicator_spec.h",
    "elements/invisible_hit_target.cc",
    "elements/invisible_hit_target.h",
    "elements/keyboard.cc",
    "elements/keyboard.h",
    "elements/laser.cc",
    "elements/laser.h",
    "elements/linear_layout.cc",
    "elements/linear_layout.h",
    "elements/omnibox_formatting.cc",
    "elements/omnibox_formatting.h",
    "elements/omnibox_text_field.cc",
    "elements/omnibox_text_field.h",
    "elements/oval.cc",
    "elements/oval.h",
    "elements/paged_grid_layout.cc",
    "elements/paged_grid_layout.h",
    "elements/paged_scroll_view.cc",
    "elements/paged_scroll_view.h",
    "elements/platform_ui_element.cc",
    "elements/platform_ui_element.h",
    "elements/rect.cc",
    "elements/rect.h",
    "elements/render_text_wrapper.cc",
    "elements/render_text_wrapper.h",
    "elements/repositioner.cc",
    "elements/repositioner.h",
    "elements/resizer.cc",
    "elements/resizer.h",
    "elements/reticle.cc",
    "elements/reticle.h",
    "elements/scaled_depth_adjuster.cc",
    "elements/scaled_depth_adjuster.h",
    "elements/scrollable_element.cc",
    "elements/scrollable_element.h",
    "elements/shadow.cc",
    "elements/shadow.h",
    "elements/spinner.cc",
    "elements/spinner.h",
    "elements/text.cc",
    "elements/text.h",
    "elements/text_button.cc",
    "elements/text_button.h",
    "elements/text_input.cc",
    "elements/text_input.h",
    "elements/textured_element.cc",
    "elements/textured_element.h",
    "elements/throbber.cc",
    "elements/throbber.h",
    "elements/transient_element.cc",
    "elements/transient_element.h",
    "elements/ui_element.cc",
    "elements/ui_element.h",
    "elements/ui_element_name.cc",
    "elements/ui_element_name.h",
    "elements/ui_element_type.cc",
    "elements/ui_element_type.h",
    "elements/ui_texture.cc",
    "elements/ui_texture.h",
    "elements/url_text.cc",
    "elements/url_text.h",
    "elements/vector_icon.cc",
    "elements/vector_icon.h",
    "elements/vector_icon_button.cc",
    "elements/vector_icon_button.h",
    "elements/viewport_aware_root.cc",
    "elements/viewport_aware_root.h",
    "exit_vr_prompt_choice.h",
    "font_fallback.cc",
    "font_fallback.h",
    "frame_lifecycle.cc",
    "frame_lifecycle.h",
    "ganesh_surface_provider.cc",
    "ganesh_surface_provider.h",
    "keyboard_delegate.h",
    "keyboard_ui_interface.h",
    "macros.h",
    "mode.h",
    "model/color_scheme.cc",
    "model/color_scheme.h",
    "model/modal_prompt_type.cc",
    "model/modal_prompt_type.h",
    "model/model.cc",
    "model/model.h",
    "model/platform_toast.cc",
    "model/platform_toast.h",
    "model/tab_model.cc",
    "model/tab_model.h",
    "renderers/base_quad_renderer.cc",
    "renderers/base_quad_renderer.h",
    "renderers/base_renderer.cc",
    "renderers/base_renderer.h",
    "renderers/external_textured_quad_renderer.cc",
    "renderers/external_textured_quad_renderer.h",
    "renderers/radial_gradient_quad_renderer.cc",
    "renderers/radial_gradient_quad_renderer.h",
    "renderers/textured_quad_renderer.cc",
    "renderers/textured_quad_renderer.h",
    "renderers/transparent_quad_renderer.cc",
    "renderers/transparent_quad_renderer.h",
    "renderers/web_vr_renderer.cc",
    "renderers/web_vr_renderer.h",
    "sequence.cc",
    "sequence.h",
    "target_property.cc",
    "target_property.h",
    "transition.cc",
    "transition.h",
    "ui.cc",
    "ui.h",
    "ui_browser_interface.h",
    "ui_element_renderer.cc",
    "ui_element_renderer.h",
    "ui_input_manager.cc",
    "ui_input_manager.h",
    "ui_interface.h",
    "ui_renderer.cc",
    "ui_renderer.h",
    "ui_scene.cc",
    "ui_scene.h",
    "ui_scene_creator.cc",
    "ui_scene_creator.h",
    "ui_support.cc",
    "ui_support.h",
    "ui_test_input.cc",
    "ui_test_input.h",
    "ui_unsupported_mode.h",
    "vr_ui_export.h",
  ]

  public_deps = [
    "//ui/gl",
  ]

  deps = [
    ":vr_base",
    ":vr_gl_utils",
    "//base",
    "//cc/animation",
    "//chrome/app:generated_resources",
    "//chrome/browser/vr/vector_icons",
    "//components/omnibox/browser",
    "//components/toolbar:vector_icons",
    "//components/url_formatter",
    "//components/vector_icons",
    "//media",
    "//net",
    "//skia",
    "//ui/base",
  ]

  defines = [
    "VR_IMPLEMENTATION",
    "VR_BASE_IMPLEMENTATION",
    "VR_UI_IMPLEMENTATION",
  ]
}

component("vr_common") {
  sources = [
    "browser_ui_interface.h",
    "controller_delegate.h",
    "controller_delegate_for_testing.cc",
    "controller_delegate_for_testing.h",
    "fps_meter.cc",
    "fps_meter.h",
    "gesture_detector.cc",
    "gesture_detector.h",
    "graphics_delegate.cc",
    "graphics_delegate.h",
    "model/camera_model.h",
    "model/capturing_state_model.h",
    "model/hosted_platform_ui.h",
    "model/reticle_model.h",
    "model/speech_recognition_model.h",
    "model/ui_mode.h",
    "model/web_vr_model.h",
    "render_loop.cc",
    "render_loop.h",
    "render_loop_browser_interface.h",
    "sample_queue.cc",
    "sample_queue.h",
    "service/browser_xr_runtime.cc",
    "service/browser_xr_runtime.h",
    "service/isolated_device_provider.cc",
    "service/isolated_device_provider.h",
    "service/vr_service_impl.cc",
    "service/vr_service_impl.h",
    "service/xr_device_impl.cc",
    "service/xr_device_impl.h",
    "service/xr_runtime_manager.cc",
    "service/xr_runtime_manager.h",
    "sliding_average.cc",
    "sliding_average.h",
    "sounds_manager_audio_delegate.cc",
    "sounds_manager_audio_delegate.h",
    "speech_recognizer.cc",
    "speech_recognizer.h",
    "text_input_delegate.cc",
    "text_input_delegate.h",
    "toolbar_helper.cc",
    "toolbar_helper.h",
    "ui_factory.cc",
    "ui_factory.h",
    "ui_interface.h",
    "vr_export.h",
  ]

  public_deps = [
    ":vr_base",
    "//ui/gl",
  ]

  deps = [
    ":vr_build_features",
    ":vr_gl_utils",
    ":vr_ui",
    "//base",
    "//cc/animation",
    "//cc/paint",
    "//chrome/app:generated_resources",
    "//chrome/browser/vr/vector_icons",
    "//chrome/common:constants",
    "//components/omnibox/browser",
    "//components/rappor/public:public",
    "//components/security_state/core",
    "//components/strings",
    "//components/toolbar",
    "//components/toolbar:vector_icons",
    "//components/ukm/content",
    "//components/vector_icons",
    "//content/public/browser",
    "//content/public/common",
    "//device/vr",
    "//device/vr/buildflags:buildflags",
    "//device/vr/public/mojom",
    "//media",
    "//net",
    "//services/metrics/public/cpp:ukm_builders",
    "//skia",
    "//ui/base",
    "//ui/display",
    "//ui/gl/init",
  ]

  defines = [
    "VR_IMPLEMENTATION",
    "VR_BASE_IMPLEMENTATION",
    "VR_UI_IMPLEMENTATION",
  ]
}

# vr_base contains common dependencies of vr_common and vr_ui. It exists because
# vr_ui must not depend on vr_common.
source_set("vr_base") {
  sources = [
    "assets_component_update_status.h",
    "assets_load_status.h",
    "assets_loader.cc",
    "assets_loader.h",
    "input_event.cc",
    "input_event.h",
    "metrics/metrics_helper.cc",
    "metrics/metrics_helper.h",
    "metrics/session_metrics_helper.cc",
    "metrics/session_metrics_helper.h",
    "model/assets.cc",
    "model/assets.h",
    "model/controller_model.cc",
    "model/controller_model.h",
    "model/omnibox_suggestions.cc",
    "model/omnibox_suggestions.h",
    "model/text_input_info.cc",
    "model/text_input_info.h",
    "model/toolbar_state.cc",
    "model/toolbar_state.h",
    "platform_input_handler.h",
    "platform_ui_input_delegate.cc",
    "platform_ui_input_delegate.h",
    "pose_util.cc",
    "pose_util.h",
    "text_edit_action.cc",
    "text_edit_action.h",
    "ui_initial_state.cc",
    "ui_initial_state.h",
    "vr_base_export.h",
    "vr_geometry_util.cc",
    "vr_geometry_util.h",
  ]

  defines = [
    "VR_IMPLEMENTATION",
    "VR_BASE_IMPLEMENTATION",
    "VR_UI_IMPLEMENTATION",
  ]

  deps = [
    "//base",
    "//components/rappor:rappor",
    "//components/ukm/content",
    "//components/url_formatter",
    "//media",
    "//net",
    "//services/metrics/public/cpp:ukm_builders",
    "//skia",
  ]
}

test("vr_common_unittests") {
  sources = [
    "animation_unittest.cc",
    "databinding/binding_unittest.cc",
    "databinding/vector_binding_unittest.cc",
    "elements/button_unittest.cc",
    "elements/content_element_unittest.cc",
    "elements/disc_button_unittest.cc",
    "elements/linear_layout_unittest.cc",
    "elements/omnibox_formatting_unittest.cc",
    "elements/omnibox_text_field_unittest.cc",
    "elements/oval_unittest.cc",
    "elements/paged_grid_layout_unittest.cc",
    "elements/rect_unittest.cc",
    "elements/repositioner_unittest.cc",
    "elements/resizer_unittest.cc",
    "elements/scaled_depth_adjuster_unittest.cc",
    "elements/scrollable_element_unittest.cc",
    "elements/shadow_unittest.cc",
    "elements/spinner_unittest.cc",
    "elements/text_input_unittest.cc",
    "elements/text_unittest.cc",
    "elements/throbber_unittest.cc",
    "elements/transient_element_unittest.cc",
    "elements/ui_element_unittest.cc",
    "elements/url_text_unittest.cc",
    "elements/vector_icon_button_unittest.cc",
    "elements/vector_icon_unittest.cc",
    "elements/viewport_aware_root_unittest.cc",
    "fps_meter_unittest.cc",
    "gesture_detector_unittest.cc",
    "model/text_input_info_unittest.cc",
    "platform_ui_input_delegate_unittest.cc",
    "service/xr_runtime_manager_unittest.cc",
    "sliding_average_unittest.cc",
    "speech_recognizer_unittest.cc",
    "test/paths.cc",
    "test/paths.h",
    "test/run_all_unittests.cc",
    "test/ui_test.cc",
    "test/ui_test.h",
    "ui_input_manager_unittest.cc",
    "ui_scene_unittest.cc",
    "ui_unittest.cc",
    "vr_geometry_util_unittest.cc",
  ]

  # TODO(mthiesse, crbug.com/769373): The dependency on device/vr:fakes requires
  # some workarounds for tests, since we are static-linking to the fakes instead
  # of loading them from a dll on Windows.
  defines = [ "DEVICE_VR_IMPLEMENTATION" ]

  deps = [
    ":vr_test_support",
    "//components/url_formatter",
    "//mojo/public/cpp/bindings",
    "//services/network:test_support",
    "//testing/gmock",
    "//ui/gfx/geometry",
  ]
  if (is_android) {
    deps += [ "//ui/android:ui_java" ]
  }
}

test("vr_pixeltests") {
  testonly = true

  sources = [
    "test/run_all_pixeltests.cc",
    "test/ui_pixel_test.cc",
    "test/ui_pixel_test.h",
    "ui_pixeltest.cc",
  ]

  deps = [
    ":vr_gl_test_support",
    ":vr_test_support",
  ]
  if (is_android) {
    deps += [ "//ui/android:ui_java" ]
  }
}

test("vr_common_perftests") {
  sources = [
    "test/run_all_perftests.cc",
    "text_perftest.cc",
  ]
  deps = [
    ":vr_gl_test_support",
    ":vr_test_support",
    "//testing/perf",
  ]
  if (is_android) {
    deps += [ "//ui/android:ui_java" ]
  }

  # Needed for isolate script to execute
  data_deps = [
    "//testing:run_perf_test",
  ]
}

source_set("vr_test_support") {
  testonly = true

  sources = [
    "test/animation_utils.cc",
    "test/animation_utils.h",
    "test/constants.cc",
    "test/constants.h",
    "test/mock_browser_ui_interface.cc",
    "test/mock_browser_ui_interface.h",
    "test/mock_content_input_delegate.cc",
    "test/mock_content_input_delegate.h",
    "test/mock_keyboard_delegate.cc",
    "test/mock_keyboard_delegate.h",
    "test/mock_render_text.cc",
    "test/mock_render_text.h",
    "test/mock_text_input_delegate.cc",
    "test/mock_text_input_delegate.h",
    "test/mock_ui_browser_interface.cc",
    "test/mock_ui_browser_interface.h",
    "test/vr_test_suite.cc",
    "test/vr_test_suite.h",
  ]

  public_deps = [
    ":vr_common",
    ":vr_test_pak",
    "//base/test:test_support",
    "//cc:test_support",
    "//components/security_state/core",
    "//components/toolbar:vector_icons",
    "//content/test:test_support",
    "//mojo/core/embedder",
    "//skia",
    "//testing/gtest",
    "//ui/accessibility:ax_enums_mojo",
    "//ui/gfx:test_support",

    # TODO(mthiesse, crbug.com/769373): Remove dependency on device/vr:fakes.
    "//device/vr:fakes",

    # TODO(cjgrant): Figure out why including //ui/android:ui_java here
    # doesn't propagate to individual test executable targets.
  ]

  data = [
    "$root_out_dir/vr_test.pak",
  ]
}

source_set("vr_gl_test_support") {
  testonly = true

  sources = [
    "test/gl_test_environment.cc",
    "test/gl_test_environment.h",
    "test/gl_test_environment_unittest.cc",
  ]

  public_deps = [
    "//base/test:test_support",
    "//skia",
    "//ui/gl",
  ]
}

repack("vr_test_pak") {
  sources = [
    "$root_gen_dir/chrome/generated_resources_en-US.pak",
    "$root_gen_dir/components/components_resources.pak",
    "$root_gen_dir/components/strings/components_strings_en-US.pak",
  ]

  output = "$root_out_dir/vr_test.pak"

  deps = [
    "//chrome/app:generated_resources",
    "//components/resources:components_resources",
    "//components/strings",
  ]
}