# Copyright 2018 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("//mojo/public/tools/bindings/mojom.gni")

# This target includes all mojom interfaces which can be used from
# renderer/platform. In particular these mojom interfaces can't use types that
# are typemapped to a type in renderer/core.
mojom("mojom_platform") {
  sources = [
    "array_buffer/array_buffer_contents.mojom",
    "associated_interfaces/associated_interfaces.mojom",
    "blob/blob.mojom",
    "blob/blob_registry.mojom",
    "blob/blob_url_store.mojom",
    "blob/data_element.mojom",
    "blob/serialized_blob.mojom",
    "choosers/file_chooser.mojom",
    "clipboard/clipboard.mojom",
    "color_chooser/color_chooser.mojom",
    "cookie_store/cookie_store.mojom",
    "crash/crash_memory_metrics_reporter.mojom",
    "dom_storage/session_storage_namespace.mojom",
    "dom_storage/storage_area.mojom",
    "dom_storage/storage_partition_service.mojom",
    "feature_policy/feature_policy.mojom",
    "fetch/fetch_api_response.mojom",
    "file/file_utilities.mojom",
    "filesystem/file_system.mojom",
    "filesystem/file_writer.mojom",
    "frame/find_in_page.mojom",
    "frame/navigation_initiator.mojom",
    "leak_detector/leak_detector.mojom",
    "loader/code_cache.mojom",
    "loader/navigation_predictor.mojom",
    "loader/pause_subresource_loading_handle.mojom",
    "loader/previews_resource_loading_hints.mojom",
    "manifest/display_mode.mojom",
    "manifest/manifest.mojom",
    "manifest/manifest_manager.mojom",
    "net/ip_address_space.mojom",
    "notifications/notification.mojom",
    "page/display_cutout.mojom",
    "page/page_visibility_state.mojom",
    "payments/payment_app.mojom",
    "plugins/plugin_registry.mojom",
    "presentation/presentation.mojom",
    "quota/quota_dispatcher_host.mojom",
    "quota/quota_types.mojom",
    "referrer.mojom",
    "service_worker/dispatch_fetch_event_params.mojom",
    "service_worker/navigation_preload_state.mojom",
    "service_worker/service_worker_client.mojom",
    "service_worker/service_worker_error_type.mojom",
    "service_worker/service_worker_event_status.mojom",
    "service_worker/service_worker_fetch_response_callback.mojom",
    "service_worker/service_worker_installed_scripts_manager.mojom",
    "service_worker/service_worker_provider_type.mojom",
    "service_worker/service_worker_state.mojom",
    "service_worker/service_worker_stream_handle.mojom",
    "shared_worker/shared_worker_creation_context_type.mojom",
    "shared_worker/shared_worker_main_script_load_params.mojom",
    "speech/speech_recognition_error.mojom",
    "speech/speech_recognition_grammar.mojom",
    "speech/speech_recognition_result.mojom",
    "speech/speech_recognizer.mojom",
    "use_counter/css_property_id.mojom",
    "webaudio/audio_context_manager.mojom",
  ]

  public_deps = [
    ":android_mojo_bindings",
    ":speech_recognition_error_code",
    "//components/payments/mojom",
    "//components/services/filesystem/public/interfaces",
    "//mojo/public/mojom/base",
    "//services/device/public/mojom",
    "//services/network/public/mojom",
    "//skia/public/interfaces",
    "//third_party/blink/public/mojom/usb",
    "//ui/gfx/geometry/mojo",
    "//url/mojom:url_mojom_gurl",
    "//url/mojom:url_mojom_origin",
  ]

  export_class_attribute = "BLINK_COMMON_EXPORT"
  export_define = "BLINK_COMMON_IMPLEMENTATION=1"
  export_header = "third_party/blink/public/common/common_export.h"

  export_class_attribute_blink = "PLATFORM_EXPORT"
  export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
  export_header_blink = "third_party/blink/renderer/platform/platform_export.h"
}

# Kept separate from "mojom_platform" because the Java bindings are specifically
# needed by Android's implementation of payments
# (in components/payments/content/android and chrome/android/).
mojom("android_mojo_bindings") {
  sources = [
    "payments/payment_request.mojom",
  ]
  public_deps = [
    "//components/payments/mojom",
  ]

  export_class_attribute = "BLINK_COMMON_EXPORT"
  export_define = "BLINK_COMMON_IMPLEMENTATION=1"
  export_header = "third_party/blink/public/common/common_export.h"

  export_class_attribute_blink = "PLATFORM_EXPORT"
  export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
  export_header_blink = "third_party/blink/renderer/platform/platform_export.h"
}

# Kept separate from "mojom_platform" because the Java bindings are needed by
# Android's implementation of speech recognition.
mojom("speech_recognition_error_code") {
  sources = [
    "speech/speech_recognition_error_code.mojom",
  ]
}

# This target can include mojom interfaces which do use types that are
# typemapped to a type in renderer/core. This also means these interfaces are
# not available from renderer/platform.
# Note that service_worker_object.mojom and service_worker.mojom depend
# on transferable_message.mojom, and service_worker_registration.mojom depends
# on service_worker_object.mojom, so we put these three service worker
# mojom files here rather than mojom_platform target.
# In future we may have a separate mojom target for the things that may have
# modules dependencies if it looks necessary, at that time we can put all of
# those high-level service worker mojom files there.
mojom("mojom_core") {
  sources = [
    "messaging/cloneable_message.mojom",
    "messaging/transferable_message.mojom",
    "messaging/user_activation_snapshot.mojom",
    "portal/portal.mojom",
    "service_worker/service_worker.mojom",
    "service_worker/service_worker_object.mojom",
    "service_worker/service_worker_registration.mojom",
  ]

  public_deps = [
    ":mojom_platform",
    "//mojo/public/mojom/base",
    "//skia/public/interfaces",
    "//url/mojom:url_mojom_gurl",
  ]

  overridden_deps_blink = [ ":mojom_platform" ]
  component_deps_blink = [ "//third_party/blink/renderer/platform" ]

  export_class_attribute = "BLINK_COMMON_EXPORT"
  export_define = "BLINK_COMMON_IMPLEMENTATION=1"
  export_header = "third_party/blink/public/common/common_export.h"

  export_class_attribute_blink = "CORE_EXPORT"
  export_define_blink = "BLINK_CORE_IMPLEMENTATION=1"
  export_header_blink = "third_party/blink/renderer/core/core_export.h"
}

# This target can include mojom interfaces which use types that are typemapped
# to a type in renderer/modules. This also means these interfaces are not
# available from renderer/platform or renderer/core.
mojom("mojom_modules") {
  sources = [
    "indexeddb/indexeddb.mojom",
  ]

  public_deps = [
    ":mojom_core",

    # TODO(https://crbug.com/822804): Remove when mojom bindings deps checks
    # get fixed.
    ":mojom_platform",
    "//mojo/public/mojom/base",
    "//skia/public/interfaces",
    "//url/mojom:url_mojom_gurl",
    "//url/mojom:url_mojom_origin",
  ]

  overridden_deps_blink = [
    ":mojom_core",
    ":mojom_platform",
  ]
  component_deps_blink = [ "//third_party/blink/renderer/core" ]

  export_class_attribute = "BLINK_COMMON_EXPORT"
  export_define = "BLINK_COMMON_IMPLEMENTATION=1"
  export_header = "third_party/blink/public/common/common_export.h"

  export_class_attribute_blink = "MODULES_EXPORT"
  export_define_blink = "BLINK_MODULES_IMPLEMENTATION=1"
  export_header_blink = "third_party/blink/renderer/modules/modules_export.h"
}
