# Copyright 2015 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")

# Depend upon //ash/public/cpp, which has a public_dep on this. The two targets
# must be bundled together as the typemaps depend upon //ash/public/cpp,
# and //ash/public/cpp needs to depend on this for generated code (such as
# enums and constants).
mojom("interfaces_internal") {
  visibility = [ "//ash/public/cpp:*" ]
  disable_variants = true

  sources = [
    "accelerator_controller.mojom",
    "accessibility_controller.mojom",
    "accessibility_controller_enums.mojom",
    "accessibility_focus_ring_controller.mojom",
    "app_list.mojom",
    "arc_custom_tab.mojom",
    "ash_display_controller.mojom",
    "ash_message_center_controller.mojom",
    "ash_window_manager.mojom",
    "assistant_controller.mojom",
    "assistant_image_downloader.mojom",
    "assistant_setup.mojom",
    "assistant_volume_control.mojom",
    "cast_config.mojom",
    "constants.mojom",
    "cros_display_config.mojom",
    "display_output_protection.mojom",
    "docked_magnifier_controller.mojom",
    "event_properties.mojom",
    "event_rewriter_controller.mojom",
    "first_run_helper.mojom",
    "highlighter_controller.mojom",
    "ime_controller.mojom",
    "ime_info.mojom",
    "keyboard_controller.mojom",
    "kiosk_app_info.mojom",
    "kiosk_next_shell.mojom",
    "locale.mojom",
    "login_screen.mojom",
    "login_user_info.mojom",
    "media.mojom",
    "menu.mojom",
    "multi_user_window_manager.mojom",
    "new_window.mojom",
    "night_light_controller.mojom",
    "note_taking_controller.mojom",
    "pref_connector.mojom",
    "process_creation_time_recorder.mojom",
    "session_controller.mojom",
    "shelf.mojom",
    "shutdown.mojom",
    "split_view.mojom",
    "system_tray.mojom",
    "tablet_mode.mojom",
    "tray_action.mojom",
    "update.mojom",
    "user_info.mojom",
    "voice_interaction_controller.mojom",
    "volume.mojom",
    "vpn_list.mojom",
    "wallpaper.mojom",
    "window_pin_type.mojom",
    "window_properties.mojom",
    "window_state_type.mojom",
  ]

  public_deps = [
    "//chromeos/components/proximity_auth/public/interfaces",
    "//chromeos/services/assistant/public/mojom",
    "//components/account_id/interfaces",
    "//components/arc/common:notifications",
    "//components/sync/mojo:interfaces",
    "//mojo/public/mojom/base",
    "//services/content/public/mojom",
    "//services/preferences/public/mojom",
    "//skia/public/interfaces",
    "//ui/accessibility:ax_enums_mojo",
    "//ui/base/ime/chromeos/public/interfaces",
    "//ui/base/mojo",
    "//ui/display/mojo:interfaces",
    "//ui/events/mojo:interfaces",
    "//ui/gfx/geometry/mojo",
    "//ui/gfx/image/mojo:interfaces",
    "//ui/gfx/range/mojo",
    "//ui/keyboard:mojom",
    "//ui/message_center/public/mojo:mojo",
    "//url/mojom:url_mojom_gurl",
  ]

  component_output_prefix = "ash_public_interfaces_internal"
  export_class_attribute = "ASH_PUBLIC_EXPORT"
  export_define = "ASH_PUBLIC_IMPLEMENTATION=1"
  export_header = "ash/public/cpp/ash_public_export.h"
}

mojom("test_interfaces") {
  testonly = true
  disable_variants = true
  sources = [
    "login_screen_test_api.test-mojom",
    "shelf_test_api.test-mojom",
    "shell_test_api.test-mojom",
    "status_area_widget_test_api.test-mojom",
    "system_tray_test_api.test-mojom",
    "time_to_first_present_recorder_test_api.test-mojom",
  ]
  deps = [
    "//components/account_id/interfaces",
    "//mojo/public/mojom/base",
    "//ui/gfx/geometry/mojo",
  ]
}
