From 7d5a8f79083bf01e4a3bad5f81861ba0bd368088 Mon Sep 17 00:00:00 2001 From: Sidhanth B H Date: Fri, 30 May 2025 12:43:51 +0530 Subject: [PATCH] RDKEMW-3466 : Run Viper JSPP Integrated Player in RDK NativeScript Reason for change: Cleaned up the code Test Procedure: build should be successful. Risks: low Priority: P2 --- CMakeLists.txt | 127 +++++++++-------- src/JSRuntimeLauncher.cpp | 278 ++++++++++++++++++++++++++++++++++++++ src/NativeJSRenderer.cpp | 8 ++ 3 files changed, 357 insertions(+), 56 deletions(-) create mode 100644 src/JSRuntimeLauncher.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 878a350..e0966ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,19 +14,20 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - + project("JSRuntime") cmake_minimum_required(VERSION 3.16) set(JSRUNTIME_LIBRARY_NAME "JSRuntime") set(JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME "") set(EXE "JSRuntime") - + option(BUILD_JSRUNTIME_APP "BUILD_JSRUNTIME_APP" ON) - + option(ENABLE_JSRUNTIME_SERVER "ENABLE_JSRUNTIME_SERVER" OFF) option(BUILD_JSRUNTIME_CLIENT "BUILD_JSRUNTIME_CLIENT" OFF) option(NATIVEJS_DEVELOPER_MODE "NATIVEJS_DEVELOPER_MODE" OFF) - +option(ENABLE_JSRUNTIME_LAUNCHER "ENABLE_JSRUNTIME_LAUNCHER" OFF) + #can be jsc or node or v8 or quickjs option(JSRUNTIME_ENGINE_NAME "JSRUNTIME_ENGINE_NAME" "jsc") option(ENABLE_JSRUNTIME_ESSOS "ENABLE_JSRUNTIME_ESSOS" OFF) @@ -39,7 +40,7 @@ option(ENABLE_JSRUNTIME_PLAYER "ENABLE_JSRUNTIME_PLAYER" OFF) option(ENABLE_JSRUNTIME_THUNDER_SECURITYAGENT "ENABLE_JSRUNTIME_THUNDER_SECURITYAGENT" OFF) option(BUILD_JSRUNTIME_DESKTOP "BUILD_JSRUNTIME_DESKTOP" ON) option(PKG_CONFIG_SYSROOT_DIR "PKG_CONFIG_SYSROOT_DIR" "${CMAKE_CURRENT_SOURCE_DIR}/externals/extlibs") - + if(JSRUNTIME_ENGINE_NAME STREQUAL "jsc") set(JSRUNTIME_LIBRARY_NAME "JSRuntimeJSC") set(EXE "JSRuntimeJSC") @@ -47,88 +48,92 @@ elseif(JSRUNTIME_ENGINE_NAME STREQUAL "quickjs") set(JSRUNTIME_LIBRARY_NAME "JSRuntimeQuickJS") set(EXE "JSRuntimeQuickJS") endif (JSRUNTIME_ENGINE_NAME STREQUAL "jsc") - + set(JSRUNTIME_COMMON_SOURCE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src") set(JSRUNTIME_SOURCE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/${JSRUNTIME_ENGINE_NAME}") - + if (NOT BUILD_JSRUNTIME_DESKTOP) set (ENV{PKG_CONFIG_SYSROOT_DIR} ${PKG_CONFIG_SYSROOT_DIR}) else () - #set(CMAKE_C_COMPILER "g++") + #set(CMAKE_C_COMPILER "g++") #set(CMAKE_CXX_COMPILER "g++") set (PKG_CONFIG_SYSROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/externals/extlibs) set (ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/externals/extlibs) endif (NOT BUILD_JSRUNTIME_DESKTOP) - -set (JSRUNTIME_COMMON_FILES - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/linux/KeyInput.cpp - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/JavaScriptContextBase.cpp - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/NativeJSRenderer.cpp - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/ModuleSettings.cpp - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/TimeUtils.cpp - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/NativeJSLogger.cpp + +set (JSRUNTIME_COMMON_FILES + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/linux/KeyInput.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/JavaScriptContextBase.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/NativeJSRenderer.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/ModuleSettings.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/TimeUtils.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/NativeJSLogger.cpp ) - + if (ENABLE_JSRUNTIME_ESSOS) set (JSRUNTIME_COMMON_FILES ${JSRUNTIME_COMMON_FILES} - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/EssosInstance.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/EssosInstance.cpp ) add_definitions("-DENABLE_ESSOS") endif (ENABLE_JSRUNTIME_ESSOS) - + if ( ENABLE_REMOTE_INSPECTOR ) add_definitions("-DENABLE_REMOTE_INSPECTOR") endif ( ENABLE_REMOTE_INSPECTOR ) - + if ( ENABLE_JSRUNTIME_PLAYER ) add_definitions("-DENABLE_JSRUNTIME_PLAYER") endif ( ENABLE_JSRUNTIME_PLAYER ) - + if ( ENABLE_AAMP_JSBINDINGS_STATIC ) - set(ENABLE_AAMP_JSBINDINGS ON) - add_definitions("-DENABLE_AAMP_JSBINDINGS") - add_definitions("-DENABLE_AAMP_JSBINDINGS_STATIC") + set(ENABLE_AAMP_JSBINDINGS ON) + add_definitions("-DENABLE_AAMP_JSBINDINGS") + add_definitions("-DENABLE_AAMP_JSBINDINGS_STATIC") endif ( ENABLE_AAMP_JSBINDINGS_STATIC ) - + if ( ENABLE_AAMP_JSBINDINGS_DYNAMIC ) - set(ENABLE_AAMP_JSBINDINGS ON) - add_definitions("-DENABLE_AAMP_JSBINDINGS") - add_definitions("-DENABLE_AAMP_JSBINDINGS_DYNAMIC") + set(ENABLE_AAMP_JSBINDINGS ON) + add_definitions("-DENABLE_AAMP_JSBINDINGS") + add_definitions("-DENABLE_AAMP_JSBINDINGS_DYNAMIC") endif ( ENABLE_AAMP_JSBINDINGS_DYNAMIC ) - + if (ENABLE_JSRUNTIME_THUNDER_SECURITYAGENT) add_definitions("-DENABLE_JSRUNTIME_THUNDER_SECURITYAGENT") endif (ENABLE_JSRUNTIME_THUNDER_SECURITYAGENT) - + include (${JSRUNTIME_SOURCE_DIRECTORY}/include.cmake) set(JSRUNTIME_APP_FILES - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/jsruntime.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/jsruntime.cpp ) - + +set(JSRUNTIME_LAUNCHER_FILES + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/JSRuntimeLauncher.cpp +) + if ( ENABLE_JSRUNTIME_SERVER ) add_definitions("-DENABLE_JSRUNTIME_SERVER") add_definitions("-DWS_SERVER_PORT=9112") set (JSRUNTIME_APP_FILES ${JSRUNTIME_APP_FILES} - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/JSRuntimeServer.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/JSRuntimeServer.cpp ) endif ( ENABLE_JSRUNTIME_SERVER ) - + set(JSRUNTIME_CLIENT_FILES - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/JSRuntimeClient.cpp - ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/NativeJSLogger.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/JSRuntimeClient.cpp + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/NativeJSLogger.cpp ) - + add_library(${JSRUNTIME_LIBRARY_NAME} SHARED - ${JSRUNTIME_COMMON_FILES} - ${JSRUNTIME_ENGINE_FILES} + ${JSRUNTIME_COMMON_FILES} + ${JSRUNTIME_ENGINE_FILES} ) - + set(JSRUNTIME_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include/${JSRUNTIME_ENGINE_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/include/linux ${CMAKE_CURRENT_SOURCE_DIR}/src/jsc/jsc_lib ${JSRUNTIME_ENGINE_INCLUDE_DIRECTORIES}) - + set(JSRUNTIME_LIBRARY_LINK_DIRECTORIES ${JSRUNTIME_ENGINE_LIBRARY_LINK_DIRECTORIES}) set(JSRUNTIME_LINK_LIBRARIES -lssl -lcrypto -lffi -lcurl -lglib-2.0 -luWS -luv -lz) set(JSRUNTIME_LINK_LIBRARIES ${JSRUNTIME_ENGINE_LIBRARIES} ${JSRUNTIME_ENGINE_DEPENDENT_LIBRARIES} ${JSRUNTIME_LINK_LIBRARIES}) - + if (ENABLE_JSRUNTIME_THUNDER_SECURITYAGENT) add_definitions("-DENABLE_JSRUNTIME_THUNDER_SECURITYAGENT") set(JSRUNTIME_LINK_LIBRARIES ${JSRUNTIME_LINK_LIBRARIES} -lsecurityagent) @@ -136,7 +141,7 @@ endif(ENABLE_JSRUNTIME_THUNDER_SECURITYAGENT) if (BUILD_JSRUNTIME_DESKTOP) set(JSRUNTIME_INCLUDE_DIRECTORIES ${JSRUNTIME_INCLUDE_DIRECTORIES} $ENV{PKG_CONFIG_SYSROOT_DIR}/include $ENV{PKG_CONFIG_SYSROOT_DIR}/include/glib-2.0 $ENV{PKG_CONFIG_SYSROOT_DIR}/include/glib-2.0/glib $ENV{PKG_CONFIG_SYSROOT_DIR}/include/WPEFramework $ENV{PKG_CONFIG_SYSROOT_DIR}/include/uwebsockets) set(JSRUNTIME_LIBRARY_LINK_DIRECTORIES ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} -L$ENV{PKG_CONFIG_SYSROOT_DIR}/lib) - + if (APPLE) set(JSRUNTIME_LIBRARY_PLATFORM_INCLUDE_DIRECTORIES "") set(JSRUNTIME_LIBRARY_PLATFORM_LINK_DIRECTORIES "") @@ -144,11 +149,11 @@ if (BUILD_JSRUNTIME_DESKTOP) set(JSRUNTIME_LIBRARY_PLATFORM_INCLUDE_DIRECTORIES $ENV{PKG_CONFIG_SYSROOT_DIR}/lib/x86_64-linux-gnu/glib-2.0/include) set(JSRUNTIME_LIBRARY_PLATFORM_LINK_DIRECTORIES -L$ENV{PKG_CONFIG_SYSROOT_DIR}/lib/x86_64-linux-gnu/) endif (APPLE) - + if (ENABLE_JSRUNTIME_ESSOS) set(JSRUNTIME_LINK_LIBRARIES ${JSRUNTIME_LINK_LIBRARIES} -lessos) endif (ENABLE_JSRUNTIME_ESSOS) - + set(JSRUNTIME_INCLUDE_DIRECTORIES ${JSRUNTIME_INCLUDE_DIRECTORIES} ${JSRUNTIME_LIBRARY_PLATFORM_INCLUDE_DIRECTORIES}) set(JSRUNTIME_LIBRARY_LINK_DIRECTORIES ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} ${JSRUNTIME_LIBRARY_PLATFORM_LINK_DIRECTORIES}) set(JSRUNTIME_LIBRARY_LINK_DIRECTORIES ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} -L${CMAKE_CURRENT_SOURCE_DIR}/build/) @@ -157,9 +162,9 @@ else () set(JSRUNTIME_LINK_LIBRARIES ${JSRUNTIME_LINK_LIBRARIES} -lessos) set(JSRUNTIME_LIBRARY_LINK_DIRECTORIES ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} -L${CMAKE_CURRENT_SOURCE_DIR}/../build/) endif (BUILD_JSRUNTIME_DESKTOP) - + if (BUILD_JSRUNTIME_APP) - message("Enabling build support for jsruntime app") + message("Enabling build support for jsruntime app") add_executable(jsruntime_app ${JSRUNTIME_APP_FILES}) add_dependencies(${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME}) add_dependencies(jsruntime_app ${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME} ) @@ -167,35 +172,45 @@ if (BUILD_JSRUNTIME_APP) set_target_properties(jsruntime_app PROPERTIES OUTPUT_NAME ${EXE}) target_link_libraries(jsruntime_app ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} -l${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_LINK_LIBRARIES}) endif (BUILD_JSRUNTIME_APP) - + if (BUILD_JSRUNTIME_CLIENT) add_executable(jsruntime_client ${JSRUNTIME_CLIENT_FILES}) target_include_directories(jsruntime_client PRIVATE ${JSRUNTIME_INCLUDE_DIRECTORIES}) set_target_properties(jsruntime_client PROPERTIES OUTPUT_NAME "JSRuntimeClient") target_link_libraries(jsruntime_client ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} -lpthread) endif (BUILD_JSRUNTIME_CLIENT) - + +if (ENABLE_JSRUNTIME_LAUNCHER) + message("Enabling build support for jsruntime launcher - widget") + add_executable(jsruntime_launcher ${JSRUNTIME_LAUNCHER_FILES}) + add_dependencies(${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME}) + add_dependencies(jsruntime_launcher ${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME} ) + target_include_directories(jsruntime_launcher PRIVATE ${JSRUNTIME_INCLUDE_DIRECTORIES}) + set_target_properties(jsruntime_launcher PROPERTIES OUTPUT_NAME "JSRuntimeLauncher") + target_link_libraries(jsruntime_launcher ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} -l${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_LINK_LIBRARIES}) +endif (ENABLE_JSRUNTIME_LAUNCHER) + set(UWEBSOCKETS_TARGET "Linux") if (APPLE) set(UWEBSOCKETS_TARGET "Darwin") endif (APPLE) - + add_definitions("-std=c++17 -DUSE_LIBUV") set_target_properties(${JSRUNTIME_LIBRARY_NAME} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED YES) - + set_target_properties(${JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED YES) - + target_include_directories(${JSRUNTIME_LIBRARY_NAME} PRIVATE ${JSRUNTIME_INCLUDE_DIRECTORIES}) target_link_libraries(${JSRUNTIME_LIBRARY_NAME} PRIVATE ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} ${JSRUNTIME_LINK_LIBRARIES}) - + if(NOT JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME STREQUAL "") target_include_directories(${JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME} PRIVATE ${JSRUNTIME_INCLUDE_DIRECTORIES}) endif (NOT JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME STREQUAL "") - + find_package(CURL) if (CURL_FOUND) include_directories(${CURL_INCLUDE_DIRS}) @@ -203,7 +218,7 @@ if (CURL_FOUND) else (CURL_FOUND) message ("Curl/libcurl required.") endif (CURL_FOUND) - - + + install(TARGETS ${JSRUNTIME_LIBRARY_NAME} DESTINATION lib) diff --git a/src/JSRuntimeLauncher.cpp b/src/JSRuntimeLauncher.cpp new file mode 100644 index 0000000..09cea14 --- /dev/null +++ b/src/JSRuntimeLauncher.cpp @@ -0,0 +1,278 @@ +#include +#include +#include +#if defined(ENABLE_JSRUNTIME_SERVER) +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "rapidjson/document.h" +#include +#include +#include +#include + +using namespace rapidjson; +using namespace std; +using namespace JsRuntime; + +string source="/package/index.js"; +std::vector flags; + +void extractJSFilePaths(const std::string& jsFilePath) { + std::ifstream file(jsFilePath); + + if (!file.is_open()) { + std::cerr << "Error: Could not open file '" << jsFilePath << "'\n"; + return; + } + + std::string line; + while (std::getline(file, line)) { + if (!line.empty()) { + std::cout<<"line:"< options; + for (SizeType i = 0; i < flagsarr.Size(); i++) { + const Value& flagOption = flagsarr[i]; + if (!flagOption.IsObject()) + continue; + + if (flagOption.HasMember("name") && flagOption.HasMember("enable")) { + const Value& name = flagOption["name"]; + const Value& enable = flagOption["enable"]; + + if(name=="player" && enable==true) + { + flags.push_back("--enablePlayer"); + } + else if(name=="xhr" && enable==true) + { + flags.push_back("--enableXHR"); + } + else if(name=="websocket" && enable==true) + { + flags.push_back("--enableWebSocket"); + } + else if(name=="http" && enable==true) + { + flags.push_back("--enableHttp"); + } + else if(name=="websocketenhanced" && enable==true) + { + flags.push_back("--enableWebSocketEnhanced"); + } + else if(name=="fetch" && enable==true) + { + flags.push_back("--enableFetch"); + } + else if(name=="jsdom" && enable==true) + { + flags.push_back("--enableJSDOM"); + } + else if(name=="window" && enable==true) + { + flags.push_back("--enableWindow"); + } + else if(name=="console" && enable==true) + { + flags.push_back("--console"); + } + else if(name=="display" && enable==true) + { + flags.push_back("--display"); + } + else{ + continue; + } + + } + } + } +} + +int main(int argc, char *argv[]) { + const char* filename = "/package/rdk.config"; + std::ifstream file(filename); + if (file.good()) + { + std::string jsonStr, line; + while (std::getline(file, line)) { + jsonStr += line + "\n"; + } + file.close(); + cJSON* root = cJSON_Parse(jsonStr.c_str()); + if (root){ + cJSON* envs = cJSON_GetObjectItem(root, "configuration"); + cJSON* envArray = cJSON_GetObjectItem(envs, "envs"); + cJSON* env; + cJSON_ArrayForEach(env, envArray) { + cJSON* key = cJSON_GetObjectItem(env, "key"); + cJSON* value = cJSON_GetObjectItem(env, "value"); + if (key && value && cJSON_IsString(key) && cJSON_IsString(value)) { + setenv(key->valuestring, value->valuestring, 1); + } + } + cJSON_Delete(root); + } + } + vector c_flags; + const char* var = "LD_LIBRARY_PATH"; + const char* path = "/runtime/usr/lib:/runtime/usr/lib/javascriptcore:/usr/lib"; + + if(setenv(var,path,1)==0) + { + cout<<"Library Path set successfully"< applications; + ModuleSettings moduleSettings; + bool consoleMode = false; + + while (i renderer = std::make_shared(waylanddisplay); + if (consoleMode) { + renderer->setEnvForConsoleMode(moduleSettings); + } + if (!renderer) + { + NativeJSLogger::log(ERROR, "Unable to run application\n"); + return -1; + } + +#if defined(ENABLE_JSRUNTIME_SERVER) + if (runServer == true) + { + JSRuntimeServer *server = JSRuntimeServer::getInstance(); + server->initialize(WS_SERVER_PORT, renderer); + server->start(); + } +#endif + + uint32_t id = renderer->createApplication(moduleSettings); + for (int j = 0; j < applications.size(); j++) { + std::string url = applications[j]; + NativeJSLogger::log(INFO, "Application URL is %s\n", (url.size() ? url.c_str() : "empty")); + renderer->runApplication(id, url); + } + + renderer->run(); + return 0; +} diff --git a/src/NativeJSRenderer.cpp b/src/NativeJSRenderer.cpp index 5967279..68b6dd6 100644 --- a/src/NativeJSRenderer.cpp +++ b/src/NativeJSRenderer.cpp @@ -326,6 +326,10 @@ void NativeJSRenderer::runApplicationInternal(ApplicationRequest& appRequest) return ; } JavaScriptContext* context = (JavaScriptContext*)mContextMap[id].context; + std::stringstream window; + window<<"window.location = {\"href\":\"file:/" << url << "\"};"; + std::cout << "Adding the window location:" << window.str().c_str()<< " to js file" << std::endl; + context->runScript(window.str().c_str(),true, url, nullptr, true); std::cout << "nativeJS application thunder execution url " << url << " result " << ret << std::endl; ret = context->runScript(chunk.contentsBuffer, true, url, nullptr, true); std::cout << "nativeJS application execution result " << ret << std::endl; @@ -337,6 +341,10 @@ void NativeJSRenderer::runApplicationInternal(ApplicationRequest& appRequest) { NativeJSLogger::log(INFO, "About to launch local app\n"); JavaScriptContext* context = (JavaScriptContext*)mContextMap[id].context; + std::stringstream window; + window<<"window.location = {\"href\":\"file:/" << url << "\"};"; + std::cout << "Adding the window location:" << window.str().c_str()<< " to js file" << std::endl; + context->runScript(window.str().c_str(),true, url, nullptr, true); NativeJSLogger::log(INFO, "Running test application: %s\n", url); bool ret = context->runFile(url.c_str(), nullptr, true); NativeJSLogger::log(INFO, "Test application execution result: %d\n", ret ? 1 : 0);