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

import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//content/renderer/renderer.gni")
import("//media/media_options.gni")

source_set("renderer") {
  # Only the public target should depend on this. All other targets (even
  # internal content ones) should depend on the public one.
  visibility = [ "//content/public/renderer:renderer_sources" ]

  sources = rebase_path(content_renderer_gypi_values.private_renderer_sources,
                        ".",
                        "//content")

  configs += [
    "//content:content_implementation",
    "//build/config/compiler:no_size_t_to_int_warning",
  ]

  deps = [
    # TODO(GYP) bug 376846 remove this. This should be inherited from //net but
    # those don't cross component boundaries.
    "//crypto:platform",
    "//base/allocator",
    "//cc",
    "//cc/blink",
    "//content:resources",
    "//content/common:mojo_bindings",
    "//content/public/child:child_sources",
    "//content/public/common:common_sources",
    "//content/public/common:mojo_bindings",
    "//device/battery:mojo_bindings",
    "//device/vibration:mojo_bindings",
    "//gin",
    "//gpu",
    "//gpu/command_buffer/client:gles2_interface",
    "//jingle:jingle_glue",
    "//media",
    "//media/blink",
    "//mojo/environment:chromium",
    "//net",
    "//skia",
    "//storage/common",
    "//third_party/icu",
    "//third_party/libjingle",
    "//third_party/mojo/src/mojo/edk/js",
    "//third_party/mojo/src/mojo/public/js",
    "//third_party/mojo/src/mojo/public/interfaces/application",
    "//third_party/npapi",
    "//third_party/WebKit/public:blink",
    "//third_party/widevine/cdm:version_h",
    "//ui/accessibility",
    "//ui/base",
    "//ui/events:events_base",
    "//ui/events:dom4_keycode_converter",
    "//ui/gl",
    "//ui/native_theme",
    "//ui/surface",
    "//v8",
    "//webkit/common/gpu",
  ]

  if (is_mac) {
    sources -= [
      "webscrollbarbehavior_impl_gtkoraura.cc",
      "webscrollbarbehavior_impl_gtkoraura.h",
    ]
    sources += [
      "external_popup_menu.cc",
      "external_popup_menu.h",
    ]
  }

  if (is_android) {
    sources -= [ "media/audio_decoder.cc" ]
    sources += [
      "external_popup_menu.cc",
      "external_popup_menu.h",
    ]

    # Add back the Linux file which Android shares.
    set_sources_assignment_filter([])
    sources += [ "render_view_linux.cc" ]

    deps += [
      "//third_party/android_tools:cpu_features",
      "//third_party/libphonenumber",
    ]
  } else {
    sources -= [
      "java/gin_java_bridge_dispatcher.cc",
      "java/gin_java_bridge_dispatcher.h",
      "java/gin_java_bridge_object.cc",
      "java/gin_java_bridge_object.h",
      "java/gin_java_bridge_value_converter.cc",
      "java/gin_java_bridge_value_converter.h",
      "java/gin_java_function_invocation_helper.cc",
      "java/gin_java_function_invocation_helper.h",
    ]
  }

  # TODO(jrg): remove the OS=="android" section?
  # http://crbug.com/113172
  # Understand better how media_stream_ is tied into Chromium.
  if (!enable_webrtc && is_android) {
    sources -= [
      "media/media_stream_audio_level_calculator.cc",
      "media/media_stream_audio_level_calculator.h",
      "media/media_stream_audio_renderer.cc",
      "media/media_stream_audio_renderer.h",
      "media/media_stream_center.h",
      "media/media_stream_constraints_util.cc",
      "media/media_stream_constraints_util.h",
      "media/media_stream_dispatcher.h",
      "media/media_stream_dispatcher_eventhandler.h",
      "media/media_stream_track.cc",
      "media/media_stream_track.h",
    ]
  }

  if (enable_webrtc) {
    sources += rebase_path(
            content_renderer_gypi_values.private_renderer_webrtc_sources,
            ".",
            "//content")
    deps += [
      "//crypto",
      "//third_party/libyuv",
      "//third_party/webrtc/modules/audio_device",
      "//third_party/webrtc/modules/audio_processing",
      "//third_party/libjingle:libjingle_webrtc",
      "//third_party/libjingle:libpeerconnection",
    ]
  } else {
    sources += [
      "media/webrtc_logging.h",
      "media/webrtc_logging_noop.cc",
    ]
  }

  if (enable_plugins) {
    sources += rebase_path(
            content_renderer_gypi_values.private_renderer_plugin_sources,
            ".",
            "//content")
    deps += [
      "//media/cast:sender",
      "//ppapi/host",
      "//ppapi/proxy",
      "//ppapi/shared_impl",
      "//third_party/libyuv",
    ]
  } else {
    # These files are in the WebRTC list, but also require plugins.
    if (enable_webrtc) {
      sources -= [
        "media/webrtc/video_destination_handler.cc",
        "media/webrtc/video_destination_handler.h",
      ]
    }
  }

  if (enable_plugins && enable_webrtc) {
    sources += rebase_path(
            content_renderer_gypi_values.private_renderer_plugin_webrtc_sources,
            ".",
            "//content")
  }

  if (!enable_pepper_cdms) {
    sources -= [
      "media/crypto/pepper_cdm_wrapper.h",
      "media/crypto/pepper_cdm_wrapper_impl.cc",
      "media/crypto/pepper_cdm_wrapper_impl.h",
      "media/crypto/ppapi_decryptor.cc",
      "media/crypto/ppapi_decryptor.h",
    ]
  }

  if (enable_print_preview) {
    deps += [ "//printing" ]
  }

  if (enable_browser_cdms) {
    sources += [
      "media/crypto/proxy_media_keys.cc",
      "media/crypto/proxy_media_keys.h",
      "media/crypto/renderer_cdm_manager.cc",
      "media/crypto/renderer_cdm_manager.h",
    ]
  }

  if (enable_media_mojo_renderer) {
    sources += [
      "media/media_renderer_service_provider.cc",
      "media/media_renderer_service_provider.h",
    ]
    deps += [ "//media/mojo/services:renderer_proxy" ]
  }
}
