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

import("//build/config/jumbo.gni")
import("//build/config/nacl/config.gni")

jumbo_component("shared_impl") {
  output_name = "ppapi_shared"

  if (is_nacl) {
    # The nacl toolchain has template related bugs that are triggered
    # in jumbo builds. https://crbug.com/912152
    never_build_jumbo = true
  }

  sources = [
    "array_var.cc",
    "array_var.h",
    "array_writer.cc",
    "array_writer.h",
    "callback_tracker.cc",
    "callback_tracker.h",
    "compositor_layer_data.cc",
    "compositor_layer_data.h",
    "dictionary_var.cc",
    "dictionary_var.h",
    "file_growth.cc",
    "file_growth.h",
    "file_io_state_manager.cc",
    "file_io_state_manager.h",
    "file_path.cc",
    "file_path.h",
    "file_ref_create_info.cc",
    "file_ref_create_info.h",
    "file_ref_util.cc",
    "file_ref_util.h",
    "file_system_util.cc",
    "file_system_util.h",
    "file_type_conversion.cc",
    "file_type_conversion.h",
    "host_resource.cc",
    "host_resource.h",
    "id_assignment.cc",
    "id_assignment.h",
    "media_stream_audio_track_shared.cc",
    "media_stream_audio_track_shared.h",
    "media_stream_buffer.h",
    "media_stream_buffer_manager.cc",
    "media_stream_buffer_manager.h",
    "media_stream_video_track_shared.cc",
    "media_stream_video_track_shared.h",
    "platform_file.cc",
    "platform_file.h",
    "ppapi_constants.h",
    "ppapi_globals.cc",
    "ppapi_globals.h",
    "ppapi_nacl_plugin_args.cc",
    "ppapi_nacl_plugin_args.h",
    "ppapi_permissions.cc",
    "ppapi_permissions.h",
    "ppapi_preferences.cc",
    "ppapi_preferences.h",
    "ppapi_switches.cc",
    "ppapi_switches.h",
    "ppb_audio_config_shared.cc",
    "ppb_audio_config_shared.h",
    "ppb_audio_shared.cc",
    "ppb_audio_shared.h",
    "ppb_crypto_shared.cc",
    "ppb_device_ref_shared.cc",
    "ppb_device_ref_shared.h",
    "ppb_flash_font_file_shared.h",
    "ppb_gamepad_shared.cc",
    "ppb_gamepad_shared.h",
    "ppb_graphics_3d_shared.cc",
    "ppb_graphics_3d_shared.h",
    "ppb_image_data_shared.cc",
    "ppb_image_data_shared.h",
    "ppb_input_event_shared.cc",
    "ppb_input_event_shared.h",
    "ppb_instance_shared.cc",
    "ppb_instance_shared.h",
    "ppb_memory_shared.cc",
    "ppb_message_loop_shared.cc",
    "ppb_message_loop_shared.h",
    "ppb_opengles2_shared.cc",
    "ppb_opengles2_shared.h",
    "ppb_tcp_socket_shared.cc",
    "ppb_tcp_socket_shared.h",
    "ppb_trace_event_impl.cc",
    "ppb_trace_event_impl.h",
    "ppb_var_shared.cc",
    "ppb_var_shared.h",
    "ppb_view_shared.cc",
    "ppb_view_shared.h",
    "ppp_flash_browser_operations_shared.h",
    "ppp_instance_combined.cc",
    "ppp_instance_combined.h",
    "proxy_lock.cc",
    "proxy_lock.h",
    "resource.cc",
    "resource.h",
    "resource_tracker.cc",
    "resource_tracker.h",
    "resource_var.cc",
    "resource_var.h",
    "scoped_pp_resource.cc",
    "scoped_pp_resource.h",
    "scoped_pp_var.cc",
    "scoped_pp_var.h",
    "socket_option_data.cc",
    "socket_option_data.h",
    "thread_aware_callback.cc",
    "thread_aware_callback.h",
    "time_conversion.cc",
    "time_conversion.h",
    "tracked_callback.cc",
    "tracked_callback.h",
    "url_request_info_data.cc",
    "url_request_info_data.h",
    "url_response_info_data.cc",
    "url_response_info_data.h",
    "var.cc",
    "var.h",
    "var_tracker.cc",
    "var_tracker.h",
    "vpn_provider_util.cc",
    "vpn_provider_util.h",

    # TODO(viettrungluu): Split these out; it won"t be used in NaCl.
    "private/net_address_private_impl.cc",
    "private/net_address_private_impl.h",
    "private/net_address_private_impl_constants.cc",
    "private/ppb_x509_certificate_private_shared.cc",
    "private/ppb_x509_certificate_private_shared.h",
  ]

  if (!is_nacl) {
    sources += [
      "flash_clipboard_format_registry.cc",
      "flash_clipboard_format_registry.h",
      "ppb_url_util_shared.cc",
      "ppb_url_util_shared.h",
      "ppb_video_decoder_shared.cc",
      "ppb_video_decoder_shared.h",
      "private/ppb_char_set_shared.cc",
      "private/ppb_char_set_shared.h",
    ]
  }

  # This condition is catching the build of nacl64.exe, which is built
  # in the 64-bit toolchain when the overall build is 32-bit.
  # See also //ppapi/thunk
  if (is_win && target_cpu == "x86" && current_cpu == "x64") {
    sources -= [
      "ppb_audio_shared.cc",
      "ppb_graphics_3d_shared.cc",
      "ppb_opengles2_shared.cc",
      "private/net_address_private_impl.cc",
    ]
  }

  configs += [ "//build/config:precompiled_headers" ]
  defines = [
    "PPAPI_SHARED_IMPLEMENTATION",

    # This target goes in the same library as thunk (in GYP they are the same).
    "PPAPI_THUNK_IMPLEMENTATION",
  ]

  public_deps = [
    "//base",
    "//ppapi/c",
    "//ppapi/thunk",
  ]

  deps = [
    "//gpu/command_buffer/client",
    "//gpu/command_buffer/client:gles2_cmd_helper",
    "//gpu/command_buffer/client:gles2_implementation",
    "//gpu/command_buffer/common",
    "//ipc",
    "//media:shared_memory_support",
  ]

  if (!is_nacl) {
    deps += [
      "//net",
      "//skia",
      "//ui/events:events_base",
      "//ui/surface",
    ]
  }

  if (!is_nacl_nonsfi) {
    deps += [
      "//base:i18n",
      "//base/third_party/dynamic_annotations",
      "//third_party/icu:icuuc",
      "//url",
    ]
  }

  if (is_mac) {
    libs = [ "QuartzCore.framework" ]
  }
}

static_library("test_support") {
  testonly = true

  sources = [
    "test_globals.cc",
    "test_globals.h",
    "test_utils.cc",
    "test_utils.h",
  ]

  public_deps = [
    "//ppapi/shared_impl",
  ]
  deps = [
    "//base/test:test_support",
    "//ipc",
    "//ipc:test_support",
    "//ppapi/proxy",
    "//testing/gmock",
    "//testing/gtest",
  ]
}
