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

# 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_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" ]
  }
}
