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

static_library("open_from_clipboard") {
  sources = [
    "clipboard_recent_content.cc",
    "clipboard_recent_content.h",
    "clipboard_recent_content_ios.h",
    "clipboard_recent_content_ios.mm",
  ]

  if (!is_ios) {
    sources += [
      "clipboard_recent_content_generic.cc",
      "clipboard_recent_content_generic.h",
    ]
  }

  deps = [
    ":open_from_clipboard_impl",
    "//base",
    "//components/variations",
    "//net",
    "//ui/base:base",
    "//url",
  ]
}

# Helper classes used by "open_from_clipboard" target. These classes must have
# no dependencies on "//base:i18n".
source_set("open_from_clipboard_impl") {
  sources = [
    "clipboard_recent_content_impl_ios.h",
    "clipboard_recent_content_impl_ios.mm",
  ]
  deps = [
    "//base",
  ]
  assert_no_deps = [ "//base:i18n" ]
  if (is_ios) {
    configs += [ "//build/config/compiler:enable_arc" ]

    libs = [ "MobileCoreServices.framework" ]
  }
}

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

  deps = [
    ":open_from_clipboard",
    "//base",
    "//ui/gfx:gfx",
    "//url",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "clipboard_recent_content_ios_unittest.mm",
  ]

  if (!is_ios) {
    sources += [ "clipboard_recent_content_generic_unittest.cc" ]
  }

  deps = [
    ":open_from_clipboard",
    ":open_from_clipboard_impl",
    "//base",
    "//testing/gtest",
    "//ui/base:test_support",
    "//url",
  ]
}
