# 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/ui.gni")
import("//testing/test.gni")
import("//third_party/WebKit/Source/build/scripts/scripts.gni")
import("//third_party/WebKit/Source/config.gni")
import("//third_party/WebKit/Source/platform/platform.gni")
import("//third_party/WebKit/Source/platform/platform_generated.gni")

# Most targets in this file are private actions so use that as the default.
visibility = [ ":*" ]

heap_gypi = exec_script("//build/gypi_to_gn.py",
                        [ rebase_path("heap/blink_heap.gypi") ],
                        "scope",
                        [ "heap/blink_heap.gypi" ])

blink_platform_neon_files = [ "graphics/cpu/arm/WebGLImageConversionNEON.h" ]

blink_platform_sse_files = [ "graphics/cpu/x86/WebGLImageConversionSSE.h" ]

# blink_common in blink_platform.gyp
component("blink_common") {
  visibility = []  # Allow re-assignment of list.
  visibility = [ "//third_party/WebKit/*" ]
  sources = [
    "exported/FilePathConversion.cpp",
    "exported/URLConversion.cpp",
    "exported/WebCString.cpp",
    "exported/WebCommon.cpp",
    "exported/WebString.cpp",
  ]

  defines = [
    "BLINK_COMMON_IMPLEMENTATION=1",
    "INSIDE_BLINK",
  ]

  configs += [
    "//build/config/compiler:wexit_time_destructors",
    "//third_party/WebKit/Source:config",
    "//third_party/WebKit/Source:non_test_config",
  ]

  deps = [
    "//base",
    "//third_party/WebKit/Source/wtf",
    "//url",
  ]
}

# FontFamilyNames action in make_platform_generated in
# platform_generated.gyp
action("font_family_names") {
  script = "../build/scripts/make_names.py"

  font_family_names_in = "fonts/FontFamilyNames.in"
  inputs = make_names_files + [ font_family_names_in ]

  outputs = [
    "$blink_platform_output_dir/FontFamilyNames.cpp",
    "$blink_platform_output_dir/FontFamilyNames.h",
  ]

  args = [
    rebase_path(font_family_names_in, root_build_dir),
    "--output_dir",
    rebase_path(blink_platform_output_dir, root_build_dir),
  ]
}

# HTTPNames action in make_platform_generated in
# platform_generated.gyp
action("http_names") {
  script = "../build/scripts/make_names.py"

  http_names_in = "network/HTTPNames.in"
  inputs = make_names_files + [ http_names_in ]

  outputs = [
    "$blink_platform_output_dir/HTTPNames.cpp",
    "$blink_platform_output_dir/HTTPNames.h",
  ]

  args = [
    rebase_path(http_names_in, root_build_dir),
    "--output_dir",
    rebase_path(blink_platform_output_dir, root_build_dir),
  ]
}

# RuntimeEnabledFeatures action in make_platform_generated in
# platform_generated.gyp
action("runtime_enabled_features") {
  script = "../build/scripts/make_runtime_features.py"

  runtime_enabled_features_in = "RuntimeEnabledFeatures.in"
  inputs = scripts_for_in_files + [
             runtime_enabled_features_in,
             "../build/scripts/templates/RuntimeEnabledFeatures.cpp.tmpl",
             "../build/scripts/templates/RuntimeEnabledFeatures.h.tmpl",
           ]

  outputs = [
    "$blink_platform_output_dir/RuntimeEnabledFeatures.cpp",
    "$blink_platform_output_dir/RuntimeEnabledFeatures.h",
  ]

  args = [
    rebase_path(runtime_enabled_features_in, root_build_dir),
    "--output_dir",
    rebase_path(blink_platform_output_dir, root_build_dir),
  ]
}

# ColorData action in make_platform_generated in platform_generated.gyp
action("color_data") {
  script = "../build/scripts/gperf.py"

  color_data_gperf = "ColorData.gperf"
  inputs = [
    color_data_gperf,
  ]

  output_file = "$blink_platform_output_dir/ColorData.cpp"
  outputs = [
    output_file,
  ]

  args = [
    gperf_exe,
    "--key-positions=*",
    "-D",
    "-s",
    "2",
    rebase_path(color_data_gperf, root_build_dir),
    "--output-file=" + rebase_path(output_file, root_build_dir),
  ]
}

action("character_data") {
  script = "../build/scripts/gperf.py"
  deps = [
    ":character_data_generator($host_toolchain)",
  ]
  output_file = "$blink_platform_output_dir/CharacterPropertyData.cpp"
  outputs = [
    output_file,
  ]

  # Find character_data_generator, which is generated in a different directory
  # when cross-compile.
  generator = "./" + rebase_path(
                  get_label_info(":character_data_generator($host_toolchain)",
                                 "root_out_dir") + "/character_data_generator",
                  root_build_dir)
  args = [
    generator,
    rebase_path(output_file, root_build_dir),
  ]
}

executable("character_data_generator") {
  sources = [
    "fonts/CharacterPropertyDataGenerator.cpp",
    "fonts/CharacterPropertyDataGenerator.h",
  ]
  configs += [ "//third_party/WebKit/Source:config" ]
  deps = [
    "//build/config/sanitizers:deps",
    "//third_party/icu",
  ]
}

# Inspector protocol

protocol_file = "../devtools/protocol.json"

action("inspector_protocol_sources") {
  script = "inspector_protocol/CodeGenerator.py"

  inputs = [
    protocol_file,
    "inspector_protocol/Backend_h.template",
    "inspector_protocol/Dispatcher_h.template",
    "inspector_protocol/Dispatcher_cpp.template",
    "inspector_protocol/Frontend_h.template",
    "inspector_protocol/Frontend_cpp.template",
    "inspector_protocol/TypeBuilder_h.template",
    "inspector_protocol/TypeBuilder_cpp.template",
  ]
  outputs = [
    "$blink_platform_output_dir/inspector_protocol/Backend.h",
    "$blink_platform_output_dir/inspector_protocol/Dispatcher.cpp",
    "$blink_platform_output_dir/inspector_protocol/Dispatcher.h",
    "$blink_platform_output_dir/inspector_protocol/Frontend.cpp",
    "$blink_platform_output_dir/inspector_protocol/Frontend.h",
    "$blink_platform_output_dir/inspector_protocol/TypeBuilder.cpp",
    "$blink_platform_output_dir/inspector_protocol/TypeBuilder.h",
  ]

  args = [
    rebase_path(protocol_file, root_build_dir),
    "--output_dir",
    rebase_path(blink_platform_output_dir + "/inspector_protocol/",
                root_build_dir),
  ]

  deps = [
    ":inspector_protocol_version",
  ]
}

action("inspector_protocol_version") {
  script = "inspector_protocol/generate-inspector-protocol-version"

  inputs = [
    protocol_file,
  ]
  output_file =
      "$blink_platform_output_dir/inspector_protocol/InspectorProtocolVersion.h"
  outputs = [
    output_file,
  ]

  args = [
    "-o",
    rebase_path(output_file, root_build_dir),
    rebase_path(protocol_file, root_build_dir),
  ]
}

action("inspector_injected_script") {
  script = "v8_inspector/build/xxd.py"
  inputs = [
    "v8_inspector/InjectedScriptSource.js",
  ]
  outputs = [
    "$blink_platform_output_dir/v8_inspector/InjectedScriptSource.h",
  ]
  args = [
    "InjectedScriptSource_js",
    rebase_path("v8_inspector/InjectedScriptSource.js", root_build_dir),
    rebase_path(
        "$blink_platform_output_dir/v8_inspector/InjectedScriptSource.h",
        root_build_dir),
  ]
}

action("inspector_debugger_script") {
  script = "v8_inspector/build/xxd.py"
  inputs = [
    "v8_inspector/DebuggerScript.js",
  ]
  outputs = [
    "$blink_platform_output_dir/v8_inspector/DebuggerScript.h",
  ]
  args = [
    "DebuggerScript_js",
    rebase_path("v8_inspector/DebuggerScript.js", root_build_dir),
    rebase_path("$blink_platform_output_dir/v8_inspector/DebuggerScript.h",
                root_build_dir),
  ]
}

# This isn't strictly necessary since we can just add the deps to "platform",
# but it helps to have the targets match the GYP build.
group("make_platform_generated") {
  visibility = []  # Allow re-assignment of list.
  visibility = [ "//third_party/WebKit/Source/*" ]
  public_deps = [
    ":blink_common",
    ":character_data",
    ":color_data",
    ":font_family_names",
    ":http_names",
    ":inspector_debugger_script",
    ":inspector_injected_script",
    ":inspector_protocol_sources",
    ":runtime_enabled_features",
  ]
}

# TODO(brettw) Objective C Renaming postbuild steps on Mac.
# blink_platform target in blink_platform.gyp
component("platform") {
  visibility = []  # Allow re-assignment of list.
  visibility = [ "//third_party/WebKit/*" ]
  output_name = "blink_platform"

  sources = platform_files
  sources -= blink_platform_neon_files
  sources -= blink_platform_sse_files

  # Add in the generated files.
  sources += get_target_outputs(":character_data") +
             get_target_outputs(":color_data") +
             get_target_outputs(":font_family_names") +
             get_target_outputs(":http_names") +
             get_target_outputs(":inspector_debugger_script") +
             get_target_outputs(":inspector_injected_script") +
             get_target_outputs(":inspector_protocol_sources") +
             get_target_outputs(":runtime_enabled_features")

  configs += [
    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    "//build/config/compiler:no_size_t_to_int_warning",
    "//third_party/WebKit/Source:config",
    "//third_party/WebKit/Source:non_test_config",
  ]

  defines = [
    "BLINK_PLATFORM_IMPLEMENTATION=1",
    "INSIDE_BLINK",
  ]

  include_dirs = [
    #"$angle_path/include",
    "$root_gen_dir/blink",
  ]

  public_deps = [
    ":make_platform_generated",
    "//base",
    "//cc",
    "//gpu/command_buffer/client:gles2_c_lib",
    "//gpu/command_buffer/client:gles2_interface",
    "//skia",
    "//third_party:jpeg",
    "//third_party/WebKit/Source/wtf",
    "//third_party/iccjpeg",
    "//third_party/libpng",
    "//third_party/libwebp",
    "//third_party/ots",
    "//third_party/qcms",
    "//url",
    "//v8",
  ]
  deps = [
    "//mojo/public/c/system:for_component",
    "//mojo/public/cpp/bindings:callback",
    "//mojo/public/cpp/bindings:wtf_support",
    "//third_party/WebKit/Source/platform/heap",
    "//third_party/harfbuzz-ng",
    "//third_party/icu",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]

  if (is_mac) {
    sources -= [
      # Uses KillRingMac.mm instead.
      "KillRingNone.cpp",
      "fonts/skia/FontCacheSkia.cpp",
      "scroll/ScrollAnimator.cpp",
      "scroll/ScrollAnimator.h",

      # Uses LocaleMac instead.
      "text/LocaleICU.cpp",
      "text/LocaleICU.h",
    ]

    configs += [ "//third_party/WebKit/Source:mac_precompiled_headers" ]
    libs = [
      "Accelerate.framework",
      "Carbon.framework",
      "Foundation.framework",
    ]
  } else {
    sources -= [
      "geometry/cg/FloatPointCG.cpp",
      "geometry/cg/FloatRectCG.cpp",
      "geometry/cg/FloatSizeCG.cpp",
      "geometry/cg/IntPointCG.cpp",
      "geometry/cg/IntRectCG.cpp",
      "geometry/cg/IntSizeCG.cpp",
    ]
  }

  if (is_win) {
    sources -= [
      "clipboard/ClipboardUtilitiesPosix.cpp",

      # Uses LocaleWin instead.
      "text/LocaleICU.cpp",
      "text/LocaleICU.h",
    ]
    cflags = [
      "/wd4334",  # Result of 32-bit shift implicitly converted to 64 bits.
      "/wd4724",  # Modulo by 0.
    ]
  } else {
    sources -= [
      "clipboard/ClipboardUtilitiesWin.cpp",
      "text/LocaleWin.cpp",
    ]
  }

  if (is_android) {
    # Add in some Linux files also shared with Android.
    set_sources_assignment_filter([])
    sources += [
      "exported/linux/WebFontRenderStyle.cpp",
      "fonts/linux/FontPlatformDataLinux.cpp",
    ]
    set_sources_assignment_filter(sources_assignment_filter)
  } else {
    sources -= [ "scroll/ScrollbarThemeAndroid.cpp" ]
  }

  if (is_linux) {
    public_deps += [ "//build/linux:fontconfig" ]
  }

  if (!use_default_render_theme) {
    sources -= [
      "scroll/ScrollbarThemeAura.cpp",
      "scroll/ScrollbarThemeAura.h",
    ]
  }

  if (current_cpu == "arm") {
    deps += [ ":blink_arm_neon" ]
  }

  if (current_cpu == "x86" || current_cpu == "x64") {
    deps += [ ":blink_x86_sse" ]
  }

  if (use_webaudio_ffmpeg) {
    include_dirs += [ "//third_party/ffmpeg" ]
    deps += [ "//third_party/ffmpeg" ]
  }
  if (use_openmax_dl_fft) {
    include_dirs += [ "//third_party/openmax_dl" ]
    deps += [ "//third_party/openmax_dl/dl" ]
  }

  if (remove_webcore_debug_symbols) {
    configs -= [ "//build/config/compiler:default_symbols" ]
    configs += [ "//build/config/compiler:no_symbols" ]
  }
}

source_set("test_support") {
  sources = platform_test_support_files
  visibility += [ "//third_party/WebKit/*" ]
  testonly = true

  configs += [
    "//third_party/WebKit/Source:config",
    "//third_party/WebKit/Source:inside_blink",
    "//third_party/WebKit/Source:non_test_config",
  ]

  public_deps = [
    ":platform",
    "//cc",
    "//cc:test_support",
    "//cc/blink",
    "//testing/gmock",
  ]

  deps = [
    "//base/test:test_support",
    "//mojo/edk/system",
    "//third_party/qcms",
  ]

  if (is_win) {
    cflags = [ "/wd4267" ]  # Truncation from size_t to int.
  }
}

# GYP: blink_heap_unittests
test("blink_heap_unittests") {
  visibility = []  # Allow re-assignment of list.
  visibility = [ "*" ]

  sources = rebase_path(heap_gypi.platform_heap_test_files, ".", "heap")
  sources += [ "heap/RunAllTests.cpp" ]

  configs += [
    "//third_party/WebKit/Source/wtf:wtf_config",
    "//third_party/WebKit/Source:config",
  ]

  defines = [ "INSIDE_BLINK" ]

  deps = [
    ":platform",
    "//base",
    "//base/test:test_support",
    "//content/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/WebKit/Source/platform:test_support",
    "//third_party/WebKit/Source/wtf",
  ]
  if (is_android) {
    deps += [
      "//base:base_java",
      "//content/shell/android:content_shell_assets",
      "//net/android:net_java",
    ]
  }
}

test("blink_platform_unittests") {
  visibility = []  # Allow re-assignment of list.
  visibility = [ "*" ]

  sources = platform_test_files

  if (is_win) {
    sources += [ "text/LocaleWinTest.cpp" ]
  } else if (is_mac) {
    sources += [ "text/LocaleMacTest.cpp" ]
  } else if (is_posix) {
    sources += [ "text/LocaleICUTest.cpp" ]
  }

  if (!is_mac) {
    sources += [ "scroll/ScrollAnimatorTest.cpp" ]
  }

  sources += [ "testing/RunAllTests.cpp" ]

  configs += [
    "//third_party/WebKit/Source/wtf:wtf_config",
    "//third_party/WebKit/Source:config",
  ]

  deps = [
    ":blink_common",
    ":platform",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//cc",
    "//cc:test_support",
    "//cc/blink",
    "//mojo/edk/embedder:headers",
    "//mojo/edk/test:test_support",
    "//mojo/public/cpp/bindings/tests:for_blink_tests",
    "//skia",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/WebKit/Source/wtf",
    "//third_party/harfbuzz-ng",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//url",
  ]

  data_deps = [
    ":blink_platform_unittests_data",
  ]

  defines = [ "INSIDE_BLINK" ]

  include_dirs = [ "$root_gen_dir/blink" ]
}

group("blink_platform_unittests_data") {
  data = [
    "testing/data/",

    # Required by some image decoder tests.
    "image-decoders/testing/",
    "../../LayoutTests/fast/images/resources/",
  ]
}

if (current_cpu == "arm") {
  source_set("blink_arm_neon") {
    sources = blink_platform_neon_files

    # The *NEON.cpp files fail to compile when -mthumb is passed. Force
    # them to build in ARM mode.
    # See https://bugs.webkit.org/show_bug.cgi?id=62916.
    # TODO(GYP)
    #'cflags': ['-marm'],
    #    'conditions': [
    #      ['OS=="android"', {
    #        'cflags!': ['-mthumb'],
    #      }],
    #    ],

    deps = [
      ":blink_common",
    ]
  }
}

if (current_cpu == "x86" || current_cpu == "x64") {
  source_set("blink_x86_sse") {
    sources = blink_platform_sse_files
    deps = [
      ":blink_common",
    ]
  }
}
