# 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/browser/browser.gni")

source_set("browser") {
  # Only targets in the content tree can depend directly on this target.
  visibility = [ "//content/*" ]

  defines = []
  libs = []
  ldflags = []

  # Shared deps. See also non-iOS deps below.
  deps = [
    "//base",
    "//content:resources",
    "//content/browser/service_worker:database_proto",
    "//content/browser/speech/proto",
    "//crypto",
    "//google_apis",
    "//net",
    "//skia",
    "//sql",
    "//third_party/re2",
    "//third_party/WebKit/public:blink_headers",
    "//third_party/zlib",
    "//third_party/zlib:zip",
    "//ui/accessibility",
    "//ui/accessibility:ax_gen",
    "//ui/base",
    "//ui/events",
    "//ui/events:gesture_detection",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/resources",
    "//ui/snapshot",
  ]

  if (is_ios) {
    # iOS doesn't get the normal file list and only takes these whitelisted
    # files.
    sources = [
      "browser_context.cc",
      "browser_main_loop.cc",
      "browser_main_runner.cc",
      "browser_process_sub_thread.cc",
      "browser_thread_impl.cc",
      "browser_url_handler_impl.cc",
      "cert_store_impl.cc",
      "download/download_create_info.cc",
      "notification_service_impl.cc",
      "signed_certificate_timestamp_store_impl.cc",
      "user_metrics.cc",
      "web_contents/navigation_entry_impl.cc",
    ]
  } else {
    # Normal non-iOS sources get everything.
    sources = rebase_path(content_browser_gypi_values.private_browser_sources,
                          ".", "//content")

    # TODO(GYP) these generated files are listed as sources in content_browser.
    # This is a bit suspicious. The GN grit template will make a source set
    # containing the generated code so it should be sufficient to just depend
    # on the grit rule. But maybe some of these will need to be added?
    #
    # Need this annoying rebase_path call to match what happened with the
    # sources.
    sources -= rebase_path([
      "$root_gen_dir/webkit/grit/devtools_resources.h",
      "$root_gen_dir/webkit/grit/devtools_resources_map.cc",
      "$root_gen_dir/webkit/grit/devtools_resources_map.h",
      "$root_gen_dir/content/browser/tracing/grit/tracing_resources.h",
      "$root_gen_dir/ui/ui_resources/grit/webui_resources_map.cc",
      "$root_gen_dir/content/browser/devtools/devtools_protocol_constants.cc",
      "$root_gen_dir/content/browser/devtools/devtools_protocol_constants.h",
    ], ".")

    # Non-iOS deps.
    deps += [
      "//content/browser/devtools:resources",
      "//content/common:mojo_bindings",
      "//cc",
      "//cc:cc_surfaces",
      "//mojo/public/cpp/bindings",
      "//mojo/public/interfaces/service_provider:service_provider",
      "//mojo/public/js/bindings",
      "//net:http_server",
      "//third_party/icu",
      "//third_party/leveldatabase",
      "//third_party/libyuv",
      "//ui/resources",
      "//ui/surface",
      "//ui/webui/resources",
      "//webkit:resources",
      "//webkit:strings",
      "//webkit/browser:storage",
      "//webkit/common",
      "//webkit/common:storage",
      # TODO(GYP)
      #"//third_party/angle:commit_id",
    ]
  }

  configs += [
    "//content:content_implementation",
    "//content:libjingle_stub_config",  # TODO(GYP) remove when libjingle is ready.
    "//content:webrtc_stub_config",  # TODO(GYP) remove when webrtc is ready.
  ]

  if (toolkit_views) {
    deps += [ "//ui/events" ]
  }

  if (is_win) {
    sources += [
      "power_profiler/power_data_provider_ia_win.cc",
      "power_profiler/power_data_provider_ia_win.h",
    ]
    deps += [ "//third_party/power_gadget" ]
  } else {
    sources += [ "power_profiler/power_data_provider_dummy.cc" ]
    sources -= [ "renderer_host/web_input_event_aurawin.cc" ]
  }

  if (!is_win && !is_mac && (!is_linux || !use_udev)) {
    sources += [ "gamepad/gamepad_platform_data_fetcher.cc" ]
  }

  if (enable_printing != 0) {
    deps += [ "//printing" ]
  }

# TODO(GYP)
#   ['OS!="ios" and chrome_multiple_dll!=1', {
#     'dependencies': [
#       '../third_party/WebKit/public/blink.gyp:blink',
#     ],
#   }],
  if (!is_mac && !is_ios) {
    deps += [ "//sandbox" ]
  }
  if (!is_android && !is_ios) {
    deps += [ "//content/browser/tracing:resources" ]
  }

  if (enable_webrtc) {
    sources += rebase_path(content_browser_gypi_values.webrtc_browser_sources,
                           ".", "//content")
    # TODO(GYP)
    #deps += [ "//jingle:glue" ]
    if (is_linux) {
      # TODO(GYP)
      #deps += [ "//third_party/libjingle:libjingle_webrtc" ]
    }
    if (is_linux || is_mac || is_win) {
      sources += [
        "media/capture/desktop_capture_device.cc",
        "media/capture/desktop_capture_device.h",
        "media/capture/desktop_capture_device_aura.cc",
        "media/capture/desktop_capture_device_aura.h",
        "media/capture/desktop_capture_device_uma_types.cc",
        "media/capture/desktop_capture_device_uma_types.h",
      ]
      defines += [ "ENABLE_SCREEN_CAPTURE=1" ]
      # TODO(GYP)
      #deps += [ "//third_party/webrtc/modules:desktop_capture" ]
    }
  }

  if (is_win) {
    sources -= [
      "device_sensors/data_fetcher_shared_memory_default.cc",
      "geolocation/empty_wifi_data_provider.cc",
    ]
    defines += [
      # This prevents the inclusion of atlhost.h which paired
      # with the windows 8 sdk it does the wrong thing.
      "__ATLHOST_H__",
    ]
    deps += [
      "//third_party/iaccessible2",
      "//third_party/isimpledom",
    ]
    libs += [
      "comctl32.lib",
      "dinput8.lib",
      "dwmapi.lib",
      "dxguid.lib",
      "sensorsapi.lib",
      "portabledeviceguids.lib",
    ]
    # TODI(GYP)
#       'msvs_settings': {
#         'VCLinkerTool': {
#           'DelayLoadDLLs': [
#             'dinput8.dll',
#             'user32.dll',
#             'dwmapi.dll',
#           ],
  }

  if (is_linux) {
    deps += [ "//sandbox/linux:libc_urandom_override" ]
  }

  if (use_udev) {
    configs += [ "//build/config/linux:udev" ]
  } else {
    # Remove udev-specific sources.
    sources -= [
      "device_monitor_udev.cc",
      "device_monitor_udev.h",
    ]
    if (is_linux) {
      # Already filtered out on non-Linux.
      sources -= [
        "gamepad/gamepad_platform_data_fetcher_linux.cc",
        "udev_linux.cc",
        "udev_linux.h",
      ]
    }
  }

  if (enable_plugins) {
    sources += rebase_path(content_browser_gypi_values.plugin_browser_sources,
                           ".", "//content")
    deps += [
      "//ppapi:ppapi_ipc",
      "//ppapi:ppapi_shared",
    ]
    if (!use_ozone || use_pango) {
      sources -= [ "renderer_host/pepper/pepper_truetype_font_list_ozone.cc" ]
    }
  }

  if (is_linux && use_aura) {
    configs += [ "//build/config/linux:fontconfig" ]
  }

  if (use_x11) {
    configs += [ "//build/config/linux:x11" ]
  } else {
    sources -= [
      "power_save_blocker_x11.cc",
      "renderer_host/web_input_event_aurax11.cc",
    ]
  }

  if (use_pango) {
    configs += [ "//build/config/linux:pangocairo" ]
  }

  if (is_android) {
    sources += rebase_path(content_browser_gypi_values.android_browser_sources,
                           ".", "//content")
    sources -= [
      "battery_status/battery_status_manager_default.cc",
      "browser_ipc_logging.cc",
      "device_sensors/data_fetcher_shared_memory_default.cc",
      "font_list_async.cc",
      "geolocation/device_data_provider.cc",
      "geolocation/empty_device_data_provider.cc",
      "geolocation/network_location_provider.cc",
      "geolocation/network_location_provider.h",
      "geolocation/network_location_request.cc",
      "geolocation/network_location_request.h",
      "geolocation/wifi_data_provider_common.cc",
      "renderer_host/native_web_keyboard_event.cc",
      "tracing/tracing_ui.cc",
      "tracing/tracing_ui.h",

      # Android skips most, but not all, of the speech code.
      "speech/audio_buffer.cc",
      "speech/audio_buffer.h",
      "speech/audio_encoder.cc",
      "speech/audio_encoder.h",
      "speech/chunked_byte_buffer.cc",
      "speech/chunked_byte_buffer.h",
      "speech/endpointer/endpointer.cc",
      "speech/endpointer/endpointer.h",
      "speech/endpointer/energy_endpointer.cc",
      "speech/endpointer/energy_endpointer.h",
      "speech/endpointer/energy_endpointer_params.cc",
      "speech/endpointer/energy_endpointer_params.h",
      "speech/google_one_shot_remote_engine.cc",
      "speech/google_one_shot_remote_engine.h",
      "speech/google_streaming_remote_engine.cc",
      "speech/google_streaming_remote_engine.h",
      "speech/speech_recognition_engine.cc",
      "speech/speech_recognition_engine.h",
      "speech/speech_recognizer_impl.cc",
      "speech/speech_recognizer_impl.h",
    ]
    deps += [
      #"//content:jni_headers",  TODO(GYP)
      #"//media",  TODO(GYP)
    ]
    libs += [ "jnigraphics" ]
  }

  if (is_mac) {
    sources -= [
      "device_sensors/data_fetcher_shared_memory_default.cc",
      "geolocation/empty_wifi_data_provider.cc",
      "geolocation/empty_wifi_data_provider.h",
    ]
    libs += [ "bsm" ]
  }

  if (is_chromeos) {
    sources -= [
      "geolocation/wifi_data_provider_linux.cc",
      "power_save_blocker_ozone.cc",
      "power_save_blocker_x11.cc",
    ]
    deps += [ "//chromeos:power_manager_proto" ]
  }

  if (use_aura) {
    deps += [
      "//ui/aura",
      "//ui/strings",
    ]
  } else {  # Not aura.
    sources -= [
      "renderer_host/render_widget_host_view_aura.cc",
      "renderer_host/render_widget_host_view_aura.h",
      "web_contents/touch_editable_impl_aura.cc",
      "web_contents/touch_editable_impl_aura.h",
      "renderer_host/ui_events_helper.cc",
      "renderer_host/ui_events_helper.h",
    ]
  }

  if (use_aura || is_mac) {
    sources += rebase_path(
      content_browser_gypi_values.compositor_browser_sources,
      ".", "//content")
    if (!use_x11) {
      sources -= [
        "compositor/software_output_device_x11.cc",
        "compositor/software_output_device_x11.h",
      ]
    }
    deps += [ "//ui/compositor" ]
  }

  if (enable_speech_input) {
    deps += [
      "//third_party/flac",
      "//third_party/speex",
    ]
  }

  if (is_linux) {
    if (use_dbus) {
      sources -= [
        "geolocation/empty_wifi_data_provider.cc",
      ]
      deps += [ "//dbus" ]
    } else {
      # This will already have gotten removed for all non-Linux cases.
       sources -= [ "geolocation/wifi_data_provider_linux.cc" ]
    }
  }
}
