[M130 Migration][Chrome] Appfw integration for chrome 74/319474/13
authorSatyaveer Singh <satyaveer.s@samsung.com>
Tue, 11 Feb 2025 10:49:23 +0000 (16:19 +0530)
committerInsoon Kim <is46.kim@samsung.com>
Mon, 24 Feb 2025 23:43:36 +0000 (23:43 +0000)
This commit adds appfw along with direct launch support to
chrome browser.

References: https://review.tizen.org/gerrit/317086

Change-Id: I3b71c77bb9368ebab121c3fcb418c0c5d8f20315
Signed-off-by: Satyaveer Singh <satyaveer.s@samsung.com>
16 files changed:
base/base_paths.cc
base/base_paths_posix.cc
chrome/BUILD.gn
packaging/chromium-efl-browser.spec.in [new file with mode: 0644]
packaging/chromium-efl-engine.spec.in
packaging/chromium-efl.spec
packaging/org.tizen.chromium-efl-browser.xml.in [new file with mode: 0644]
tizen_src/chromium_impl/base/base_efl.gni
tizen_src/chromium_impl/chrome/BUILD.gn [new file with mode: 0644]
tizen_src/chromium_impl/chrome/app/chrome_exe_main_tizen.cc [new file with mode: 0644]
tizen_src/chromium_impl/chrome/app/chrome_main_tizen.cc [new file with mode: 0644]
tizen_src/chromium_impl/chrome/chrome_efl.gni [new file with mode: 0644]
tizen_src/downloadable/ewk_interface_main.cc
tizen_src/ewk/BUILD.gn
tizen_src/ewk/chromium-ewk.filter
tizen_src/ewk/efl_integration/BUILD.gn

index 297486b7ed4c256a73f3fd962978207496a91901..15019958260bcfe38445fa1623e32e39dac99dcd 100644 (file)
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 
+#if BUILDFLAG(IS_TIZEN)
+#include <appfw/app_common.h>
+#include "base/memory/free_deleter.h"
+#endif
+
 namespace base {
 
 // This provider aims at overriding the initial behaviour for all platforms. It
@@ -76,6 +81,16 @@ bool PathProvider(int key, FilePath* result) {
       return GetTempDir(result);
     case DIR_HOME:
       *result = GetHomeDir();
+#if BUILDFLAG(IS_TIZEN)
+      {
+        char* app_id = nullptr;
+        if (APP_ERROR_NONE == app_get_id(&app_id)) {
+          std::unique_ptr<char, FreeDeleter> data_path(app_get_data_path());
+          *result = base::FilePath(data_path.get());
+          free(app_id);
+        }
+      }
+#endif
       return true;
     case base::DIR_SRC_TEST_DATA_ROOT:
       // This is only used by tests and overridden by each platform.
index 8dadc5f231a0dd2cf2e8bf2174136cd2969ba08a..be93d7a2fc6804d22f9972c95847a0f38a9e147a 100644 (file)
 #include <stdlib.h>
 #endif
 
+#if BUILDFLAG(IS_TIZEN)
+#include <appfw/app.h>
+#include "base/command_line.h"
+#include "base/memory/free_deleter.h"
+#endif
+
 namespace base {
 
 bool PathProviderPosix(int key, FilePath* result) {
@@ -41,9 +47,13 @@ bool PathProviderPosix(int key, FilePath* result) {
     case FILE_MODULE: {  // TODO(evanm): is this correct?
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
       FilePath bin_dir;
+#if BUILDFLAG(IS_TIZEN)
+      bin_dir = base::CommandLine::ForCurrentProcess()->GetProgram();
+#else
       if (!ReadSymbolicLink(FilePath(kProcSelfExe), &bin_dir)) {
         NOTREACHED() << "Unable to resolve " << kProcSelfExe << ".";
       }
+#endif
       *result = bin_dir;
       return true;
 #elif BUILDFLAG(IS_FREEBSD)
@@ -91,6 +101,14 @@ bool PathProviderPosix(int key, FilePath* result) {
       std::unique_ptr<Environment> env(Environment::Create());
       FilePath cache_dir(
           nix::GetXDGDirectory(env.get(), "XDG_CACHE_HOME", ".cache"));
+#if BUILDFLAG(IS_TIZEN)
+      char* app_id = nullptr;
+      if (APP_ERROR_NONE == app_get_id(&app_id)) {
+        std::unique_ptr<char, FreeDeleter> cache_path(app_get_cache_path());
+        cache_dir = base::FilePath(cache_path.get());
+        free(app_id);
+      }
+#endif
       *result = cache_dir;
       return true;
     }
index 0ea5152ae7200880b1f7033bad084512341fba28..99b7c59279cd07665b8563a5c1b3b863575950d8 100644 (file)
@@ -58,6 +58,10 @@ if (is_android) {
   import("//third_party/icu/config.gni")
 }
 
+if (use_efl) {
+  import("//tizen_src/chromium_impl/chrome/chrome_efl.gni")
+}
+
 # b/365489014: CrOS' chrome.sections_embedded target breaks on component builds;
 # there's no clear value of supporting it there, so disable it.
 _cros_generate_embed_section_target = is_chromeos_ash && !is_component_build
@@ -1430,24 +1434,6 @@ if (is_win) {
     }
   }
 } else if (use_efl) {
-  executable("chrome_tizen") {
-    testonly = true
-    deps = [ "//tizen_src/ewk/efl_integration:chromium-ewk" ]
-    sources = [
-      "app/chrome_exe_main_aura.cc",
-      "app/chrome_exe_resource.h",
-    ]
-    ldflags = [
-      "-pie",
-      "-Wl,--export-dynamic",
-    ]
-    cflags = [ "-fPIC" ]
-    if (is_tizen) {
-      configs += [ "//tizen_src/build/config/tizen:executable_config" ]
-      ldflags += [ "-Wl,-rpath=\$ORIGIN/../lib" ]
-    }
-  }
-
   static_library("chrome_lib") {
     sources = [ "app/chrome_exe_resource.h" ]
     defines = []
@@ -1467,6 +1453,7 @@ if (is_win) {
       "app/chrome_main_linux.cc",
       "app/chrome_main_linux.h",
     ]
+    sources += external_chrome_app_efl_sources
 
     deps += [
       # On Linux, link the dependencies (libraries) that make up actual
diff --git a/packaging/chromium-efl-browser.spec.in b/packaging/chromium-efl-browser.spec.in
new file mode 100644 (file)
index 0000000..a742ede
--- /dev/null
@@ -0,0 +1,45 @@
+%package browser
+Summary: Tizen Chromium Browser Application
+Requires: %{name} = %{version}-%{release}
+%description browser
+Tizen Chromium Browser Application on Chromium EFL
+# org.tizen.chromium-efl-browser
+
+%define _browser_pkgid %{_pkgid}-browser
+%define _browser_rootdir  %{TZ_SYS_RO_APP}/%{_browser_pkgid}
+%define _browser_buildpath "%{buildroot}"%{_browser_rootdir}
+
+# This variable is being accessed in the parent spec file, so we define it globally here.
+%global __browser_install_spec \
+  install -m 0644 "%{OUTPUT_FOLDER}"/tizen-manifest-browser.xml "%{buildroot}"%{_xmldir}/%{_browser_pkgid}.xml \
+  install -d "%{_browser_buildpath}" \
+  install -d "%{_browser_buildpath}"/bin \
+  install -d "%{_browser_buildpath}"/bin/locales \
+  install -m 0644 "%{OUTPUT_FOLDER}"/product_logo_48.png      "%{_browser_buildpath}"/%{_browser_pkgid}.png \
+  install -m 0755 "%{OUTPUT_FOLDER}"/chrome_tizen             "%{_browser_buildpath}"/bin \
+  install -m 0644 "%{OUTPUT_FOLDER}"/chrome_100_percent.pak   "%{_browser_buildpath}"/bin \
+  install -m 0644 "%{OUTPUT_FOLDER}"/resources.pak            "%{_browser_buildpath}"/bin \
+  install -m 0644 "%{OUTPUT_FOLDER}"/locales/en-US.pak        "%{_browser_buildpath}"/bin/locales \
+  install -m 0644 "%{OUTPUT_FOLDER}"/snapshot_blob.bin        "%{_browser_buildpath}"/bin \
+  install -m 0644 "%{OUTPUT_FOLDER}"/icudtl.dat               "%{_browser_buildpath}"/bin \
+  %{nil}
+
+%files browser
+%manifest packaging/chromium-efl.manifest
+%{_xmldir}/%{_browser_pkgid}.xml
+%{_browser_rootdir}/%{_browser_pkgid}.png
+%{_browser_rootdir}/bin/chrome_tizen
+%{_browser_rootdir}/bin/chrome_100_percent.pak
+%{_browser_rootdir}/bin/resources.pak
+%{_browser_rootdir}/bin/locales/en-US.pak
+%{_browser_rootdir}/bin/snapshot_blob.bin
+%if "%{?__use_system_icu}" != "1"
+%{_browser_rootdir}/bin/icudtl.dat
+%endif
+
+%preun browser
+%pre browser
+
+%post browser
+echo Installation:
+echo   tpk-backend -y %{_browser_pkgid} --preload
index f27c8cb85b360798c14554c45d8b365fa998a756..19d238ff4b6d5469083548e54eb19dfd41f389a8 100644 (file)
@@ -18,13 +18,6 @@ This package contains only /usr/share/chromium-efl required for UWE
 # locale resources
 %{_engine_root_dir}/bin/locales/en-US.pak
 %{_engine_root_dir}/res/locale/en_US
-%if %{__build_chrome} == 1
-  %{_engine_root_dir}/bin/chrome_100_percent.pak
-  #[TODO] chrome_crashpad_handler/chrome_tizen executable should be moved to tizen app path
-  %{_engine_root_dir}/bin/chrome_crashpad_handler
-  %{_engine_root_dir}/bin/chrome_tizen
-  %{_engine_root_dir}/bin/resources.pak
-%endif
 %if "%{?__use_system_icu}" != "1"
   %{_engine_root_dir}/bin/icudtl.dat
 %endif
index 386af6fb553a3b536014ce79d566fd44164d3de4..d44452def871dd2572a93ae21ea2637d915e877e 100644 (file)
@@ -16,6 +16,7 @@ License: LGPL-2.1 or BSD-2-Clause
 Source0: %{name}-%{version}.tar.gz
 Source1: content_shell.in
 Source2: chromium-efl-engine.spec.in
+Source3: chromium-efl-browser.spec.in
 
 %ifarch aarch64
 %define _nodebug 1
@@ -429,10 +430,42 @@ Chromium tizen ppapi extension unit test utilities
 %define include_sub_spec() %{expand:%(cat '%{1}')}
 %{include_sub_spec %{SOURCE2}}
 
+%if 0%{?__build_chrome}
+%define include_sub_spec() %{expand:%(cat '%{1}')}
+%{include_sub_spec %{SOURCE3}}
+%endif
+
 %prep
 %setup -q
 
 %build
+# The "_repository" flag was changed to "_vd_cfg_target_repository" in tizen 4.0 product tv.
+%if "%{?tizen_profile_name}" == "tv"
+#TO DO, onemain branch haven't defined _vd_cfg_target_repository, so add this hijack code
+# to set repo_name to "MuseM" if not define _vd_cfg_target_repository, need to delete this
+# code when defined _vd_cfg_target_repository in onemain.
+%if "%{?_vd_cfg_target_repository}"
+%define repo_name %{_vd_cfg_target_repository}
+%else
+%define repo_name MuseM
+%endif
+%else
+%define repo_name %{_repository}
+%endif
+
+%if %{__build_chrome} == 1
+%define OUTPUT_BASE_FOLDER out.chrome.tz_v%{tizen_version_major}.%{tizen_version_minor}.%{repo_name}.%{ARCHITECTURE}
+%else
+%define OUTPUT_BASE_FOLDER out.tz_v%{tizen_version_major}.%{tizen_version_minor}.%{repo_name}.%{ARCHITECTURE}
+%endif
+
+export GN_GENERATOR_OUTPUT=$PWD/%{OUTPUT_BASE_FOLDER}
+
+export BUILD_ARCH=%{ARCHITECTURE}
+
+#set build mode
+%global OUTPUT_FOLDER %{OUTPUT_BASE_FOLDER}
+
 # architecture related configuration + neon temporary workaround
 %if %{?_skip_ninja:0}%{!?_skip_ninja:1}
 
@@ -472,33 +505,6 @@ Chromium tizen ppapi extension unit test utilities
   export PYTHONIOENCODING=utf-8
 %endif
 
-# The "_repository" flag was changed to "_vd_cfg_target_repository" in tizen 4.0 product tv.
-%if "%{?tizen_profile_name}" == "tv"
-#TO DO, onemain branch haven't defined _vd_cfg_target_repository, so add this hijack code
-# to set repo_name to "MuseM" if not define _vd_cfg_target_repository, need to delete this
-# code when defined _vd_cfg_target_repository in onemain.
-%if "%{?_vd_cfg_target_repository}"
-%define repo_name %{_vd_cfg_target_repository}
-%else
-%define repo_name MuseM
-%endif
-%else
-%define repo_name %{_repository}
-%endif
-
-%if %{__build_chrome} == 1
-%define OUTPUT_BASE_FOLDER out.chrome.tz_v%{tizen_version_major}.%{tizen_version_minor}.%{repo_name}.%{ARCHITECTURE}
-%else
-%define OUTPUT_BASE_FOLDER out.tz_v%{tizen_version_major}.%{tizen_version_minor}.%{repo_name}.%{ARCHITECTURE}
-%endif
-
-export GN_GENERATOR_OUTPUT=$PWD/%{OUTPUT_BASE_FOLDER}
-
-export BUILD_ARCH=%{ARCHITECTURE}
-
-#set build mode
-%global OUTPUT_FOLDER %{OUTPUT_BASE_FOLDER}
-
 if type ccache &> /dev/null; then
   source tizen_src/build/ccache_env.sh tizen
 fi
@@ -608,7 +614,7 @@ ninja %{_smp_mflags} -C "%{OUTPUT_FOLDER}" \
   chromium-efl-install \
 %endif
 %if 0%{?__build_chrome}
-  chrome_tizen \
+  chrome_exe_tizen \
 %endif
   efl_webprocess chromium-ewk efl_webview_app mini_browser ubrowser
 
@@ -668,6 +674,13 @@ sed -e 's#@TIZEN_VERSION@#%{tizen_version_major}.%{tizen_version_minor}#g' \
     > "%{OUTPUT_FOLDER}"/tizen-manifest-tpk.xml
 %endif
 
+%if 0%{?__build_chrome}
+sed -e 's#@TIZEN_VERSION@#%{tizen_version_major}.%{tizen_version_minor}#g' \
+    -e 's#@CHROMIUM_VERSION@#%{version}#g' \
+    packaging/%{_pkgid}-browser.xml.in \
+    > "%{OUTPUT_FOLDER}"/tizen-manifest-browser.xml
+%endif
+
 %if 0%{?__generate_tpk} && "%{?profile}" == "tv"
 # add build_id to tizen-manifest
 python3 %{TZ_SYS_BIN}/set_build_info.py "%{OUTPUT_FOLDER}"/tizen-manifest-tpk.xml %{COSMOS_BUILD_ID}
@@ -726,17 +739,7 @@ install -d "%{buildroot}"%{_includedir}/node
 install -m 0644 third_party/electron_node/src/*.h "%{buildroot}"%{_includedir}/node/
 %endif
 
-%if %{__build_chrome} == 1
-  install -m 0755 "%{OUTPUT_FOLDER}"/chrome_tizen "%{buildroot}"%{CHROMIUM_LIB_DIR}/bin/chrome_tizen
-  sed 's#@binary@#%{CHROMIUM_LIB_DIR}/bin/chrome_tizen#' %{SOURCE1} > "%{buildroot}"%{_bindir}/chrome_tizen
-  install -m 0755 "%{OUTPUT_FOLDER}"/chrome_crashpad_handler "%{buildroot}"%{CHROMIUM_LIB_DIR}/bin/chrome_crashpad_handler
-  sed 's#@binary@#%{CHROMIUM_LIB_DIR}/bin/chrome_crashpad_handler#' %{SOURCE1} > "%{buildroot}"%{_bindir}/chrome_crashpad_handler
-  install -m 0644 "%{OUTPUT_FOLDER}"/locales/*.pak "%{buildroot}"%{CHROMIUM_LIB_DIR}/bin/locales
-  install -m 0644 "%{OUTPUT_FOLDER}"/chrome_100_percent.pak "%{buildroot}"%{CHROMIUM_LIB_DIR}/bin/
-  install -m 0644 "%{OUTPUT_FOLDER}"/resources.pak "%{buildroot}"%{CHROMIUM_LIB_DIR}/bin/
-%else
   install -m 0644 "%{OUTPUT_FOLDER}"/locales/efl/*.pak  "%{buildroot}"%{CHROMIUM_LIB_DIR}/bin/locales/
-%endif
 
   install -m 0755 "%{OUTPUT_FOLDER}"/efl_webprocess    "%{buildroot}"%{_bindir}/
   %if "%{?profile}" == "tv"
@@ -978,6 +981,11 @@ install -m 0755 -p -D %{OUTPUT_FOLDER}/ppapi_unittests %{buildroot}/opt/usr/utc_
   find %{buildroot} -type f -name *.so | xargs strip --strip-all
 %endif
 
+%if 0%{?__build_chrome}
+  %{__browser_install_spec}
+  # tizen_src/build/build_chromium_browser_tpk.sh %{_buildroot_next_browser} %{OUTPUT_FOLDER} %{_browser_tpk_file_name} %{__browser_tpk_id} %{?profile}
+%endif
+
 %pre
 if (( $(rpm -qa | grep 'wrtjs-[[:digit:]]' | wc -l) > 1 )); then
   echo -e "\033[31m*****************************************************"
@@ -1109,14 +1117,6 @@ rm -rf %{CHROMIUM_TPK_DIR}/%{_tpk_file_name}.tpk
 %{CHROMIUM_LIB_DIR}/bin/locales/*.pak
 %{CHROMIUM_LIB_DIR}/res/locale/*
 
-%if %{__build_chrome} == 1
-  %{CHROMIUM_LIB_DIR}/bin/chrome_100_percent.pak
-  %{CHROMIUM_LIB_DIR}/bin/resources.pak
-  %{CHROMIUM_LIB_DIR}/bin/chrome_tizen
-  %{_bindir}/chrome_tizen
-  %{CHROMIUM_LIB_DIR}/bin/chrome_crashpad_handler
-  %{_bindir}/chrome_crashpad_handler
-%endif
   %{_libdir}/libchromium-ewk.so
   %{_libdir}/libewebkit2.so*
 %if 0%{?__enable_squashfs_image}
diff --git a/packaging/org.tizen.chromium-efl-browser.xml.in b/packaging/org.tizen.chromium-efl-browser.xml.in
new file mode 100644 (file)
index 0000000..bee2c79
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" api-version="@TIZEN_VERSION@" package="org.tizen.chromium-efl-browser" version="@CHROMIUM_VERSION@">
+    <ui-application appid="org.tizen.chromium-efl-browser" exec="chrome_tizen" nodisplay="false" multiple="false" type="capp" taskmanage="true">
+        <label>Chromium</label>
+        <icon>org.tizen.chromium-efl-browser.png</icon>
+        <description>Chromium Browser for Tizen</description>
+    </ui-application>
+    <privileges>
+        <privilege>http://tizen.org/privilege/alarm.get</privilege>
+        <privilege>http://tizen.org/privilege/alarm.set</privilege>
+        <privilege>http://tizen.org/privilege/apphistory.read</privilege>
+        <privilege>http://tizen.org/privilege/appmanager.kill.bgapp</privilege>
+        <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
+        <privilege>http://tizen.org/privilege/content.read</privilege>
+        <privilege>http://tizen.org/privilege/datacontrol.consumer</privilege>
+        <privilege>http://tizen.org/privilege/datasharing</privilege>
+        <privilege>http://tizen.org/privilege/externalstorage</privilege>
+        <privilege>http://tizen.org/privilege/internet</privilege>
+        <privilege>http://tizen.org/privilege/mediastorage</privilege>
+        <privilege>http://tizen.org/privilege/network.get</privilege>
+        <privilege>http://tizen.org/privilege/notification</privilege>
+        <privilege>http://tizen.org/privilege/package.info</privilege>
+        <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
+        <privilege>http://tizen.org/privilege/packagemanager.clearcache</privilege>
+        <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
+        <privilege>http://tizen.org/privilege/telephony</privilege>
+        <privilege>http://tizen.org/privilege/telephony.admin</privilege>
+    </privileges>
+    <feature name="http://tizen.org/feature/screen.size.normal.1080.1920">true</feature>
+</manifest>
index 83210b2a47350d43a3cd14da8fc7e5defde31896..850ab102d5b5ee3757126ecb767ec43a89d2ea66 100644 (file)
@@ -15,6 +15,14 @@ external_base_configs = [
   "//tizen_src/build:ecore",
   "//tizen_src/build:libecore",
 ]
+
+if (is_tizen) {
+  external_base_configs += [
+    "//tizen_src/build:capi-appfw-application",
+    "//tizen_src/build:libcapi-appfw-application",
+  ]
+}
+
 external_base_sources = [
   "//tizen_src/chromium_impl/base/message_loop/message_pump_ecore.cc",
   "//tizen_src/chromium_impl/base/message_loop/message_pump_ecore.h",
diff --git a/tizen_src/chromium_impl/chrome/BUILD.gn b/tizen_src/chromium_impl/chrome/BUILD.gn
new file mode 100644 (file)
index 0000000..98cbd97
--- /dev/null
@@ -0,0 +1,23 @@
+# Copyright (c) 2025 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.
+
+import("//tizen_src/build/config/tizen_features.gni")
+
+executable("chrome_exe_tizen") {
+  output_name = "chrome_tizen"
+  deps = [ "//tizen_src/ewk/efl_integration:libchromium-ewk" ]
+  if (is_tizen) {
+    sources = [ "app/chrome_exe_main_tizen.cc" ]
+  } else if (is_linux) {
+    sources = [ "//chrome/app/chrome_exe_main_aura.cc" ]
+  }
+  ldflags = [
+    "-pie",
+    "-Wl,--export-dynamic",
+  ]
+  cflags = [ "-fPIC" ]
+  if (is_tizen) {
+    configs += [ "//tizen_src/build/config/tizen:executable_config" ]
+  }
+}
diff --git a/tizen_src/chromium_impl/chrome/app/chrome_exe_main_tizen.cc b/tizen_src/chromium_impl/chrome/app/chrome_exe_main_tizen.cc
new file mode 100644 (file)
index 0000000..4f97905
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2025 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.
+
+#include "build/build_config.h"
+
+extern "C" {
+int ChromeMainTizen(int argc, const char** argv);
+}
+
+__attribute__((visibility("default"))) int main(int argc, const char** argv) {
+  return ChromeMainTizen(argc, argv);
+}
diff --git a/tizen_src/chromium_impl/chrome/app/chrome_main_tizen.cc b/tizen_src/chromium_impl/chrome/app/chrome_main_tizen.cc
new file mode 100644 (file)
index 0000000..d274e09
--- /dev/null
@@ -0,0 +1,150 @@
+// Copyright 2025 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.
+
+#include <appfw/app.h>
+
+#include <string>
+#include <vector>
+
+#include "base/logging.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_view_aura.h"
+
+extern "C" {
+int ChromeMain(int argc, const char** argv);
+
+__attribute__((visibility("default"))) int NO_STACK_PROTECTOR
+ChromeMainTizen(int argc, const char** argv);
+}
+
+namespace {
+
+content::WebContents* GetBrowserWebContent() {
+  Browser* browser = BrowserList::GetInstance()->GetLastActive();
+  if (browser == nullptr) {
+    LOG(INFO) << "Browser is null";
+    return nullptr;
+  }
+  TabStripModel* tab_strip_model = browser->tab_strip_model();
+  if (!tab_strip_model) {
+    LOG(INFO) << " Tab strip model is null";
+    return nullptr;
+  }
+  return tab_strip_model->GetActiveWebContents();
+}
+
+bool BrowserCreate(void* user_data) {
+  LOG(INFO) << "BrowserCreate";
+  const char** argv = static_cast<const char**>(user_data);
+  const char* chrome_arguments[] = {
+      argv[0],
+      "--no-sandbox",
+      "--ignore-gpu-blocklist",
+      "--ozone-platform=efl",
+      "--in-process-gpu",
+      "--window-size=1920,1080",
+      "--window-position=0,0",
+      "--enable-logging=stderr",
+  };
+  const int chromium_argc = sizeof(chrome_arguments) / sizeof(const char*);
+  return ChromeMain(chromium_argc, chrome_arguments);
+}
+
+void BrowserPause(void* user_data) {
+  LOG(INFO) << "BrowserPause call";
+  content::WebContents* web_contents = GetBrowserWebContent();
+  if (!web_contents) {
+    LOG(INFO) << " Active Web contents is null";
+    return;
+  }
+  content::RenderViewHost* rvh = web_contents->GetRenderViewHost();
+  content::RenderFrameHost* rfh = web_contents->GetPrimaryMainFrame();
+  if (!rvh) {
+    LOG(INFO) << " Render view host is null";
+    return;
+  }
+  if (!rfh) {
+    LOG(INFO) << " Render frame host is null";
+    return;
+  }
+  if (rvh->IsRenderViewLive()) {
+    LOG(INFO) << " pause webview";
+    content::RenderWidgetHostImpl* rwhi =
+        static_cast<content::RenderWidgetHostImpl*>(rvh->GetWidget());
+    rwhi->PauseScheduledTasks();
+  }
+  LOG(INFO) << " hide webview";
+  web_contents->WasHidden();
+}
+
+void BrowserResume(void* user_data) {
+  LOG(INFO) << "BrowserResume call";
+  content::WebContents* web_contents = GetBrowserWebContent();
+  if (!web_contents) {
+    LOG(INFO) << " Active Web contents is null";
+    return;
+  }
+  content::RenderViewHost* rvh = web_contents->GetRenderViewHost();
+  content::RenderFrameHost* rfh = web_contents->GetPrimaryMainFrame();
+  if (!rvh) {
+    LOG(INFO) << " Render view host is null";
+    return;
+  }
+  if (!rfh) {
+    LOG(INFO) << " Render frame host is null";
+    return;
+  }
+  content::RenderWidgetHostViewAura* rwhva =
+      static_cast<content::RenderWidgetHostViewAura*>(
+          web_contents->GetRenderWidgetHostView());
+  if (rvh->IsRenderViewLive() && rwhva) {
+    LOG(INFO) << " resume webview";
+    rwhva->host()->UnPauseScheduledTasks();
+  }
+  LOG(INFO) << " show webview";
+  web_contents->WasShown();
+}
+
+void BrowserTerminate(void* user_data) {
+  LOG(INFO) << "BrowserTerminate call";
+}
+
+void BrowserControl(app_control_h app_control, void* user_data) {
+  LOG(INFO) << "BrowserControl call";
+}
+
+bool IsSubprocess(const int argc, const char** argv) {
+  bool is_subprocess = false;
+  for (int i = 0; i < argc; i++) {
+    std::string arg(argv[i]);
+    is_subprocess = arg.find("--type") != std::string::npos;
+    if (is_subprocess) {
+      return is_subprocess;
+    }
+  }
+  return is_subprocess;
+}
+
+int ChromeBrowserMainTizen(const int argc, const char** argv) {
+  ui_app_lifecycle_callback_s event_callback;
+  memset(&event_callback, 0x00, sizeof(ui_app_lifecycle_callback_s));
+  event_callback.create = BrowserCreate;
+  event_callback.terminate = BrowserTerminate;
+  event_callback.pause = BrowserPause;
+  event_callback.resume = BrowserResume;
+  event_callback.app_control = BrowserControl;
+  return ui_app_main(argc, (char**)argv, &event_callback, argv);
+}
+}  // namespace
+
+int ChromeMainTizen(int argc, const char** argv) {
+  LOG(INFO) << "InitChromeTizenApp";
+  if (IsSubprocess(argc, argv)) {
+    return ChromeMain(argc, argv);
+  }
+  return ChromeBrowserMainTizen(argc, argv);
+}
diff --git a/tizen_src/chromium_impl/chrome/chrome_efl.gni b/tizen_src/chromium_impl/chrome/chrome_efl.gni
new file mode 100644 (file)
index 0000000..374cd64
--- /dev/null
@@ -0,0 +1,11 @@
+# Copyright (c) 2025 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.
+
+import("//tizen_src/build/config/tizen_features.gni")
+
+external_chrome_app_efl_sources = []
+if (is_tizen) {
+  external_chrome_app_efl_sources +=
+      [ "//tizen_src/chromium_impl/chrome/app/chrome_main_tizen.cc" ]
+}
index 9ab03c5d4f1611e2d461ceb06814bbc06e31211e..25f80637e461cb77f19c6129c9a653ab1fc1f520 100644 (file)
@@ -583,17 +583,27 @@ int WRTServiceMain(int argc, char** argv) {
 }
 #endif
 
-#if defined(BUILD_CHROME)
 __attribute__((visibility("default"))) int ChromeMain(int argc,
                                                       const char** argv) {
-  LOG(INFO) << "EWK-INTERFACE : ChromeMain called..";
   typedef int (*func_ptr_t)(int argc, const char** argv);
   func_ptr_t fp = reinterpret_cast<func_ptr_t>(ewk_dlsym("ChromeMain"));
-  if (fp)
+  if (fp) {
+    return fp(argc, argv);
+  }
+  LOG(ERROR) << "EWK-INTERFACE : ChromeMain not found.";
+  return 0;
+}
+
+__attribute__((visibility("default"))) int ChromeMainTizen(int argc,
+                                                           const char** argv) {
+  typedef int (*func_ptr_t)(int argc, const char** argv);
+  func_ptr_t fp = reinterpret_cast<func_ptr_t>(ewk_dlsym("ChromeMainTizen"));
+  if (fp) {
     return fp(argc, argv);
+  }
+  LOG(ERROR) << "EWK-INTERFACE : ChromeMainTizen not found.";
   return 0;
 }
-#endif  // defined(BUILD_CHROME)
 
 #ifdef __cplusplus
 }
index ae1e1141ff1871f9b4041002170c6c282c5f1b17..a266737b093182ec9782d96dfe028507cff33dd1 100644 (file)
@@ -12,4 +12,7 @@ group("chromium_efl_all") {
   if (is_tizen) {
     deps += [ "//tizen_src/downloadable:chromium-efl-install" ]
   }
+  if (build_chrome) {
+    deps += [ "//tizen_src/chromium_impl/chrome:chrome_exe_tizen" ]
+  }
 }
index 52f4727521ba2f84f051578c01d790bdd9f3c7d5..987ab5b98ebb6d322696f6364fad1d18773403da 100644 (file)
@@ -44,6 +44,7 @@
     node_module_register;
     # CHROMIUM BROWSER
     ChromeMain;
+    ChromeMainTizen;
 
   local: *;
 };
index ba5dbf3561d7fe93ec1546400071ee35c6322c08..b0ac41ada902be16a7bdfefaa58dfebe348c0313 100644 (file)
@@ -191,11 +191,12 @@ shared_library("chromium-ewk") {
                                "trim string",
                                [])
   defines = [ "CHROMIUM_VERSION=\"" + chrome_version + "\"" ]
+  version_script = "//tizen_src/ewk/chromium-ewk.filter"
+  inputs = [ version_script ]
   ldflags = [
     "-Wl,--as-needed",
     "-Wl,--no-undefined",
-    "-Wl,--version-script=" +
-        rebase_path("//tizen_src/ewk/chromium-ewk.filter"),
+    "-Wl,--version-script=" + rebase_path(version_script),
   ]
   cflags = [
     # Symbol visibility controled by chromium-ewk.filter