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

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

config("implementation") {
  defines = [ "SESSIONS_IMPLEMENTATION" ]
}

if (!is_ios) {
  component("sessions") {
    sources = [
      "content/content_live_tab.cc",
      "content/content_live_tab.h",
      "content/content_platform_specific_tab_data.cc",
      "content/content_platform_specific_tab_data.h",
      "content/content_record_password_state.cc",
      "content/content_record_password_state.h",
      "content/content_record_task_id.cc",
      "content/content_record_task_id.h",
      "content/content_serialized_navigation_builder.cc",
      "content/content_serialized_navigation_builder.h",
      "content/content_serialized_navigation_driver.cc",
      "content/content_serialized_navigation_driver.h",
      "content/extended_info_handler.h",
    ]

    configs += [ ":implementation" ]

    public_deps = [
      ":shared",
      "//content/public/browser",
    ]

    deps = [
      "//base",
      "//base/third_party/dynamic_annotations",
      "//content/public/common",
      "//ui/base",
      "//url",
    ]
  }
} else {
  source_set("sessions") {
    sources = [
      "ios/ios_live_tab.h",
      "ios/ios_live_tab.mm",
      "ios/ios_serialized_navigation_builder.h",
      "ios/ios_serialized_navigation_builder.mm",
      "ios/ios_serialized_navigation_driver.cc",
      "ios/ios_serialized_navigation_driver.h",
    ]

    public_deps = [
      ":shared",
      "//ios/web",
    ]

    deps = [
      "//base",
      "//ios/web/common",
    ]
  }
}

# Sources shared between the content and iOS implementations.
source_set("shared") {
  visibility = [ ":*" ]

  sources = [
    "core/base_session_service.cc",
    "core/base_session_service.h",
    "core/base_session_service_commands.cc",
    "core/base_session_service_commands.h",
    "core/base_session_service_delegate.h",
    "core/live_tab.cc",
    "core/live_tab.h",
    "core/live_tab_context.h",
    "core/serialized_navigation_driver.h",
    "core/serialized_navigation_entry.cc",
    "core/serialized_navigation_entry.h",
    "core/session_backend.cc",
    "core/session_backend.h",
    "core/session_command.cc",
    "core/session_command.h",
    "core/session_constants.cc",
    "core/session_constants.h",
    "core/session_id.cc",
    "core/session_id.h",
    "core/session_id_generator.cc",
    "core/session_id_generator.h",
    "core/session_service_commands.cc",
    "core/session_service_commands.h",
    "core/session_types.cc",
    "core/session_types.h",
    "core/tab_restore_service.cc",
    "core/tab_restore_service.h",
    "core/tab_restore_service_client.cc",
    "core/tab_restore_service_client.h",
    "core/tab_restore_service_helper.cc",
    "core/tab_restore_service_helper.h",
    "core/tab_restore_service_impl.cc",
    "core/tab_restore_service_impl.h",
    "core/tab_restore_service_observer.h",
  ]

  configs += [ ":implementation" ]

  public_deps = [
    "//components/keyed_service/core",
  ]

  deps = [
    "//base",
    "//components/history/core/common",
    "//components/keyed_service/core",
    "//components/prefs",
    "//components/variations",
    "//skia",
    "//ui/base",
    "//ui/gfx",
    "//url",
  ]
}

static_library("test_support") {
  testonly = true
  sources = [
    "core/serialized_navigation_entry_test_helper.cc",
    "core/serialized_navigation_entry_test_helper.h",
  ]

  public_deps = [
    ":sessions",
  ]
  deps = [
    "//base",
    "//skia",
    "//testing/gtest",
    "//ui/base",  # For page_transition_types.h.
    "//url",
  ]

  if (!is_android && !is_ios) {
    sources += [
      "core/base_session_service_test_helper.cc",
      "core/base_session_service_test_helper.h",
    ]
  }
}

source_set("unit_tests") {
  if (is_ios) {
    configs += [ "//build/config/compiler:enable_arc" ]
  }
  testonly = true
  sources = [
    "core/serialized_navigation_entry_unittest.cc",
    "core/session_backend_unittest.cc",
    "core/session_id_generator_unittest.cc",
    "ios/ios_serialized_navigation_builder_unittest.mm",
    "ios/ios_serialized_navigation_driver_unittest.cc",
  ]

  if (!is_ios) {
    sources += [
      "content/content_record_task_id_unittest.cc",
      "content/content_serialized_navigation_builder_unittest.cc",
      "content/content_serialized_navigation_driver_unittest.cc",
    ]
  }

  public_deps = [
    ":sessions",
  ]

  deps = [
    ":test_support",
    "//base/test:test_support",
    "//components/prefs:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/base",  # For page transition types.
    "//url",
  ]

  if (!is_ios) {
    deps += [ "//content/public/common" ]
  }
}
