[NEXTBROWSER] Passing arguments like request URI support added 14/317914/4 submit/tizen/20240920.160016
authorNehal Kumar <nehal.kumar@samsung.com>
Fri, 20 Sep 2024 10:21:01 +0000 (15:51 +0530)
committerBot Blink <blinkbot@samsung.com>
Fri, 20 Sep 2024 11:43:59 +0000 (11:43 +0000)
Also added support for additional chromium arguments
example - launch_app org.tizen.next-browser __APP_SVC_URI__ nfl.com ChromiumArguments "--remote-debugging-port=7011 --no-sandbox"

Change-Id: I11dd2fbac26c634fc838b67830c3cae96985f84d
Signed-off-by: Nehal Kumar <nehal.kumar@samsung.com>
tizen_src/downloadable/BUILD.gn
tizen_src/downloadable/browser_app_control.cc [new file with mode: 0644]
tizen_src/downloadable/browser_app_control.h [new file with mode: 0644]
tizen_src/downloadable/browser_app_interface.cc [new file with mode: 0644]
tizen_src/downloadable/browser_app_interface.h [new file with mode: 0644]
tizen_src/downloadable/ewk_interface_main.cc
tizen_src/downloadable/ewk_interface_main.h

index c69fb6b0e3be5823c8a2c3321f89e4ebac40783d..67e046dcc3a0d59ab7ba3f308d4eb9f65da685ce 100644 (file)
@@ -30,6 +30,12 @@ if (enable_ewk_interface) {
       "$root_gen_dir/ewk_api_wrapper_generated.cc",
       "ewk_interface_main.cc",
     ]
+    if (is_samsung_next_browser) {
+      sources += [
+        "browser_app_interface.cc",
+        "browser_app_control.cc",
+      ]
+    }
     libs = [
       "dlog",
       "dl",
diff --git a/tizen_src/downloadable/browser_app_control.cc b/tizen_src/downloadable/browser_app_control.cc
new file mode 100644 (file)
index 0000000..c254e31
--- /dev/null
@@ -0,0 +1,70 @@
+#include "browser_app_control.h"
+
+#include <vconf.h>
+
+#include "dlog_util.h"
+
+namespace samsung_next_browser {
+
+#define csfsAppId "com.samsung.tv.csfs"
+#define litewebappserviceAppId "org.tizen.litewebappservice"
+
+AppControl::AppControl(app_control_h handle) : m_app_control_handle(handle) {}
+
+std::string AppControl::getUri() {
+  char* arg = nullptr;
+  std::string uri;
+  if (app_control_get_uri(m_app_control_handle, &arg) ==
+      APP_CONTROL_ERROR_NONE) {
+    if (arg) {
+      LOG(INFO) << "Requested URI: " << arg;
+      uri = arg;
+      free(arg);
+      arg = nullptr;
+    }
+  }
+  uriFromFirstScreenCaller(uri);
+  return uri;
+}
+void AppControl::uriFromFirstScreenCaller(std::string& uri) {
+  std::string caller = getCaller();
+  std::string firstScreenPkgName = vconf_get_str("db/first_screen/type");
+
+  if (!firstScreenPkgName.compare(csfsAppId) &&
+      !caller.compare(litewebappserviceAppId)) {
+    if (!uri.empty() && uri.at(0) == '{' &&
+        uri.find("{\"values\":") != std::string::npos) {
+      uri = uri.substr(11, uri.length() - 13);
+    }
+  }
+}
+std::string AppControl::getExtraData(const std::string& key) {
+  char* arg = nullptr;
+  std::string data;
+  if (app_control_get_extra_data(m_app_control_handle, key.c_str(), &arg) ==
+      APP_CONTROL_ERROR_NONE) {
+    if (arg) {
+      LOG(INFO) << "Extradata key: " << key << " Value: " << arg;
+      data = arg;
+      free(arg);
+      arg = nullptr;
+    }
+  }
+  return data;
+}
+
+std::string AppControl::getCaller() {
+  char* arg = nullptr;
+  std::string caller;
+  if (app_control_get_caller(m_app_control_handle, &arg) ==
+      APP_CONTROL_ERROR_NONE) {
+    if (arg) {
+      caller = arg;
+      free(arg);
+      arg = nullptr;
+    }
+  }
+  return caller;
+}
+
+}  // namespace samsung_next_browser
\ No newline at end of file
diff --git a/tizen_src/downloadable/browser_app_control.h b/tizen_src/downloadable/browser_app_control.h
new file mode 100644 (file)
index 0000000..c91aa84
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2019 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef __BROWSER_APP_CONTROL__
+#define __BROWSER_APP_CONTROL__
+
+#include <appfw/app.h>
+#include <string>
+namespace samsung_next_browser {
+class AppControl {
+ public:
+  explicit AppControl(app_control_h handle);
+  std::string getUri();
+  void uriFromFirstScreenCaller(std::string& uri);
+  std::string getExtraData(const std::string& key);
+  std::string getCaller();
+
+ private:
+  app_control_h m_app_control_handle;
+};
+}  // namespace samsung_next_browser
+#endif  //__BROWSER_APP_CONTROL__
diff --git a/tizen_src/downloadable/browser_app_interface.cc b/tizen_src/downloadable/browser_app_interface.cc
new file mode 100644 (file)
index 0000000..1945d8e
--- /dev/null
@@ -0,0 +1,144 @@
+#include "browser_app_interface.h"
+
+#include <appfw/app.h>
+#include <cstring>
+#include <string>
+#include <vector>
+
+#include "browser_app_control.h"
+#include "dlog_util.h"
+#include "ewk_interface_main.h"
+
+namespace samsung_next_browser {
+
+struct serviceChecker {
+  std::string requestURI;
+  std::string chromiumArguments;
+
+  explicit serviceChecker(app_control_h service)
+      : requestURI(""), chromiumArguments("") {
+    AppControl app_control(service);
+    std::string data;
+
+    data = app_control.getUri();
+    if (!data.empty()) {
+      requestURI = std::move(data);
+      LOG(INFO) << requestURI;
+    }
+
+    data = app_control.getExtraData("ChromiumArguments");
+    if (!data.empty()) {
+      chromiumArguments = std::move(data);
+      LOG(INFO) << chromiumArguments;
+    }
+  }
+};
+void parseChromiumArguments(const std::string& args,
+                            std::vector<std::string>& chromiumArgumentsList) {
+  std::istringstream iss(args);
+  std::string token;
+  while (iss >> token) {
+    chromiumArgumentsList.push_back(token);
+  }
+}
+
+static bool browser_create(void* user_data) {
+  LOG(INFO) << "browser_create";
+  return 1;
+}
+static void browser_control(app_control_h app_control, void* user_data) {
+  LOG(INFO) << "browser_control call";
+  int numberOfFixedArguments = 8;
+  int totalBrowserArguments = numberOfFixedArguments;
+  std::vector<std::string> chromiumArgumentsList;
+  const char* arg1 = "/opt/usr/apps/org.tizen.next-browser/bin/next_browser";
+  const char* arg2 = "--ignore-gpu-blocklist";
+  const char* arg3 = "--ozone-platform=efl";
+  const char* arg4 = "--in-process-gpu";
+  const char* arg5 = "--window-size=1920,1080";
+  const char* arg6 = "--enable-logging=stderr";
+  const char* arg7 = "--no-sandbox";
+  const char* arg8 =
+      "--user-data-dir=/opt/usr/home/owner/apps_rw/org.tizen.next-browser/data";
+  serviceChecker checker(app_control);
+  if (!checker.chromiumArguments.empty()) {
+    parseChromiumArguments(checker.chromiumArguments, chromiumArgumentsList);
+    totalBrowserArguments += chromiumArgumentsList.size();
+  }
+
+  if (!checker.requestURI.empty()) {
+    chromiumArgumentsList.push_back(checker.requestURI);
+    totalBrowserArguments++;
+  }
+
+  const char** argv =
+      (const char**)malloc(totalBrowserArguments * sizeof(const char*));
+  argv[0] = arg1;
+  argv[1] = arg2;
+  argv[2] = arg3;
+  argv[3] = arg4;
+  argv[4] = arg5;
+  argv[5] = arg6;
+  argv[6] = arg7;
+  argv[7] = arg8;
+  int itr = numberOfFixedArguments;
+  for (const auto& chromiumArguments : chromiumArgumentsList) {
+    argv[itr++] = chromiumArguments.c_str();
+  }
+  LOG(INFO) << totalBrowserArguments;
+  for (int i = 0; i < totalBrowserArguments; i++) {
+    LOG(INFO) << argv[i];
+  }
+  typedef int (*func_ptr_t)(int totalBrowserArguments, const char** argv);
+  func_ptr_t fp = reinterpret_cast<func_ptr_t>(ewk_dlsym("ChromeMain"));
+  if (fp) {
+    int chromeMain = fp(totalBrowserArguments, argv);
+    LOG(INFO) << chromeMain;
+  }
+  free(argv);
+}
+
+static void browser_pause(void* user_data) {
+  LOG(INFO) << "browser_pause call";
+}
+
+static void browser_resume(void* user_data) {
+  LOG(INFO) << "browser_resume call";
+}
+
+static void browser_terminate(void* user_data) {
+  LOG(INFO) << "browser_terminate call";
+}
+int BrowserMain(int argc, const char** argv) {
+  LOG(INFO) << "BROWSER-APP-INTERFACE : BrowserMain called..";
+  for (int i = 0; i < argc; i++)
+    LOG(INFO) << argv[i];
+  bool isSubprocess = false;
+  for (int i = 0; i < argc; i++) {
+    std::string arg(argv[i]);
+    isSubprocess = arg.find("--type") != std::string::npos;
+    if (isSubprocess)
+      break;
+  }
+  if (isSubprocess) {
+    LOG(INFO) << "Subprocess";
+    typedef int (*func_ptr_t)(int argc, const char** argv);
+    func_ptr_t fp = reinterpret_cast<func_ptr_t>(ewk_dlsym("ChromeMain"));
+    if (fp)
+      return fp(argc, argv);
+    return 0;
+  } else {
+    LOG(INFO) << "Main process";
+    ui_app_lifecycle_callback_s event_callback;
+    memset(&event_callback, 0x00, sizeof(ui_app_lifecycle_callback_s));
+    event_callback.create = browser_create;
+    event_callback.terminate = browser_terminate;
+    event_callback.pause = browser_pause;
+    event_callback.resume = browser_resume;
+    event_callback.app_control = browser_control;
+    int browser_init = ui_app_main(argc, (char**)argv, &event_callback, NULL);
+    return browser_init;
+  }
+}
+
+}  // namespace samsung_next_browser
\ No newline at end of file
diff --git a/tizen_src/downloadable/browser_app_interface.h b/tizen_src/downloadable/browser_app_interface.h
new file mode 100644 (file)
index 0000000..a350dcb
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2019 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef __BROWSER_APP_INTERFACE__
+#define __BROWSER_APP_INTERFACE__
+namespace samsung_next_browser {
+int BrowserMain(int argc, const char** argv);
+}
+#endif  //__BROWSER_APP_INTERFACE__
index f1623d57bee0683c5f44a0d178c835f1fae153e8..009de409df18a91564532ffba98242ff4f48dc8b 100644 (file)
@@ -29,8 +29,7 @@
 #include <lwipc.h>
 #include <ttrace.h>
 #if defined(SAMSUNG_NEXT_BROWSER)
-#include <appfw/app.h>
-#include <string>
+#include "browser_app_interface.h"
 #endif
 #include <sys/resource.h>
 #endif  // BUILDFLAG(IS_TIZEN_TV)
@@ -618,77 +617,11 @@ int WRTServiceMain(int argc, char** argv) {
 
 #if defined(BUILD_CHROME)
 #if defined(SAMSUNG_NEXT_BROWSER)
-static bool app_create(void* user_data) {
-  LOG(INFO) << "app_create";
-  const char* argv[] = {
-      "/opt/usr/apps/org.tizen.next-browser/bin/next_browser",
-      "--ignore-gpu-blocklist",
-      "--ozone-platform=efl",
-      "--in-process-gpu",
-      "--window-size=1920,1080",
-      "--enable-logging=stderr",
-      "--no-sandbox",
-      "--user-data-dir=/opt/usr/home/owner/apps_rw/org.tizen.next-browser/data",
-      nullptr};
-  int argc = sizeof(argv) / sizeof(const char*) - 1;
-  LOG(INFO) << argc;
-
-  typedef int (*func_ptr_t)(int argc, const char** argv);
-  func_ptr_t fp = reinterpret_cast<func_ptr_t>(ewk_dlsym("ChromeMain"));
-  if (fp)
-    return fp(argc, argv);
-  return 0;
-}
-static void app_control(app_control_h app_control, void* user_data) {
-  LOG(INFO) << "app_control call";
-}
-
-static void app_pause(void* user_data) {
-  LOG(INFO) << "app_pause call";
-}
-
-static void app_resume(void* user_data) {
-  LOG(INFO) << "app_resume call";
-}
-
-static void app_terminate(void* user_data) {
-  LOG(INFO) << "app_terminate call";
-}
 __attribute__((visibility("default"))) int ChromeMain(int argc,
                                                       const char** argv) {
   LOG(INFO) << "EWK-INTERFACE : ChromeMain called..";
-  for (int i = 0; i < argc; i++)
-    LOG(INFO) << argv[i];
-  bool isSubprocess = false;
-  for (int i = 0; i < argc; i++) {
-    std::string arg(argv[i]);
-    isSubprocess = arg.find("--type") != std::string::npos;
-    if (isSubprocess)
-      break;
-  }
-
-  if (isSubprocess) {
-    LOG(INFO) << "Subprocess";
-    typedef int (*func_ptr_t)(int argc, const char** argv);
-    ewk_set_version_policy(1);  // To support UWE
-    func_ptr_t fp = reinterpret_cast<func_ptr_t>(ewk_dlsym("ChromeMain"));
-    if (fp)
-      return fp(argc, argv);
-    return 0;
-  } else {
-    LOG(INFO) << "Main process";
-    ewk_set_version_policy(1);  // To support UWE
-    ui_app_lifecycle_callback_s event_callback;
-    memset(&event_callback, 0x00, sizeof(ui_app_lifecycle_callback_s));
-    event_callback.create = app_create;
-    event_callback.terminate = app_terminate;
-    event_callback.pause = app_pause;
-    event_callback.resume = app_resume;
-    event_callback.app_control = app_control;
-
-    int app_init = ui_app_main(argc, (char**)argv, &event_callback, NULL);
-    return app_init;
-  }
+  ewk_set_version_policy(1);  // To support UWE
+  return samsung_next_browser::BrowserMain(argc, argv);
 }
 #else
 __attribute__((visibility("default"))) int ChromeMain(int argc,
index 902d4b643cc4dadd56233570bb1f249e66473215..dc4136e9b39de68253b4716628156f78713aa921 100644 (file)
@@ -9,7 +9,8 @@ namespace ewk_interface {
 
 extern void* g_impl_lib_handle;
 extern void* open_library();
-
 }  // namespace ewk_interface
-
+#if defined(SAMSUNG_NEXT_BROWSER)
+void* ewk_dlsym(const char* function_name);
+#endif
 #endif  //__EWK_INTERFACE_MAIN__