# Copyright 2013 The Flutter 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("//flutter/common/config.gni")
import("//flutter/testing/testing.gni")

config("desktop_library_implementation") {
  defines = [ "FLUTTER_DESKTOP_LIBRARY" ]
}

_public_headers = [
  "public/flutter_export.h",
  "public/flutter_messenger.h",
  "public/flutter_plugin_registrar.h",
  "public/flutter_texture_registrar.h",
]

# Any files that are built by clients (client_wrapper code, library headers for
# implementations using this shared code, etc.) include the public headers
# assuming they are in the include path. This configuration should be added to
# any such code that is also built by GN to make the includes work.
config("relative_flutter_library_headers") {
  include_dirs = [ "public" ]
}

# The headers are a separate source set since the client wrapper is allowed
# to depend on the public headers, but none of the rest of the code.
source_set("common_cpp_library_headers") {
  public = _public_headers

  configs += [ ":desktop_library_implementation" ]
}

copy("publish_headers") {
  sources = _public_headers
  outputs = [ "$root_out_dir/{{source_file_part}}" ]
}

source_set("common_cpp_input") {
  public = [
    "text_editing_delta.h",
    "text_input_model.h",
    "text_range.h",
  ]

  sources = [
    "text_editing_delta.cc",
    "text_input_model.cc",
  ]

  configs += [ ":desktop_library_implementation" ]

  public_configs = [ "//flutter:config" ]

  deps = [ "//flutter/fml:fml" ]
}

source_set("common_cpp_enums") {
  public = [ "platform_provided_menu.h" ]

  public_configs = [
    "//flutter:config",
    "//flutter/common:flutter_config",
  ]
}

source_set("common_cpp_switches") {
  public = [ "engine_switches.h" ]

  sources = [ "engine_switches.cc" ]

  public_configs = [
    "//flutter:config",
    "//flutter/common:flutter_config",
  ]
}

source_set("common_cpp_accessibility") {
  public = [
    "accessibility_bridge.h",
    "flutter_platform_node_delegate.h",
  ]

  sources = [
    "accessibility_bridge.cc",
    "flutter_platform_node_delegate.cc",
  ]

  public_configs =
      [ "//flutter/third_party/accessibility:accessibility_config" ]

  public_deps = [
    "//flutter/fml:fml",
    "//flutter/shell/platform/embedder:embedder_as_internal_library",
    "//flutter/third_party/accessibility",
  ]
}

source_set("common_cpp") {
  public = [
    "incoming_message_dispatcher.h",
    "json_message_codec.h",
    "json_method_codec.h",
  ]

  # TODO: Refactor flutter_glfw.cc to move the implementations corresponding
  # to the _public_headers above into this target.
  sources = [
    "incoming_message_dispatcher.cc",
    "json_message_codec.cc",
    "json_method_codec.cc",
  ]

  configs += [ ":desktop_library_implementation" ]

  public_configs = [ "//flutter:config" ]

  deps = [
    ":common_cpp_library_headers",
    "//flutter/shell/platform/common/client_wrapper:client_wrapper",
    "//flutter/shell/platform/embedder:embedder_as_internal_library",
  ]

  public_deps = [
    ":common_cpp_core",
    "//third_party/rapidjson",
  ]
}

# The portion of common_cpp that has no dependencies on the public/
# headers. This division should be revisited once the Linux GTK
# embedding is further along and it's clearer how much, if any, shared
# API surface there will be.
source_set("common_cpp_core") {
  public = [
    "geometry.h",
    "path_utils.h",
  ]

  sources = [ "path_utils.cc" ]

  public_configs = [ "//flutter:config" ]
}

if (enable_unittests) {
  test_fixtures("common_cpp_core_fixtures") {
    fixtures = []
  }

  executable("common_cpp_core_unittests") {
    testonly = true

    sources = [ "path_utils_unittests.cc" ]

    deps = [
      ":common_cpp_core",
      ":common_cpp_core_fixtures",
      "//flutter/testing",
      "//third_party/dart/runtime:libdart_jit",
    ]

    public_configs = [ "//flutter:config" ]
  }

  test_fixtures("common_cpp_fixtures") {
    fixtures = []
  }

  executable("common_cpp_unittests") {
    testonly = true

    sources = [
      "engine_switches_unittests.cc",
      "geometry_unittests.cc",
      "json_message_codec_unittests.cc",
      "json_method_codec_unittests.cc",
      "text_editing_delta_unittests.cc",
      "text_input_model_unittests.cc",
      "text_range_unittests.cc",
    ]

    deps = [
      ":common_cpp",
      ":common_cpp_fixtures",
      ":common_cpp_input",
      ":common_cpp_switches",
      "//flutter/fml:string_conversion",
      "//flutter/shell/platform/common/client_wrapper:client_wrapper",
      "//flutter/shell/platform/common/client_wrapper:client_wrapper_library_stubs",
      "//flutter/testing",
    ]

    # The accessibility bridge only supports MacOS for now.
    if (is_mac || is_win) {
      sources += [
        "accessibility_bridge_unittests.cc",
        "flutter_platform_node_delegate_unittests.cc",
        "test_accessibility_bridge.cc",
        "test_accessibility_bridge.h",
      ]

      deps += [ ":common_cpp_accessibility" ]
    }

    public_configs = [ "//flutter:config" ]
  }
}
