include(WebKitCommon)

set_property(DIRECTORY . PROPERTY FOLDER "WebInspectorUI")

set(InspectorFiles
    ${WEBINSPECTORUI_DIR}/UserInterface/*.html
    ${WEBINSPECTORUI_DIR}/UserInterface/Base/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Controllers/*.css
    ${WEBINSPECTORUI_DIR}/UserInterface/Controllers/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Debug/*.css
    ${WEBINSPECTORUI_DIR}/UserInterface/Debug/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/External/CodeMirror/*.css
    ${WEBINSPECTORUI_DIR}/UserInterface/External/CodeMirror/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/External/Esprima/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/External/three.js/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Models/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Protocol/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Proxies/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Test/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Views/*.css
    ${WEBINSPECTORUI_DIR}/UserInterface/Views/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Workers/Formatter/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Workers/HeapSnapshot/*.js
    ${WEBINSPECTORUI_DIR}/UserInterface/Images/*.png
    ${WEBINSPECTORUI_DIR}/UserInterface/Images/*.svg
    ${WEBINSPECTORUI_DIR}/Localizations/en.lproj/localizedStrings.js
)

file(GLOB InspectorFilesDependencies
    ${InspectorFiles}
)

set(InspectorResourceScripts
    ${WEBINSPECTORUI_DIR}/Scripts/combine-resources.pl
    ${WEBINSPECTORUI_DIR}/Scripts/copy-user-interface-resources.pl
    ${WEBINSPECTORUI_DIR}/Scripts/fix-worker-imports-for-optimized-builds.pl
    ${WEBINSPECTORUI_DIR}/Scripts/remove-console-asserts.pl
    ${JavaScriptCore_SCRIPTS_DIR}/cssmin.py
    ${JavaScriptCore_SCRIPTS_DIR}/jsmin.py
)

set(WebInspectorUI_RESOURCES_DIR "${WebInspectorUI_DERIVED_SOURCES_DIR}/InspectorResources")
set(WebInspectorUI_LOCALIZED_STRINGS_DIR "${WebInspectorUI_RESOURCES_DIR}/WebInspectorUI/Localizations/en.lproj")

WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS()

# DerivedSources/JavaScriptCore/inspector/InspectorBackendCommands.js is
# expected in DerivedSources/WebInspectorUI/UserInterface/Protocol/.
add_custom_command(
    OUTPUT ${WebInspectorUI_DERIVED_SOURCES_DIR}/UserInterface/Protocol/InspectorBackendCommands.js
    DEPENDS JavaScriptCore
            InspectorBackendCommands
            ${JavaScriptCore_DERIVED_SOURCES_DIR}/inspector/InspectorBackendCommands.js
    COMMAND ${CMAKE_COMMAND} -E copy ${JavaScriptCore_DERIVED_SOURCES_DIR}/inspector/InspectorBackendCommands.js ${WebInspectorUI_DERIVED_SOURCES_DIR}/UserInterface/Protocol/InspectorBackendCommands.js
    VERBATIM
)

if (NOT DEFINED COMBINE_INSPECTOR_RESOURCES)
    if (CMAKE_BUILD_TYPE STREQUAL "Debug")
        set(COMBINE_INSPECTOR_RESOURCES NO)
    else ()
        set(COMBINE_INSPECTOR_RESOURCES YES)
    endif ()
endif ()
if (NOT DEFINED COMBINE_TEST_RESOURCES)
    if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR DEVELOPER_MODE)
        set(COMBINE_TEST_RESOURCES YES)
    else ()
        set(COMBINE_TEST_RESOURCES NO)
    endif ()
endif ()

if (NOT DEFINED INCLUDE_BROWSER_INSPECTOR_FRONTEND_HOST)
    set(INCLUDE_BROWSER_INSPECTOR_FRONTEND_HOST NO)
endif ()

add_custom_command(
    OUTPUT ${CMAKE_BINARY_DIR}/inspector-resources.stamp
    DEPENDS ${InspectorFilesDependencies}
            ${InspectorResourceScripts}
            ${WebInspectorUI_DERIVED_SOURCES_DIR}/UserInterface/Protocol/InspectorBackendCommands.js
    COMMAND ${CMAKE_COMMAND} -E copy ${WebInspectorUI_DERIVED_SOURCES_DIR}/UserInterface/Protocol/InspectorBackendCommands.js ${JavaScriptCore_SCRIPTS_DIR}/InspectorBackendCommands.js
    COMMAND ${CMAKE_COMMAND} -E env "DERIVED_SOURCES_DIR=${WebInspectorUI_DERIVED_SOURCES_DIR}" "SRCROOT=${WEBINSPECTORUI_DIR}" "JAVASCRIPTCORE_PRIVATE_HEADERS_DIR=${JavaScriptCore_SCRIPTS_DIR}" "TARGET_BUILD_DIR=${WebInspectorUI_RESOURCES_DIR}" "UNLOCALIZED_RESOURCES_FOLDER_PATH=WebInspectorUI" "COMBINE_INSPECTOR_RESOURCES=${COMBINE_INSPECTOR_RESOURCES}" "COMBINE_TEST_RESOURCES=${COMBINE_TEST_RESOURCES}" "INCLUDE_BROWSER_INSPECTOR_FRONTEND_HOST=${INCLUDE_BROWSER_INSPECTOR_FRONTEND_HOST}" PYTHON=${PYTHON_EXECUTABLE} ${PERL_EXECUTABLE} ${WEBINSPECTORUI_DIR}/Scripts/copy-user-interface-resources.pl
    COMMAND ${CMAKE_COMMAND} -E make_directory ${WebInspectorUI_LOCALIZED_STRINGS_DIR}
    COMMAND ${CMAKE_COMMAND} -E copy "${WEBINSPECTORUI_DIR}/Localizations/en.lproj/localizedStrings.js" ${WebInspectorUI_LOCALIZED_STRINGS_DIR}/localizedStrings.js
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_BINARY_DIR}/inspector-resources.stamp
    VERBATIM
)

add_custom_target(
    WebInspectorUI
    DEPENDS ${CMAKE_BINARY_DIR}/inspector-resources.stamp
)
