# 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/crypto.gni")
import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//content/browser/browser.gni")
import("//media/media_options.gni")

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

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

  # Shared deps. See also non-iOS deps below.
  deps = [
    "//base",
    "//base:base_static",
    "//content:resources",
    "//content/browser/background_sync:background_sync_proto",
    "//content/browser/notifications:notification_proto",
    "//content/browser/service_worker:service_worker_proto",
    "//content/browser/speech/proto",
    "//content/public/common:common_sources",
    "//crypto",
    "//device/battery",
    "//device/vibration",
    "//google_apis",
    "//net",
    "//skia",
    "//sql",
    "//third_party/npapi",
    "//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/base/ime",
    "//ui/events",
    "//ui/events:gesture_detection",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
    "//ui/native_theme",
    "//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/blink/grit/devtools_resources.h",
              "$root_gen_dir/blink/grit/devtools_resources_map.cc",
              "$root_gen_dir/blink/grit/devtools_resources_map.h",
              "$root_gen_dir/content/browser/devtools/protocol/devtools_protocol_dispatcher.cc",
              "$root_gen_dir/content/browser/devtools/protocol/devtools_protocol_dispatcher.h",
              "$root_gen_dir/content/browser/tracing/grit/tracing_resources.h",
              "$root_gen_dir/ui/resources/grit/webui_resources_map.cc",
            ],
            ".")

    # Non-iOS deps.
    deps += [
      "//cc",
      "//cc/surfaces",
      "//content/app/resources",
      "//content/app/strings",
      "//content/browser/devtools:resources",
      "//content/common:mojo_bindings",
      "//content/public/common:mojo_bindings",
      "//device/bluetooth",
      "//net:http_server",
      "//storage/browser",
      "//storage/common",
      "//third_party/WebKit/public:resources",
      "//third_party/angle:commit_id",
      "//third_party/icu",
      "//third_party/leveldatabase",
      "//third_party/libyuv",
      "//third_party/mojo/src/mojo/public/cpp/bindings",
      "//third_party/mojo/src/mojo/public/interfaces/application",
      "//third_party/mojo/src/mojo/public/js",
      "//ui/resources",
      "//ui/surface",
      "//ui/touch_selection",
    ]
  }

  configs += [
    "//content:content_implementation",
    "//third_party/WebKit/public:debug_devtools",
  ]

  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 += [
      "file_descriptor_info_impl.cc",
      "file_descriptor_info_impl.h",
      "power_profiler/power_data_provider_dummy.cc",
    ]
    sources -= [ "renderer_host/web_input_event_aurawin.cc" ]
  }

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

  if (enable_basic_printing || enable_print_preview) {
    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")
    deps += [ "//jingle:jingle_glue" ]
    if (is_linux) {
      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_uma_types.cc",
        "media/capture/desktop_capture_device_uma_types.h",
      ]
      if (use_aura) {
        sources += [
          "media/capture/aura_window_capture_machine.cc",
          "media/capture/aura_window_capture_machine.h",
          "media/capture/desktop_capture_device_aura.cc",
          "media/capture/desktop_capture_device_aura.h",
        ]
      }
      defines += [ "ENABLE_SCREEN_CAPTURE=1" ]
      deps += [ "//third_party/webrtc/modules/desktop_capture" ]
    }
    if (is_linux || is_mac) {
      sources += [
        "renderer_host/media/video_capture_texture_wrapper.cc",
        "renderer_host/media/video_capture_texture_wrapper.h",
      ]
    }
  }

  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) {
    deps += [ "//device/udev_linux" ]
  } 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/proxy:ipc",
      "//ppapi/shared_impl",
    ]
    if (!use_ozone || use_pango) {
      sources -= [ "renderer_host/pepper/pepper_truetype_font_list_ozone.cc" ]
    }
    if (!use_pango) {
      sources -= [ "renderer_host/pepper/pepper_truetype_font_list_pango.cc" ]
    }
  }

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

  if (use_x11) {
    configs += [ "//build/config/linux:x11" ]
    deps += [ "//ui/gfx/x" ]
  }

  # Dealing with power_save_blocker_{x11,ozone}.cc is a little complicated
  # given the interaction between os_chromeos and the feature flags for X11 and
  # ozone, so do it all in one spot.
  if (is_chromeos || !use_ozone) {
    sources -= [ "power_save_blocker_ozone.cc" ]
  }
  if (is_chromeos || !use_x11) {
    sources -= [ "power_save_blocker_x11.cc" ]
  }

  # Dealing with *wifi_data_provider_*.cc is also a bit complicated given
  # android, chromeos, linux and use_dbus.
  if (is_android) {
    sources -= [ "geolocation/wifi_data_provider_common.cc" ]
  }
  if (is_chromeos || (is_linux && !use_dbus)) {
    sources -= [ "geolocation/wifi_data_provider_linux.cc" ]
  }
  if (is_linux && use_dbus) {
    sources -= [ "geolocation/empty_wifi_data_provider.cc" ]
  }

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

  if (is_android) {
    sources += rebase_path(content_browser_gypi_values.android_browser_sources,
                           ".",
                           "//content")
    sources -= [
      "browser_ipc_logging.cc",
      "device_sensors/data_fetcher_shared_memory_default.cc",
      "geolocation/network_location_provider.cc",
      "geolocation/network_location_provider.h",
      "geolocation/network_location_request.cc",
      "geolocation/network_location_request.h",
      "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/public/android:jni",
      "//media",
      "//mojo/android:libsystem_java",
      "//ui/android",
    ]
    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",
    ]
    deps += [ "//ui/accelerated_widget_mac" ]
    libs += [ "bsm" ]
  }

  if (is_chromeos) {
    sources -= [ "device_sensors/data_fetcher_shared_memory_default.cc" ]
    deps += [
      "//chromeos",
      "//chromeos:power_manager_proto",
    ]
  }

  if (use_aura) {
    deps += [
      "//ui/aura",
      "//ui/aura_extra",
      "//ui/strings",
      "//ui/wm",
    ]
  } else {  # Not aura.
    sources -= [
      "renderer_host/input/synthetic_gesture_target_aura.cc",
      "renderer_host/input/synthetic_gesture_target_aura.h",
      "renderer_host/native_web_keyboard_event_aura.cc",
      "renderer_host/render_widget_host_view_aura.cc",
      "renderer_host/render_widget_host_view_aura.h",
      "renderer_host/ui_events_helper.cc",
      "renderer_host/ui_events_helper.h",
      "renderer_host/web_input_event_aura.cc",
      "renderer_host/web_input_event_aura.h",
      "web_contents/aura/gesture_nav_simple.cc",
      "web_contents/aura/gesture_nav_simple.h",
      "web_contents/aura/overscroll_navigation_overlay.cc",
      "web_contents/aura/overscroll_navigation_overlay.h",
      "web_contents/aura/shadow_layer_delegate.cc",
      "web_contents/aura/shadow_layer_delegate.h",
      "web_contents/aura/window_slider.cc",
      "web_contents/aura/window_slider.h",
      "web_contents/touch_editable_impl_aura.cc",
      "web_contents/touch_editable_impl_aura.h",
      "web_contents/web_contents_view_aura.cc",
      "web_contents/web_contents_view_aura.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",
      ]
    }

    if (!use_ozone) {
      sources -= [
        "compositor/overlay_candidate_validator_ozone.cc",
        "compositor/overlay_candidate_validator_ozone.h",
        "compositor/software_output_device_ozone.cc",
        "compositor/software_output_device_ozone.h",
      ]
    }
    deps += [ "//ui/compositor" ]
  }

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

  if (is_linux && use_dbus) {
    deps += [ "//dbus" ]
  }

  if (enable_browser_cdms) {
    sources += [
      "media/cdm/browser_cdm_manager.cc",
      "media/cdm/browser_cdm_manager.h",
      "media/media_web_contents_observer.cc",
      "media/media_web_contents_observer.h",
    ]
  }

  if (is_linux && use_openssl) {
    deps += [ "//third_party/boringssl" ]
  }

  if (enable_media_mojo_renderer) {
    deps += [ "//media/mojo/services:renderer_service" ]
  }
}
