"$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",
--- /dev/null
+#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
--- /dev/null
+// 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__
--- /dev/null
+#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
--- /dev/null
+// 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__
#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)
#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,
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__