# 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/buildflag_header.gni")
import("//build/config/nacl/config.gni")
import("//tools/ipc_fuzzer/ipc_fuzzer.gni")

declare_args() {
  enable_mojo_tracing = false

  # enable_random_mojo_delays starts a task runner that periodically pauses
  # random Mojo bindings and later resumes them, in order to test whether parts
  # of the code implicitly rely on FIFO processing of messages sent on different
  # message pipes (which they should not).
  enable_random_mojo_delays = false
}

buildflag_header("mojo_buildflags") {
  header = "mojo_buildflags.h"

  flags = [
    "MOJO_TRACE_ENABLED=$enable_mojo_tracing",
    "MOJO_RANDOM_DELAYS_ENABLED=$enable_random_mojo_delays",
  ]
}

# Headers and sources which generated bindings can depend upon. No need for
# other targets to depend on this directly: just use the "bindings" target.
component("bindings_base") {
  sources = [
    "array_data_view.h",
    "array_traits.h",
    "array_traits_span.h",
    "array_traits_stl.h",
    "associated_group.h",
    "associated_group_controller.h",
    "clone_traits.h",
    "disconnect_reason.h",
    "enum_traits.h",
    "equals_traits.h",
    "features.cc",
    "features.h",
    "interface_data_view.h",
    "interface_id.h",
    "lib/array_internal.cc",
    "lib/array_internal.h",
    "lib/array_serialization.h",
    "lib/associated_group.cc",
    "lib/associated_group_controller.cc",
    "lib/bindings_internal.h",
    "lib/buffer.cc",
    "lib/buffer.h",
    "lib/fixed_buffer.cc",
    "lib/fixed_buffer.h",
    "lib/handle_serialization.h",
    "lib/hash_util.h",
    "lib/map_data_internal.h",
    "lib/map_serialization.h",
    "lib/may_auto_lock.h",
    "lib/message.cc",
    "lib/message_header_validator.cc",
    "lib/message_internal.cc",
    "lib/message_internal.h",
    "lib/scoped_interface_endpoint_handle.cc",
    "lib/serialization.h",
    "lib/serialization_context.cc",
    "lib/serialization_context.h",
    "lib/serialization_forward.h",
    "lib/serialization_util.h",
    "lib/string_serialization.h",
    "lib/template_util.h",
    "lib/unserialized_message_context.cc",
    "lib/unserialized_message_context.h",
    "lib/validate_params.h",
    "lib/validation_context.cc",
    "lib/validation_context.h",
    "lib/validation_errors.cc",
    "lib/validation_errors.h",
    "lib/validation_util.cc",
    "lib/validation_util.h",
    "map.h",
    "map_data_view.h",
    "map_traits.h",
    "map_traits_flat_map.h",
    "map_traits_stl.h",
    "message.h",
    "message_header_validator.h",
    "scoped_interface_endpoint_handle.h",
    "string_data_view.h",
    "string_traits.h",
    "string_traits_stl.h",
    "string_traits_string_piece.h",
    "struct_ptr.h",
    "struct_traits.h",
    "type_converter.h",
    "union_traits.h",
  ]

  defines = [ "IS_MOJO_CPP_BINDINGS_BASE_IMPL" ]

  public_deps = [
    ":mojo_buildflags",
    "//base",
    "//mojo/public/cpp/system",
  ]

  if (enable_ipc_fuzzer) {
    all_dependent_configs = [ "//tools/ipc_fuzzer:ipc_fuzzer_config" ]
  }
}

component("bindings") {
  sources = [
    "associated_binding.h",
    "associated_binding_set.h",
    "associated_interface_ptr.h",
    "associated_interface_ptr_info.h",
    "associated_interface_request.h",
    "binding.h",
    "binding_set.h",
    "callback_helpers.h",
    "connection_error_callback.h",
    "connector.h",
    "filter_chain.h",
    "interface_endpoint_client.h",
    "interface_endpoint_controller.h",
    "interface_ptr.h",
    "interface_ptr_info.h",
    "interface_ptr_set.h",
    "interface_request.h",
    "lib/associated_binding.cc",
    "lib/associated_interface_ptr.cc",
    "lib/associated_interface_ptr_state.cc",
    "lib/associated_interface_ptr_state.h",
    "lib/binding_state.cc",
    "lib/binding_state.h",
    "lib/connector.cc",
    "lib/control_message_handler.cc",
    "lib/control_message_handler.h",
    "lib/control_message_proxy.cc",
    "lib/control_message_proxy.h",
    "lib/filter_chain.cc",
    "lib/interface_endpoint_client.cc",
    "lib/interface_ptr_state.cc",
    "lib/interface_ptr_state.h",
    "lib/interface_serialization.h",
    "lib/multiplex_router.cc",
    "lib/multiplex_router.h",
    "lib/native_enum_data.h",
    "lib/native_enum_serialization.h",
    "lib/native_struct_serialization.cc",
    "lib/native_struct_serialization.h",
    "lib/pipe_control_message_handler.cc",
    "lib/pipe_control_message_proxy.cc",
    "lib/sequence_local_sync_event_watcher.cc",
    "lib/sync_call_restrictions.cc",
    "lib/sync_event_watcher.cc",
    "lib/sync_handle_registry.cc",
    "lib/sync_handle_watcher.cc",
    "lib/task_runner_helper.cc",
    "lib/task_runner_helper.h",
    "native_enum.h",
    "pipe_control_message_handler.h",
    "pipe_control_message_handler_delegate.h",
    "pipe_control_message_proxy.h",
    "raw_ptr_impl_ref_traits.h",
    "sequence_local_sync_event_watcher.h",
    "strong_associated_binding.h",
    "strong_binding.h",
    "strong_binding_set.h",
    "sync_call_restrictions.h",
    "sync_event_watcher.h",
    "sync_handle_registry.h",
    "sync_handle_watcher.h",
    "thread_safe_interface_ptr.h",
    "unique_ptr_impl_ref_traits.h",
  ]

  if (enable_random_mojo_delays) {
    sources += [
      "lib/test_random_mojo_delays.cc",
      "lib/test_random_mojo_delays.h",
    ]
  }

  if (enable_ipc_fuzzer && !is_nacl_nonsfi) {
    sources += [
      "lib/message_dumper.cc",
      "message_dumper.h",
    ]
  }

  public_deps = [
    ":bindings_base",
    ":struct_traits",
    "//base",
    "//ipc:message_support",
    "//ipc:param_traits",
    "//mojo/public/cpp/system",
    "//mojo/public/interfaces/bindings",
  ]

  deps = [
    "//ipc:native_handle_type_converters",
  ]

  defines = [ "IS_MOJO_CPP_BINDINGS_IMPL" ]
}

source_set("struct_traits") {
  sources = [
    "array_traits.h",
    "enum_traits.h",
    "lib/template_util.h",
    "map_traits.h",
    "string_traits.h",
    "struct_traits.h",
    "union_traits.h",
  ]
}

if (!is_ios) {
  # TODO(yzshen): crbug.com/617718 Consider moving this into blink.
  source_set("wtf_support") {
    sources = [
      "array_traits_web_vector.h",
      "array_traits_wtf_vector.h",
      "lib/string_traits_wtf.cc",
      "lib/wtf_clone_equals_util.h",
      "lib/wtf_hash_util.h",
      "lib/wtf_serialization.h",
      "map_traits_wtf_hash_map.h",
      "string_traits_wtf.h",
    ]

    public_deps = [
      ":bindings",
      "//third_party/blink/public:blink_headers",
      "//third_party/blink/renderer/platform:platform_export",
      "//third_party/blink/renderer/platform/wtf",
    ]

    public_configs = [ "//third_party/blink/renderer:config" ]
  }
}
