From 475a0fa2d8341b1aad49dbbb0060912e763c404e Mon Sep 17 00:00:00 2001 From: SangYong Park Date: Mon, 9 Apr 2018 19:57:11 +0900 Subject: [PATCH 01/16] Initial service app implementation . add wrt-service executable . change PWRT mate type to EventEmitter (TrackableObject cannot be instantiated without chromium.) Change-Id: I2464fc12da1dcb7b85e70fcda950dd894222653f Signed-off-by: SangYong Park --- atom/app/ui_runtime.cc | 8 +- atom/browser/api/atom_api_pwrt.cc | 117 --------------- atom/browser/api/atom_api_pwrt.h | 38 ----- atom/browser/browser.cc | 40 ++--- atom/browser/browser.h | 21 +-- atom/common/node_bindings.cc | 4 +- lib/browser/api/module-list.js | 3 +- lib/browser/api/pwrt.js | 3 - lib/browser/init.js | 15 -- packaging/dbus.service | 5 + packaging/electron-efl.spec | 29 ++-- packaging/systemd.service | 10 ++ tizen/common.gypi | 7 +- tizen/common/application_data.cc | 70 +++++---- tizen/common/application_data.h | 23 +-- tizen/common/logger.h | 2 +- tizen/extensions/common/xwalk_extension_server.cc | 1 - tizen/extensions/extensions.gyp | 2 +- tizen/loader/wrt_loader.cc | 2 +- tizen/renderer/injected_bundle.cc | 9 +- tizen/src/app/service_main.cc | 95 ++++++++++++ tizen/src/browser/api/wrt_api_core.cc | 122 ++++++++++++++++ tizen/src/browser/api/wrt_api_core.h | 42 ++++++ tizen/src/browser/wrt_ipc.cc | 170 ++++++++++++++++++++++ tizen/src/browser/wrt_ipc.h | 48 ++++++ tizen/src/browser/wrt_service.cc | 75 ++++++++++ tizen/src/browser/wrt_service.h | 47 ++++++ tizen/src/wrt_main.cc | 136 ++--------------- vendor/node/src/node.cc | 7 + wrt.gyp | 33 ++++- wrt/browser/wrt.js | 21 +++ wrt/service/main.js | 15 ++ wrt/src/main.js | 3 +- wrt/src/runtime.js | 9 +- wrt/src/web_window.js | 8 +- 35 files changed, 805 insertions(+), 435 deletions(-) delete mode 100644 atom/browser/api/atom_api_pwrt.cc delete mode 100644 atom/browser/api/atom_api_pwrt.h delete mode 100644 lib/browser/api/pwrt.js create mode 100644 packaging/dbus.service create mode 100644 packaging/systemd.service create mode 100644 tizen/src/app/service_main.cc create mode 100644 tizen/src/browser/api/wrt_api_core.cc create mode 100644 tizen/src/browser/api/wrt_api_core.h create mode 100644 tizen/src/browser/wrt_ipc.cc create mode 100644 tizen/src/browser/wrt_ipc.h create mode 100644 tizen/src/browser/wrt_service.cc create mode 100644 tizen/src/browser/wrt_service.h create mode 100644 wrt/browser/wrt.js create mode 100644 wrt/service/main.js diff --git a/atom/app/ui_runtime.cc b/atom/app/ui_runtime.cc index 27f7e0e..9bde160 100644 --- a/atom/app/ui_runtime.cc +++ b/atom/app/ui_runtime.cc @@ -55,12 +55,7 @@ void UiRuntime::SetParam(content::ContentMainParams *params) { } bool UiRuntime::OnCreate() { - common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); - std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/electron"); - - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* appdata = appdata_manager->GetApplicationData(appid); - + auto appdata = common::ApplicationDataManager::GetCurrentAppData(); if(appdata->splash_screen_info()){ atom::Browser* browser_model = atom::Browser::Get(); browser_model->SetSplashScreen(); @@ -71,7 +66,6 @@ bool UiRuntime::OnCreate() { void UiRuntime::OnTerminate() { LOG(ERROR) << "OnTerminate()"; - atom::Browser *browser_model = atom::Browser::Get(); } void UiRuntime::OnPause() { diff --git a/atom/browser/api/atom_api_pwrt.cc b/atom/browser/api/atom_api_pwrt.cc deleted file mode 100644 index d23679c..0000000 --- a/atom/browser/api/atom_api_pwrt.cc +++ /dev/null @@ -1,117 +0,0 @@ -#include "atom/browser/api/atom_api_pwrt.h" - -#include "atom/browser/browser.h" -#include "native_mate/dictionary.h" -#include "base/logging.h" - -#include "atom/common/node_includes.h" -#include "tizen/common/application_data.h" -#include "tizen/common/command_line.h" -#include - -namespace atom { - -namespace api { - -PWRT::PWRT(v8::Isolate* isolate) { - LOG(ERROR) << "PWRT::PWRT"; - Init(isolate); -} - -PWRT::~PWRT() { - LOG(ERROR) << "PWRT::~PWRT"; -} - -std::string PWRT::GetMessage() { - LOG(ERROR) << "PWRT::GetMessage"; - return "message from C++"; -} - -std::string PWRT::GetPath() { - LOG(ERROR) << "PWRT::GetPath"; - common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); - if (runtime_cmd) { - std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/electron"); - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* app_data = appdata_manager->GetApplicationData(appid); - // TODO: Use resource-manager's GetStartResource() for localized urls - // atom::Browser *browser_model = atom::Browser::Get(); - // std::unique_ptr res = browser_model->resource_manager_->GetStartResource(appcontrol.get()); - if (app_data) { - std::string app_path = "file://" + app_data->application_path(); - if (app_data->content_info()) - app_path += app_data->content_info()->src(); - else - app_path += "index.html"; - return app_path; - } - } - return ""; -} - -bool PWRT::isTizenWebApp() { - LOG(ERROR) << "PWRT::isTizenWebApp"; - common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); - std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/electron"); - if (appid != "electron") { // TODO: Any better distinguishing feature? - return true; - } else { - return false; - } -} - -bool PWRT::isElectronLaunch() { - return Browser::Get()->is_electron_launch(); -} - -void PWRT::HideSplashScreen(int reason) { - LOG(ERROR) << "PWRT::HideSplashScreen"; - atom::Browser *browser_model = atom::Browser::Get(); - browser_model->HideSplashScreen(reason); -} - -void PWRT::Log(const std::string& message) { - std::string output = "[JS LOG] " + message; - dlog_print(DLOG_ERROR, "WRT", output.c_str()); -} - -// static -mate::Handle PWRT::Create(v8::Isolate* isolate) { - LOG(ERROR) << "PWRT::Create"; - return mate::CreateHandle(isolate, new PWRT(isolate)); -} - -// static -void PWRT::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - LOG(ERROR) << "PWRT::BuildPrototype"; - prototype->SetClassName(mate::StringToV8(isolate, "PWRT")); - // TODO: Needs adding necessary interface methods - mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) - .SetMethod("getMessage", &PWRT::GetMessage) - .SetMethod("getPath", &PWRT::GetPath) - .SetMethod("isTizenWebApp", &PWRT::isTizenWebApp) - .SetMethod("isElectronLaunch", &PWRT::isElectronLaunch) - .SetMethod("hideSplashScreen", &PWRT::HideSplashScreen) - .SetMethod("log", &PWRT::Log); -} - -} // namespace api - -} // namespace atom - - -namespace { - -void Initialize(v8::Local exports, v8::Local unused, - v8::Local context, void* priv) { - LOG(ERROR) << "PWRT::Initialize"; - v8::Isolate* isolate = context->GetIsolate(); - mate::Dictionary dict(isolate, exports); - // TODO: Expose this attribute only for Tizen web apps - dict.Set("pwrt", atom::api::PWRT::Create(isolate)); -} - -} // namespace - -NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_browser_pwrt, Initialize) diff --git a/atom/browser/api/atom_api_pwrt.h b/atom/browser/api/atom_api_pwrt.h deleted file mode 100644 index ab25f34..0000000 --- a/atom/browser/api/atom_api_pwrt.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef ATOM_BROWSER_API_ATOM_API_PWRT_H_ -#define ATOM_BROWSER_API_ATOM_API_PWRT_H_ - -#include "atom/browser/api/trackable_object.h" -#include "base/compiler_specific.h" -#include "native_mate/handle.h" - -namespace atom { - -namespace api { - -class PWRT : public mate::TrackableObject { - public: - static mate::Handle Create(v8::Isolate* isolate); - - static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); - - std::string GetMessage(); - std::string GetPath(); - bool isTizenWebApp(); - bool isElectronLaunch(); - void HideSplashScreen(int reason); - void Log(const std::string& message); - - protected: - explicit PWRT(v8::Isolate* isolate); - ~PWRT() override; - - private: - DISALLOW_COPY_AND_ASSIGN(PWRT); -}; - -} // namespace api - -} // namespace atom - -#endif // ATOM_BROWSER_API_ATOM_API_PWRT_H_ diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index b26b0e6..1110602 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -30,13 +30,13 @@ namespace atom { Browser::Browser() : is_quiting_(false), #if defined(OS_TIZEN) + locale_manager_(new common::LocaleManager()), + launched_(false), is_electron_launch_(false), #endif is_exiting_(false), is_ready_(false), - is_shutdown_(false), - launched_(false), - locale_manager_(new common::LocaleManager()) { + is_shutdown_(false) { WindowList::AddObserver(this); } @@ -127,10 +127,7 @@ void Browser::Shutdown() { #if defined(OS_TIZEN) void Browser::SetElectronAppLaunch() { if (!is_electron_launch_) { - common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); - std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/electron"); - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* app_data = appdata_manager->GetApplicationData(appid); + auto app_data = common::ApplicationDataManager::GetCurrentAppData(); if (app_data->content_info() && !strcmp(app_data->content_info()->src().c_str(), "package.json")) { is_electron_launch_ = true; } @@ -274,16 +271,8 @@ void Browser::Show() { } void Browser::Initialize() { - common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); - std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/electron"); - //TODO: update the appid from binary name to electron - if (appid != "electron") { - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* appdata = appdata_manager->GetApplicationData(appid); - - resource_manager_.reset( - new common::ResourceManager(appdata, locale_manager_.get())); - } + auto appdata = common::ApplicationDataManager::GetCurrentAppData(); + resource_manager_.reset(new common::ResourceManager(appdata, locale_manager_.get())); } void Browser::AppControl(std::unique_ptr appcontrol) { @@ -324,14 +313,10 @@ void Browser::Launch(std::unique_ptr appcontrol) { launched_ = true; //To do:Implementation of relaunching of app } + #if defined(OS_TIZEN) void Browser::SetSplashScreen() { - common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); - std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/electron"); - - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* appdata = appdata_manager->GetApplicationData(appid); - + auto appdata = common::ApplicationDataManager::GetCurrentAppData(); Evas_Object* window_ = elm_win_util_standard_add("", ""); splash_screen_.reset( @@ -340,13 +325,8 @@ void Browser::SetSplashScreen() { } void Browser::HideSplashScreen(int reason) { - common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); - std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/electron"); - - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* appdata = appdata_manager->GetApplicationData(appid); - - if(appdata->splash_screen_info() == NULL) { + auto appdata = common::ApplicationDataManager::GetCurrentAppData(); + if (!appdata->splash_screen_info()) { return; } diff --git a/atom/browser/browser.h b/atom/browser/browser.h index c089fff..0e759e6 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -50,13 +50,6 @@ class Browser : public WindowListObserver { static Browser* Get(); - std::unique_ptr resource_manager_; - std::unique_ptr locale_manager_; -#if defined(OS_TIZEN) - std::unique_ptr splash_screen_; -#endif // defined(OS_TIZEN) - - void Initialize(); // Try to close all windows and quit the application. void Quit(); @@ -254,8 +247,6 @@ class Browser : public WindowListObserver { bool is_quiting_; - bool launched_; - private: // WindowListObserver implementations: void OnWindowCloseCancelled(NativeWindow* window) override; @@ -268,6 +259,14 @@ class Browser : public WindowListObserver { // Observers of the browser. base::ObserverList observers_; +#if defined(OS_TIZEN) + std::unique_ptr resource_manager_; + std::unique_ptr locale_manager_; + std::unique_ptr splash_screen_; + bool launched_; + bool is_electron_launch_; +#endif + // Whether `app.exit()` has been called bool is_exiting_; @@ -277,10 +276,6 @@ class Browser : public WindowListObserver { // The browser is being shutdown. bool is_shutdown_; -#if defined(OS_TIZEN) - bool is_electron_launch_; -#endif - std::string version_override_; std::string name_override_; diff --git a/atom/common/node_bindings.cc b/atom/common/node_bindings.cc index 2a9c057..e61b6eb 100644 --- a/atom/common/node_bindings.cc +++ b/atom/common/node_bindings.cc @@ -47,7 +47,6 @@ REFERENCE_MODULE(atom_browser_net); REFERENCE_MODULE(atom_browser_power_monitor); REFERENCE_MODULE(atom_browser_power_save_blocker); REFERENCE_MODULE(atom_browser_protocol); -REFERENCE_MODULE(atom_browser_pwrt); REFERENCE_MODULE(atom_browser_render_process_preferences); REFERENCE_MODULE(atom_browser_session); REFERENCE_MODULE(atom_browser_system_preferences); @@ -84,8 +83,7 @@ std::unique_ptr StringVectorToArgArray( base::FilePath GetResourcesPath(bool is_browser) { #if defined(OS_TIZEN) - // TODO: We should fix hardcoded path. - return base::FilePath("/opt/usr/home/owner/data/electron"); + return base::FilePath(FILE_PATH_LITERAL(TIZEN_RESOURCE_PATH)); #endif auto command_line = base::CommandLine::ForCurrentProcess(); base::FilePath exec_path(command_line->GetProgram()); diff --git a/lib/browser/api/module-list.js b/lib/browser/api/module-list.js index fcc07b3..64b2829 100644 --- a/lib/browser/api/module-list.js +++ b/lib/browser/api/module-list.js @@ -21,6 +21,5 @@ module.exports = [ {name: 'Tray', file: 'tray'}, {name: 'webContents', file: 'web-contents'}, // The internal modules, invisible unless you know their names. - {name: 'NavigationController', file: 'navigation-controller', private: true}, - {name: 'pwrt', file: 'pwrt', private: true} + {name: 'NavigationController', file: 'navigation-controller', private: true} ] diff --git a/lib/browser/api/pwrt.js b/lib/browser/api/pwrt.js deleted file mode 100644 index 0019884..0000000 --- a/lib/browser/api/pwrt.js +++ /dev/null @@ -1,3 +0,0 @@ -const {pwrt} = process.atomBinding('pwrt'); - -module.exports = pwrt diff --git a/lib/browser/init.js b/lib/browser/init.js index 6c8ac89..cfcf26f 100644 --- a/lib/browser/init.js +++ b/lib/browser/init.js @@ -42,21 +42,6 @@ if (process.platform === 'win32') { process.stdout.write = process.stderr.write = streamWrite } -let {pwrt} = require('electron'); -console.log = console.error = console.warn = function(...args) { - pwrt.log(util.format(...args)); -}; -process.stdout.write = process.stderr.write = function (chunk, encoding, callback) { - if (Buffer.isBuffer(chunk)) { - chunk = chunk.toString(encoding) - } - pwrt.log(chunk) - if (callback) { - callback() - } - return true -} - // Don't quit on fatal error. process.on('uncaughtException', function (error) { // Do nothing if the user has a custom uncaught exception handler. diff --git a/packaging/dbus.service b/packaging/dbus.service new file mode 100644 index 0000000..5d1ba5e --- /dev/null +++ b/packaging/dbus.service @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=org.tizen.wrt +User=owner +Exec=/bin/false +SystemdService=wrt.service diff --git a/packaging/electron-efl.spec b/packaging/electron-efl.spec index 91e9ae0..fad12e0 100755 --- a/packaging/electron-efl.spec +++ b/packaging/electron-efl.spec @@ -70,12 +70,14 @@ cp %{SOURCE1001} . %define _pkgid org.tizen.%{name} %define _xmldir %TZ_SYS_RO_PACKAGES %define _out out.tizen/out/D +%define _resourcedir /opt/usr/home/owner/data/wrt %define extension_path %{_libdir}/tizen-extensions-crosswalk DEFINE_ARGS=" libchromiumcontent_component=1 use_efl=1 is_tizen=1 + tizen_resource_path=%{_resourcedir} injected_bundle_path=%{_libdir}/libxwalk_injected_bundle.so extension_path=%{extension_path} " @@ -124,16 +126,22 @@ install -m 0644 packaging/%{_pkgid}.png %{buildroot}/%{_icondir} install -m 0755 %{_out}/lib/libnode.so %{buildroot}/%{_libdir} install -m 0755 %{_out}/wrt-loader %{buildroot}/%{_bindir} install -m 0755 %{_out}/wrt %{buildroot}/%{_bindir} +install -m 0755 %{_out}/wrt-service %{buildroot}/%{_bindir} ln -s %{_bindir}/wrt %{buildroot}%{_bindir}/wrt-client -ln -s %{_bindir}/wrt %{buildroot}%{_bindir}/xwalk_runtime # install resource. -mkdir -p %{buildroot}/opt/usr/home/owner/data/org.tizen.electron-efl -install -m 0755 %{_out}/resources/electron.asar %{buildroot}/opt/usr/home/owner/data/org.tizen.electron-efl +mkdir -p %{buildroot}%{_resourcedir} +install -m 0755 %{_out}/resources/electron.asar %{buildroot}%{_resourcedir} ./node_modules/asar/bin/asar p wrt %{_out}/resources/app.asar -install -m 0755 %{_out}/resources/app.asar %{buildroot}/opt/usr/home/owner/data/org.tizen.electron-efl +install -m 0755 %{_out}/resources/app.asar %{buildroot}%{_resourcedir} + +mkdir -p %{buildroot}%{_unitdir_user} +install -m 0644 packaging/systemd.service %{buildroot}%{_unitdir_user}/wrt.service + +mkdir -p %{buildroot}%{_datadir}/dbus-1/services +install -m 0644 packaging/dbus.service %{buildroot}%{_datadir}/dbus-1/services/org.tizen.wrt.service # injected bundle and extensions mkdir -p %{buildroot}%{extension_path} @@ -154,33 +162,28 @@ install -p -m 644 %{_out}/gen/splash_screen.json %{buildroot}%{extension_path} install -p -m 644 %{_out}/lib/libsplash_screen_plugin.so %{buildroot}%{_libdir} %post -# Owner account can't write /opt/usr/home/owner/data/org.tizen.electron-efl -# which is created in 'install'. So we should copy resources in 'post'. -cp -rf /opt/usr/home/owner/data/org.tizen.electron-efl /opt/usr/home/owner/data/electron -chown -R owner:users /opt/usr/home/owner/data/electron -rm -rf /opt/usr/home/owner/data/org.tizen.electron-efl - # FIXME: Until electron-efl is released to platform, # following command is needed to set wrt-loader # as cap_setgid,cap_sys_admin+ei. /usr/share/security-config/set_capability %postun -rm -rf /opt/usr/home/owner/data/electron %clean rm -fr %{buildroot} %files %manifest packaging/electron-efl.manifest -/opt/usr/home/owner/data/org.tizen.electron-efl/* +%{_resourcedir}/* %{_icondir}/%{_pkgid}.png %{_libdir}/libnode.so %{_xmldir}/%{_pkgid}.xml +%{_unitdir_user}/wrt.service +%{_datadir}/dbus-1/services/org.tizen.wrt.service %attr(755,root,root) %{_bindir}/wrt %attr(755,root,root) %{_bindir}/wrt-client +%attr(755,root,root) %{_bindir}/wrt-service %attr(755,root,root) %{_bindir}/wrt-loader -%attr(755,root,root) %{_bindir}/xwalk_runtime %attr(644,root,root) %{_datadir}/aul/wrt.loader %attr(644,root,root) %{_libdir}/libwrt_common.so %attr(644,root,root) %{_libdir}/libxwalk_extension_shared.so diff --git a/packaging/systemd.service b/packaging/systemd.service new file mode 100644 index 0000000..774fa29 --- /dev/null +++ b/packaging/systemd.service @@ -0,0 +1,10 @@ +[Unit] +Description=WRT daemon + +[Service] +Type=dbus +BusName=org.tizen.wrt +ExecStart=/usr/bin/wrt-service + +[Install] +WantedBy=default.target diff --git a/tizen/common.gypi b/tizen/common.gypi index b0c2055..5ec020d 100644 --- a/tizen/common.gypi +++ b/tizen/common.gypi @@ -7,6 +7,7 @@ 'clang%': 0, 'use_efl%': 0, 'is_tizen%': 0, + 'tizen_resource_path%': '', 'tizen_product_tv%': 0, }, 'conditions': [ @@ -16,16 +17,12 @@ 'USE_EFL', ], }, - 'variables': { - 'js_sources': [ - '<(DEPTH)/lib/browser/api/pwrt.js', - ], - }, }], # use_efl==1 ['is_tizen==1', { 'target_defaults': { 'defines': [ 'OS_TIZEN', + 'TIZEN_RESOURCE_PATH="<(tizen_resource_path)"', ], }, 'variables': { diff --git a/tizen/common/application_data.cc b/tizen/common/application_data.cc index 48b4f3a..13ecf5c 100644 --- a/tizen/common/application_data.cc +++ b/tizen/common/application_data.cc @@ -43,14 +43,10 @@ const char* kWearableClockCategory = "http://tizen.org/category/wearable_clock"; } // namespace -ApplicationData::ApplicationData(const std::string& appid) - : app_id_(appid), loaded_(false) { +ApplicationData::ApplicationData(const std::string& app_id) { SCOPE_PROFILE(); - char* res_path = app_get_resource_path(); - if (res_path != NULL) { - application_path_ = std::string(res_path) + kWgtPath + kPathSeparator; - free(res_path); - } + if (init()) + app_id_ = app_id; } ApplicationData::~ApplicationData() {} @@ -118,6 +114,19 @@ std::shared_ptr ApplicationData::csp_report_info() return csp_report_info_; } +const wgt::parse::ServiceInfo* ApplicationData::service_info() const { + if (!service_list_) + return nullptr; + auto iter = service_list_->services.begin(); + auto end = service_list_->services.end(); + for (; iter != end; ++iter) { + if (app_id_ == iter->id()) { + return &*iter; + } + } + return nullptr; +} + const std::string ApplicationData::pkg_id() const { if (pkg_id_.empty()) { app_info_h app_info; @@ -153,13 +162,12 @@ ApplicationData::AppType ApplicationData::GetAppType() { return UI; } -bool ApplicationData::LoadManifestData() { - if (loaded_) { - return true; +bool ApplicationData::init() { + std::unique_ptr res_path(app_get_resource_path()); + if (res_path) { + application_path_ = std::string(res_path.get()) + kWgtPath + kPathSeparator; } - SCOPE_PROFILE(); - std::string config_xml_path(application_path_ + kConfigXml); if (!utils::Exists(config_xml_path)) { LOGGER(ERROR) << "Failed to load manifest data : No such file '" @@ -227,6 +235,9 @@ bool ApplicationData::LoadManifestData() { widget_config_parser->GetManifestData( wgt::parse::CSPInfo::Report_only_key())); + service_list_ = std::static_pointer_cast( + widget_config_parser->GetManifestData(wgt::parse::ServiceInfo::Key())); + // Set default empty object if (widget_info_.get() == NULL) { widget_info_.reset(new wgt::parse::WidgetInfo); @@ -236,28 +247,35 @@ bool ApplicationData::LoadManifestData() { } app_type_ = GetAppType(); - loaded_ = true; return true; } // static -ApplicationDataManager* ApplicationDataManager::GetInstance() { - static ApplicationDataManager self; - return &self; +ApplicationDataManager& ApplicationDataManager::GetInstance() { + static ApplicationDataManager manager; + return manager; } -ApplicationDataManager::ApplicationDataManager() {} - -ApplicationDataManager::~ApplicationDataManager() {} - -ApplicationData* ApplicationDataManager::GetApplicationData( - const std::string& appid) { - auto it = cache_.find(appid); - if (it == cache_.end()) { - cache_[appid].reset(new ApplicationData(appid)); +// static +ApplicationData* ApplicationDataManager::SetCurrentAppID( + const std::string& app_id) { + ApplicationDataManager& manager = GetInstance(); + auto it = manager.cache_.find(app_id); + if (it == manager.cache_.end()) { + std::unique_ptr data(new ApplicationData(app_id)); + if (!data->app_id().empty()) { + manager.cache_[app_id] = std::move(data); + manager.current_ = manager.cache_[app_id].get(); + } } - return cache_[appid].get(); + return manager.cache_[app_id].get(); +} + +// static +ApplicationData* ApplicationDataManager::GetCurrentAppData() { + ApplicationDataManager& manager = GetInstance(); + return manager.current_; } } // namespace common diff --git a/tizen/common/application_data.h b/tizen/common/application_data.h index 8f43cae..0429eb0 100644 --- a/tizen/common/application_data.h +++ b/tizen/common/application_data.h @@ -43,11 +43,9 @@ class ApplicationData { public: enum AppType { UI = 0, IME, WATCH }; - explicit ApplicationData(const std::string& appid); + explicit ApplicationData(const std::string& app_id); ~ApplicationData(); - bool LoadManifestData(); - std::shared_ptr app_control_info_list() const; std::shared_ptr category_info_list() @@ -66,6 +64,7 @@ class ApplicationData { std::shared_ptr warp_info() const; std::shared_ptr csp_info() const; std::shared_ptr csp_report_info() const; + const wgt::parse::ServiceInfo* service_info() const; const std::string application_path() const { return application_path_; } const std::string pkg_id() const; @@ -73,6 +72,9 @@ class ApplicationData { ApplicationData::AppType app_type() { return app_type_; } private: + bool init(); + ApplicationData::AppType GetAppType(); + std::shared_ptr app_control_info_list_; std::shared_ptr category_info_list_; std::shared_ptr meta_data_info_; @@ -88,26 +90,27 @@ class ApplicationData { std::shared_ptr warp_info_; std::shared_ptr csp_info_; std::shared_ptr csp_report_info_; - ApplicationData::AppType GetAppType(); + std::shared_ptr service_list_; std::string application_path_; mutable std::string pkg_id_; std::string app_id_; ApplicationData::AppType app_type_; - bool loaded_; }; class ApplicationDataManager { public: - static ApplicationDataManager* GetInstance(); - - ApplicationData* GetApplicationData(const std::string& appid); + static ApplicationData* SetCurrentAppID(const std::string& app_id); + static ApplicationData* GetCurrentAppData(); private: - ApplicationDataManager(); - virtual ~ApplicationDataManager(); + static ApplicationDataManager& GetInstance(); + + ApplicationDataManager() : current_(nullptr) {}; + virtual ~ApplicationDataManager() {}; std::map> cache_; + ApplicationData* current_; }; } // namespace common diff --git a/tizen/common/logger.h b/tizen/common/logger.h index bce7013..029db80 100644 --- a/tizen/common/logger.h +++ b/tizen/common/logger.h @@ -21,7 +21,7 @@ #include #undef LOGGER_TAG -#define LOGGER_TAG "ELECTRON" +#define LOGGER_TAG "WRT" #define _LOGGER_LOG(prio, fmt, args...) \ LOG_(LOG_ID_MAIN, prio, LOGGER_TAG, fmt, ##args) diff --git a/tizen/extensions/common/xwalk_extension_server.cc b/tizen/extensions/common/xwalk_extension_server.cc index 06c45e0..4c3b9fd 100644 --- a/tizen/extensions/common/xwalk_extension_server.cc +++ b/tizen/extensions/common/xwalk_extension_server.cc @@ -8,7 +8,6 @@ #include -#include "atom/common/api/api_messages.h" #include "common/logger.h" #include "common/profiler.h" #include "common/string_utils.h" diff --git a/tizen/extensions/extensions.gyp b/tizen/extensions/extensions.gyp index d22c755..ed7b380 100644 --- a/tizen/extensions/extensions.gyp +++ b/tizen/extensions/extensions.gyp @@ -43,6 +43,7 @@ 'packages': [ 'chromium-efl', 'elementary', + 'jsoncpp', ], }, 'include_dirs': [ @@ -62,7 +63,6 @@ # ], 'variables': { 'packages': [ - 'jsoncpp', ], }, }, diff --git a/tizen/loader/wrt_loader.cc b/tizen/loader/wrt_loader.cc index 1e756e0..1d37333 100644 --- a/tizen/loader/wrt_loader.cc +++ b/tizen/loader/wrt_loader.cc @@ -22,7 +22,7 @@ int main(int argc, char* argv[]) { dlog_print(DLOG_INFO, "CHROMIUM", "Begin wrt-loader"); void* handle = dlopen("/usr/bin/wrt", RTLD_NOW); if (!handle) { - dlog_print(DLOG_ERROR, "CHROMIUM", "Failed to load electorn"); + dlog_print(DLOG_ERROR, "CHROMIUM", "Failed to load wrt (%s)", dlerror()); return false; } diff --git a/tizen/renderer/injected_bundle.cc b/tizen/renderer/injected_bundle.cc index e3ee3c9..c7e5061 100644 --- a/tizen/renderer/injected_bundle.cc +++ b/tizen/renderer/injected_bundle.cc @@ -52,11 +52,8 @@ class BundleGlobalData { void Initialize(const std::string& app_id) { PreInitialize(); - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* app_data = - appdata_manager->GetApplicationData(app_id); + auto app_data = common::ApplicationDataManager::SetCurrentAppID(app_id); - app_data->LoadManifestData(); // PreInitialized locale_manager_.reset(new common::LocaleManager); locale_manager_->EnableAutoUpdate(true); if (app_data->widget_info() != NULL && @@ -100,9 +97,7 @@ extern "C" void DynamicSetWidgetInfo(const char* tizen_id) { runtime::BundleGlobalData::GetInstance()->Initialize(tizen_id); extensions::XWalkExtensionRendererController& controller = extensions::XWalkExtensionRendererController::GetInstance(); - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* app_data = - appdata_manager->GetApplicationData(tizen_id); + auto app_data = common::ApplicationDataManager::GetCurrentAppData(); controller.LoadUserExtensions(app_data->application_path()); } diff --git a/tizen/src/app/service_main.cc b/tizen/src/app/service_main.cc new file mode 100644 index 0000000..4c1d84a --- /dev/null +++ b/tizen/src/app/service_main.cc @@ -0,0 +1,95 @@ +#include + +#include "atom/app/node_main.h" +#include "base/at_exit.h" +#include "base/files/file_path.h" +#include "base/i18n/icu_util.h" +#include "base/logging.h" +#include "base/path_service.h" +#include "tizen/common/application_data.h" +#include "tizen/src/browser/wrt_ipc.h" +#include "tizen/src/browser/wrt_service.h" +#include "vendor/node/deps/uv/include/uv.h" + +#define REFERENCE_MODULE(name) \ + extern "C" void _register_ ## name(void); \ + void (*wrt_register_ ## name)(void) = _register_ ## name +REFERENCE_MODULE(atom_common_asar); +REFERENCE_MODULE(wrt); +#undef REFERENCE_MODULE + +int ServiceDaemon() { + tizen::ServiceManager::Get(); + + uv_thread_t dbus_thread; + uv_thread_create(&dbus_thread, [](void* data) { + tizen::IPC ipc(true); + ipc.AddMessageHandler("StartService", [](const char*, const char* app_id, const tizen::IPC::Message& message) { + tizen::ServiceManager::Get()->Prepare(app_id, message.Sender()); + }); + ipc.Listen(); + }, nullptr); + + base::i18n::InitializeICU(); + base::AtExitManager atexit_manager; + + PathService::Override(base::DIR_EXE, base::FilePath("/usr/lib/chromium-efl/")); + + std::string resource_path(TIZEN_RESOURCE_PATH); + resource_path += "/app.asar/service/main.js"; + + char* arguments[] = { "wrtd", const_cast(resource_path.c_str()) }; + atom::NodeMain(sizeof(arguments) / sizeof(char*), arguments); + + LOG(ERROR) << "WRT deamon is terminated"; + return 0; +} + +int ServiceClient(const std::string& app_id) { + tizen::IPC ipc; + if (!ipc.SendMessage("StartService", app_id.c_str())) { + return 1; + } + + ipc.AddMessageHandler("ReadFile", [](const char*, const char* argument, const tizen::IPC::Message& message) { + std::string file(argument); + auto app_data = common::ApplicationDataManager::GetCurrentAppData(); + base::FilePath path(app_data->application_path()); + if (file.empty()) { + const wgt::parse::ServiceInfo* info = app_data->service_info(); + if (info) + path = path.Append(info->content()); + } else { + path = path.Append(file); + } + + std::ifstream in(path.value(), std::ios::in); + std::string content; + if (in) { + in.seekg(0, std::ios::end); + content.resize(in.tellg()); + in.seekg(0, std::ios::beg); + in.read(&content[0], content.size()); + in.close(); + } + + message.Reply(content.c_str()); + }); + ipc.AddMessageHandler("Done", [](const char*, const char*, const tizen::IPC::Message&) { + //dbus_connection_close(connection); // TODO : App is relaunched by platfrom after exit. + }); + + ipc.Listen(); + return 0; +} + +int main(int argc, char* argv[]) { + std::string app_id(basename(argv[0])); + if (common::ApplicationDataManager::SetCurrentAppID(app_id)) { + return ServiceClient(app_id); + } else { + return ServiceDaemon(); + } + + return 0; +} diff --git a/tizen/src/browser/api/wrt_api_core.cc b/tizen/src/browser/api/wrt_api_core.cc new file mode 100644 index 0000000..51f0f00 --- /dev/null +++ b/tizen/src/browser/api/wrt_api_core.cc @@ -0,0 +1,122 @@ +#include "tizen/src/browser/api/wrt_api_core.h" + +#include + +#include "atom/browser/browser.h" +#include "atom/common/node_includes.h" +#include "base/files/file_path.h" +#include "base/logging.h" +#include "native_mate/dictionary.h" +#include "tizen/common/application_data.h" +#include "tizen/common/command_line.h" +#include "tizen/src/browser/wrt_service.h" + +namespace tizen { + +namespace api { + +WebRuntime* WebRuntime::instance_ = nullptr; + +WebRuntime::WebRuntime(v8::Isolate* isolate) { + Init(isolate); + instance_ = this; +} + +WebRuntime::~WebRuntime() { + instance_ = nullptr; +} + +std::string WebRuntime::GetMessage() const { + return "message from C++"; +} + +std::string WebRuntime::GetPath() const { + auto app_data = common::ApplicationDataManager::GetCurrentAppData(); + if (!app_data) { + return std::string(); + } + // TODO: Use resource-manager's GetStartResource() for localized urls + base::FilePath path(app_data->application_path()); + if (app_data->content_info()) { + path = path.Append(app_data->content_info()->src()); + } else { + path = path.Append("index.html"); + } + std::string app_path = "file://" + path.value(); + return app_path; +} + +bool WebRuntime::isTizenWebApp() const { + common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); + if (!runtime_cmd) + return false; + std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/electron"); + if (appid != "electron") { // TODO: Any better distinguishing feature? + return true; + } else { + return false; + } +} + +bool WebRuntime::isElectronLaunch() const { + return atom::Browser::Get()->is_electron_launch(); +} + +void WebRuntime::HideSplashScreen(int reason) { + atom::Browser* browser_model = atom::Browser::Get(); + browser_model->HideSplashScreen(reason); +} + +void WebRuntime::Log(const std::string& message) const { + std::string output = "[JS LOG] " + message; + dlog_print(DLOG_INFO, "WRT", output.c_str()); +} + +std::string WebRuntime::ReadService(const std::string& app_id) const { + tizen::Service* service = tizen::ServiceManager::Get()->GetService(app_id); + if (!service) { + isolate()->ThrowException(v8::Exception::Error(mate::StringToV8( + isolate(), "Fail to find service app."))); + return std::string(); + } + return service->ReadFile(std::string()); +} + +// static +mate::Handle WebRuntime::Create(v8::Isolate* isolate) { + return mate::CreateHandle(isolate, new WebRuntime(isolate)); +} + +// static +void WebRuntime::BuildPrototype( + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "WRT")); + // TODO: Needs adding necessary interface methods + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) + .SetMethod("getMessage", &WebRuntime::GetMessage) + .SetMethod("getPath", &WebRuntime::GetPath) + .SetMethod("isTizenWebApp", &WebRuntime::isTizenWebApp) + .SetMethod("isElectronLaunch", &WebRuntime::isElectronLaunch) + .SetMethod("hideSplashScreen", &WebRuntime::HideSplashScreen) + .SetMethod("log", &WebRuntime::Log) + .SetMethod("readService", &WebRuntime::ReadService); +} + +} // namespace api + +} // namespace tizen + + +namespace { + +void Initialize(v8::Local exports, v8::Local unused, + v8::Local context, void* priv) { + v8::Isolate* isolate = context->GetIsolate(); + mate::Dictionary dict(isolate, exports); + // TODO: Expose this attribute only for Tizen web apps + dict.Set("wrt", tizen::api::WebRuntime::Create(isolate)); +} + +} // namespace + +NODE_MODULE_CONTEXT_AWARE_BUILTIN(wrt, Initialize) diff --git a/tizen/src/browser/api/wrt_api_core.h b/tizen/src/browser/api/wrt_api_core.h new file mode 100644 index 0000000..6c27987 --- /dev/null +++ b/tizen/src/browser/api/wrt_api_core.h @@ -0,0 +1,42 @@ +#ifndef BROWSER_API_WRT_API_CORE_H_ +#define BROWSER_API_WRT_API_CORE_H_ + +#include "atom/browser/api/event_emitter.h" +#include "native_mate/handle.h" + +namespace tizen { + +namespace api { + +class WebRuntime : public mate::EventEmitter { + public: + static mate::Handle Create(v8::Isolate* isolate); + + static void BuildPrototype(v8::Isolate* isolate, + v8::Local prototype); + + static WebRuntime* GetInstance() { return instance_; } + + protected: + explicit WebRuntime(v8::Isolate* isolate); + ~WebRuntime() override; + + private: + std::string GetMessage() const; + std::string GetPath() const; + bool isTizenWebApp() const; + bool isElectronLaunch() const; + void HideSplashScreen(int reason); + void Log(const std::string& message) const; + std::string ReadService(const std::string& app_id) const; + + static WebRuntime* instance_; + + DISALLOW_COPY_AND_ASSIGN(WebRuntime); +}; + +} // namespace api + +} // namespace tizen + +#endif // BROWSER_API_WRT_API_CORE_H_ diff --git a/tizen/src/browser/wrt_ipc.cc b/tizen/src/browser/wrt_ipc.cc new file mode 100644 index 0000000..72af83a --- /dev/null +++ b/tizen/src/browser/wrt_ipc.cc @@ -0,0 +1,170 @@ +#include "tizen/src/browser/wrt_ipc.h" + +#include "base/logging.h" + +namespace tizen { + +#define WRT_DBUS_NAME "org.tizen.wrt" +#define WRT_DBUS_PATH "/org/tizen/wrt" + +IPC::Message::Message(DBusConnection* connection, DBusMessage* message) + : connection_(connection), message_(message) {} + +const char* IPC::Message::Sender() const { + return dbus_message_get_sender(message_); +} + +void IPC::Message::Reply(const char* argument) const { + DBusMessage* reply = dbus_message_new_method_return(message_); + dbus_message_append_args(reply, DBUS_TYPE_STRING, &argument, DBUS_TYPE_INVALID); + dbus_connection_send(connection_, reply, nullptr); + dbus_message_unref(reply); +} + +IPC::IPC(bool is_daemon) { + DBusError error; + dbus_error_init(&error); + + connection_ = dbus_bus_get_private(DBUS_BUS_SESSION, &error); + if (!connection_) { + LOG(ERROR) << "DBus connection error : " << error.message; + dbus_error_free(&error); + } + + if (is_daemon) { + int result = dbus_bus_request_name(connection_, WRT_DBUS_NAME, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error); + if (dbus_error_is_set(&error)) { + LOG(ERROR) << "Fail to request name : " << error.message; + dbus_error_free(&error); + return; + } + if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + LOG(ERROR) << "Fail to become owner"; + return; + } + } +} + +IPC::~IPC() { + dbus_connection_close(connection_); + dbus_connection_unref(connection_); +} + +// static +DBusHandlerResult IPC::OnMessage(DBusConnection* connection, DBusMessage* message, void* user_data) { + int type = dbus_message_get_type(message); + if (type != DBUS_MESSAGE_TYPE_METHOD_CALL) { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + std::string interface = dbus_message_get_interface(message); + if (interface != WRT_DBUS_NAME) { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + std::string member = dbus_message_get_member(message); + IPC* ipc = reinterpret_cast(user_data); + auto iterator = ipc->message_handlers_.find(member); + if (iterator != ipc->message_handlers_.end()) { + DBusError error; + dbus_error_init(&error); + char* argument = nullptr; + if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &argument, DBUS_TYPE_INVALID)) { + LOG(ERROR) << "dbus message reply is not valid"; + dbus_error_free(&error); + } + + auto handler = iterator->second; + handler(member.c_str(), argument, Message(ipc->connection_, message)); + } + + return DBUS_HANDLER_RESULT_HANDLED; +} + +void IPC::AddMessageHandler(const char* type, MessageHandler handler) { + if (message_handlers_.empty()) { + if (!dbus_connection_add_filter(connection_, OnMessage, this, nullptr)) { + LOG(ERROR) << "Fail to add message handler"; + return; + } + } + message_handlers_[type] = handler; +} + +void IPC::Listen() { + while (dbus_connection_read_write_dispatch(connection_, -1)) { + ; // empty loop body + } +} + +DBusMessage* IPC::InternalSendMessage(const char* receiver, const char* type, const char* argument, bool need_reply) { + DBusMessage* message = dbus_message_new_method_call(receiver, WRT_DBUS_PATH, WRT_DBUS_NAME, type); + if (!message) { + LOG(ERROR) << "Fail to create dbus message"; + return nullptr; + } + + if (!dbus_message_append_args(message, DBUS_TYPE_STRING, &argument, DBUS_TYPE_INVALID)) { + LOG(ERROR) << "Fail to append dbus message argument"; + return nullptr; + } + + DBusError error; + dbus_error_init(&error); + if (need_reply) { + DBusMessage* reply = dbus_connection_send_with_reply_and_block(connection_, message, -1, &error); + dbus_message_unref(message); + if (!reply) { + LOG(ERROR) << "Fail to receive dbus message reply"; + dbus_error_free(&error); + return nullptr; + } + message = reply; + } else { + dbus_connection_send(connection_, message, nullptr); + dbus_connection_flush(connection_); + } + if (dbus_error_is_set(&error)) { + LOG(ERROR) << "Fail to send message : " << error.message; + dbus_error_free(&error); + return nullptr; + } + + return message; +} + +bool IPC::SendMessage(const char* type, const char* argument) { + return SendMessage(WRT_DBUS_NAME, type, argument); +} + +bool IPC::SendMessage(const char* receiver, const char* type, const char* argument) { + DBusMessage* message = InternalSendMessage(receiver, type, argument, false); + if (!message) { + return false; + } + dbus_message_unref(message); + return true; +} + +bool IPC::SendMessageAndWaitReply(const char* receiver, const char* type, const char* argument, std::string& reply_argument) { + DBusMessage* reply = InternalSendMessage(receiver, type, argument, true); + if (!reply) { + return false; + } + + if (dbus_message_get_type(reply) != DBUS_MESSAGE_TYPE_ERROR) { + DBusError error; + dbus_error_init(&error); + char* buffer = nullptr; + if (!dbus_message_get_args(reply, &error, DBUS_TYPE_STRING, &buffer, DBUS_TYPE_INVALID)) { + LOG(ERROR) << "dbus message reply is not valid"; + dbus_error_free(&error); + return false; + } + reply_argument = buffer; + } + dbus_message_unref(reply); + return true; +} + +} // namespace tizen diff --git a/tizen/src/browser/wrt_ipc.h b/tizen/src/browser/wrt_ipc.h new file mode 100644 index 0000000..51c5511 --- /dev/null +++ b/tizen/src/browser/wrt_ipc.h @@ -0,0 +1,48 @@ +#ifndef BROWSER_WRT_IPC_H_ +#define BROWSER_WRT_IPC_H_ + +#include +#include +#include +#include + +namespace tizen { + +class IPC { + public: + IPC(bool is_daemon = false); + ~IPC(); + + class Message { + public: + Message(DBusConnection* connection, DBusMessage* message); + + const char* Sender() const; + void Reply(const char* argument) const; + + private: + DBusConnection* connection_; + DBusMessage* message_; + }; + + typedef std::function MessageHandler; + + void AddMessageHandler(const char* type, MessageHandler handler); + void Listen(); + + bool SendMessage(const char* type, const char* argument); + bool SendMessage(const char* receiver, const char* type, const char* argument); + bool SendMessageAndWaitReply(const char* receiver, const char* type, const char* argument, std::string& reply_argument); + + private: + static DBusHandlerResult OnMessage(DBusConnection* connection, DBusMessage* message, void* user_data); + + DBusMessage* InternalSendMessage(const char* receiver, const char* type, const char* argument, bool need_reply); + + DBusConnection* connection_; + std::map message_handlers_; +}; + +} // namespace tizen + +#endif // BROWSER_WRT_IPC_H_ diff --git a/tizen/src/browser/wrt_service.cc b/tizen/src/browser/wrt_service.cc new file mode 100644 index 0000000..c3f6314 --- /dev/null +++ b/tizen/src/browser/wrt_service.cc @@ -0,0 +1,75 @@ +#include "tizen/src/browser/wrt_service.h" + +#include "base/logging.h" +#include "tizen/src/browser/api/wrt_api_core.h" + +namespace tizen { + +Service::Service(std::string source_name) + : source_name_(source_name) {} + +const std::string Service::ReadFile(const std::string file) { + std::string content; + ServiceManager::Get()->ipc_.SendMessageAndWaitReply(source_name_.c_str(), "ReadFile", file.c_str(), content); + return content; +} + +ServiceManager::ServiceManager() { + uv_async_init(uv_default_loop(), &handle_, OnMainThread); + handle_.data = this; + uv_mutex_init(&mutex_); +} + +ServiceManager::~ServiceManager() { + uv_close(reinterpret_cast(&handle_), nullptr); + uv_mutex_destroy(&mutex_); +} + +// static +ServiceManager* ServiceManager::Get() { + static ServiceManager* manager = nullptr; + if (!manager) { + manager = new ServiceManager; + } + return manager; +} + +Service* ServiceManager::GetService(const std::string app_id) { + auto iter = services_.find(app_id); + if (iter == services_.end()) { + return nullptr; + } + return iter->second; +} + +void ServiceManager::Prepare(const std::string app_id, const std::string source_name) { + Service* service = new Service(source_name); + uv_mutex_lock(&mutex_); + prepared_services_.push_back(app_id); + services_[app_id] = service; + uv_mutex_unlock(&mutex_); + uv_async_send(&handle_); +} + +// static +void ServiceManager::OnMainThread(uv_async_t* handle) { + ServiceManager* manager = reinterpret_cast(handle->data); + std::vector services; + + auto wrt = tizen::api::WebRuntime::GetInstance(); + if (!wrt) { + LOG(ERROR) << "JS WRT object is not created"; + return; + } + + uv_mutex_lock(&manager->mutex_); + services.swap(manager->prepared_services_); + uv_mutex_unlock(&manager->mutex_); + + for (auto it = services.begin(); it != services.end(); it++) { + std::string app_id = *it; + wrt->Emit("start-service", app_id); + } +} + +} // namespace tizen diff --git a/tizen/src/browser/wrt_service.h b/tizen/src/browser/wrt_service.h new file mode 100644 index 0000000..bc41981 --- /dev/null +++ b/tizen/src/browser/wrt_service.h @@ -0,0 +1,47 @@ +#ifndef BROWSER_WRT_SERVICE_H_ +#define BROWSER_WRT_SERVICE_H_ + +#include +#include +#include + +#include "tizen/src/browser/wrt_ipc.h" +#include "vendor/node/deps/uv/include/uv.h" + +namespace tizen { + +class Service { + public: + Service(std::string source_name); + + const std::string ReadFile(const std::string file); + + private: + const std::string source_name_; +}; + +class ServiceManager { + public: + static ServiceManager* Get(); + + Service* GetService(const std::string app_id); + void Prepare(const std::string app_id, const std::string source_name); + + private: + ServiceManager(); + ~ServiceManager(); + + static void OnMainThread(uv_async_t* handle); + + friend class Service; + + uv_async_t handle_; + uv_mutex_t mutex_; + std::vector prepared_services_; + std::map services_; + IPC ipc_; +}; + +} // namespace tizen + +#endif // BROWSER_WRT_SERVICE_H_ diff --git a/tizen/src/wrt_main.cc b/tizen/src/wrt_main.cc index 8c8052b..fc0320d 100644 --- a/tizen/src/wrt_main.cc +++ b/tizen/src/wrt_main.cc @@ -5,37 +5,16 @@ #include "wrt_main.h" #include - -#if defined(OS_WIN) -#include // windows.h must be included first - -#include -#include -#include - -#include "atom/app/atom_main_delegate.h" -#include "atom/common/crash_reporter/win/crash_service_main.h" -#include "base/environment.h" -#include "base/process/launch.h" -#include "base/win/windows_version.h" -#include "content/public/app/sandbox_helper_win.h" -#include "sandbox/win/src/sandbox_types.h" -#elif defined(OS_LINUX) // defined(OS_WIN) #include "atom/app/atom_main_delegate.h" // NOLINT #include "content/public/app/content_main.h" -#else // defined(OS_LINUX) -#include "atom/app/atom_library_main.h" -#endif // defined(OS_MACOSX) - -#if defined(USE_EFL) -#include "efl/init.h" -#endif #include "atom/app/node_main.h" #include "atom/common/atom_command_line.h" #include "base/at_exit.h" #include "base/i18n/icu_util.h" +#include "efl/init.h" + #if defined(OS_TIZEN) #include @@ -49,94 +28,19 @@ namespace { -const char* kRunAsNode = "ELECTRON_RUN_AS_NODE"; - // Default command line flags for all profiles and platforms const char* kDefaultCommandLineFlags[] = { "allow-file-access-from-files", "enable-tizen-app-container", }; -bool IsEnvSet(const char* name) { -#if defined(OS_WIN) - size_t required_size; - getenv_s(&required_size, nullptr, 0, name); - return required_size != 0; -#else - char* indicator = getenv(name); - return indicator && indicator[0] != '\0'; -#endif -} - } // namespace -#if defined(OS_WIN) -int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) { - int argc = 0; - wchar_t** wargv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); - - bool run_as_node = IsEnvSet(kRunAsNode); - - // Make sure the output is printed to console. - if (run_as_node || !IsEnvSet("ELECTRON_NO_ATTACH_CONSOLE")) - base::RouteStdioToConsole(false); - - // Convert argv to to UTF8 - char** argv = new char*[argc]; - for (int i = 0; i < argc; i++) { - // Compute the size of the required buffer - DWORD size = WideCharToMultiByte(CP_UTF8, - 0, - wargv[i], - -1, - NULL, - 0, - NULL, - NULL); - if (size == 0) { - // This should never happen. - fprintf(stderr, "Could not convert arguments to utf8."); - exit(1); - } - // Do the actual conversion - argv[i] = new char[size]; - DWORD result = WideCharToMultiByte(CP_UTF8, - 0, - wargv[i], - -1, - argv[i], - size, - NULL, - NULL); - if (result == 0) { - // This should never happen. - fprintf(stderr, "Could not convert arguments to utf8."); - exit(1); - } - } - - if (run_as_node) { - // Now that argv conversion is done, we can finally start. - base::AtExitManager atexit_manager; - base::i18n::InitializeICU(); - return atom::NodeMain(argc, argv); - } else if (IsEnvSet("ELECTRON_INTERNAL_CRASH_SERVICE")) { - return crash_service::Main(cmd); - } - - sandbox::SandboxInterfaceInfo sandbox_info = {0}; - content::InitializeSandboxInfo(&sandbox_info); - atom::AtomMainDelegate delegate; - - content::ContentMainParams params(&delegate); - params.instance = instance; - params.sandbox_info = &sandbox_info; - atom::AtomCommandLine::Init(argc, argv); - atom::AtomCommandLine::InitW(argc, wargv); - return content::ContentMain(params); -} - -#elif defined(OS_LINUX) // defined(OS_WIN) +#define REFERENCE_MODULE(name) \ + extern "C" void _register_ ## name(void); \ + void (*wrt_register_ ## name)(void) = _register_ ## name +REFERENCE_MODULE(wrt); +#undef REFERENCE_MODULE #if defined(OS_TIZEN) bool g_initialized_ = false; @@ -159,13 +63,7 @@ int main(int argc, char* argv[]) { #endif for (int i = 0; i < argc; ++i) LOG(ERROR) << "argv[" << i << "] : " << argv[i]; - if (IsEnvSet(kRunAsNode)) { - base::i18n::InitializeICU(); - base::AtExitManager atexit_manager; - return atom::NodeMain(argc, const_cast(argv)); - } -#if defined(USE_EFL) if (!common::CommandLine::Init(argc, argv)) { common::CommandLine::Reset(); common::CommandLine::Init(argc, argv); @@ -175,16 +73,13 @@ int main(int argc, char* argv[]) { base::CommandLine::Reset(); base::CommandLine::Init(argc, argv); } + common::CommandLine* runtime_cmd = common::CommandLine::ForCurrentProcess(); std::string appid = runtime_cmd->GetAppIdFromCommandLine("/usr/bin/wrt"); // load manifest if (appid != "wrt") { // TODO: Any better way to distinguish? - auto appdata_manager = common::ApplicationDataManager::GetInstance(); - common::ApplicationData* appdata = appdata_manager->GetApplicationData(appid); - if (!appdata->LoadManifestData()) { - return false; - } + common::ApplicationDataManager::SetCurrentAppID(appid); } if (!g_initialized_) { if (efl::Initialize(argc, const_cast(argv))) @@ -198,7 +93,6 @@ int main(int argc, char* argv[]) { for (auto arg : kDefaultCommandLineFlags) command_line->AppendSwitch(const_cast(arg)); efl::AppendPortParams(*command_line); -#endif atom::AtomMainDelegate delegate; content::ContentMainParams params(&delegate); @@ -250,15 +144,3 @@ int main(int argc, const char* argv[]) { } } #endif - -#else // defined(OS_LINUX) - -int main(int argc, const char* argv[]) { - if (IsEnvSet(kRunAsNode)) { - return AtomInitializeICUandStartNode(argc, const_cast(argv)); - } - - return AtomMain(argc, argv); -} - -#endif // defined(OS_MACOSX) diff --git a/vendor/node/src/node.cc b/vendor/node/src/node.cc index 66233d4..aca7991 100644 --- a/vendor/node/src/node.cc +++ b/vendor/node/src/node.cc @@ -94,6 +94,10 @@ typedef int mode_t; extern char **environ; #endif +#if defined(OS_TIZEN) +#include +#endif + namespace node { using v8::Array; @@ -273,6 +277,9 @@ static void PrintErrorString(const char* format, ...) { // Don't include the null character in the output CHECK_GT(n, 0); WriteConsoleW(stderr_handle, wbuf.data(), n - 1, nullptr, nullptr); +#elif defined(OS_TIZEN) + dlog_print(DLOG_ERROR, "WRT", "[Node.js ERROR]"); + dlog_vprint(DLOG_ERROR, "WRT", format, ap); #else vfprintf(stderr, format, ap); #endif diff --git a/wrt.gyp b/wrt.gyp index eef72f2..32f0a97 100644 --- a/wrt.gyp +++ b/wrt.gyp @@ -11,9 +11,9 @@ '<(DEPTH)/electron.gyp:js2asar', '<(DEPTH)/electron.gyp:app2asar', 'wrt_lib', + 'wrt-service', '<(DEPTH)/tizen/common/common.gyp:wrt_common', '<(DEPTH)/tizen/loader/loader.gyp:wrt-loader', - '<(DEPTH)/tizen/extensions/extensions.gyp:xwalk_extension_shared', '<(DEPTH)/tizen/extensions/extensions.gyp:widget_plugin', '<(DEPTH)/tizen/extensions/extensions.gyp:splash_screen_plugin', '<(DEPTH)/tizen/renderer/injected_bundle.gyp:xwalk_injected_bundle', @@ -28,8 +28,6 @@ 'tizen/src/wrt_main.h', 'tizen/loader/prelauncher.h', 'tizen/loader/prelauncher.cc', - 'atom/browser/splash_screen.h', - 'atom/browser/splash_screen.cc', ], 'include_dirs': [ 'tizen/src', @@ -45,9 +43,28 @@ 'cflags_cc': [ '-fPIC' ], }, # target wrt { + 'target_name': 'wrt-service', + 'type': 'executable', + 'dependencies': [ + 'wrt_lib', + '<(DEPTH)/efl/build/system.gyp:capi-appfw-application', + '<(DEPTH)/tizen/common/common.gyp:wrt_common', + ], + 'sources': [ + 'tizen/src/app/service_main.cc', + ], + 'include_dirs': [ + 'tizen/src', + ], + 'includes': [ + 'tizen/build/common.gypi', + ], + }, # target wrt-service + { 'target_name': 'wrt_lib', 'type': 'static_library', 'dependencies': [ + '<(DEPTH)/tizen/extensions/extensions.gyp:xwalk_extension_shared', 'electron.gyp:atom_js2c', 'vendor/pdf_viewer/pdf_viewer.gyp:pdf_viewer', 'vendor/brightray/brightray.gyp:brightray', @@ -82,14 +99,14 @@ 'atom/app/ui_runtime.h', 'atom/browser/api/atom_api_menu_efl.cc', 'atom/browser/api/atom_api_menu_efl.h', - 'atom/browser/api/atom_api_pwrt.cc', - 'atom/browser/api/atom_api_pwrt.h', 'atom/browser/api/atom_api_web_contents_efl.cc', 'atom/browser/common_web_contents_delegate_efl.cc', 'atom/browser/native_browser_view_efl.cc', 'atom/browser/native_browser_view_efl.h', 'atom/browser/native_window_efl.cc', 'atom/browser/native_window_efl.h', + 'atom/browser/splash_screen.h', + 'atom/browser/splash_screen.cc', 'atom/browser/ui/accelerator_util_efl.cc', 'atom/browser/ui/drag_util_efl.cc', 'atom/browser/ui/file_dialog_efl.cc', @@ -99,6 +116,12 @@ 'chromium_src/chrome/browser/extensions/global_shortcut_listener_ozone.cc', 'chromium_src/chrome/browser/extensions/global_shortcut_listener_ozone.h', 'chromium_src/chrome/browser/icon_loader_efllinux.cc', + 'tizen/src/browser/api/wrt_api_core.cc', + 'tizen/src/browser/api/wrt_api_core.h', + 'tizen/src/browser/wrt_ipc.cc', + 'tizen/src/browser/wrt_ipc.h', + 'tizen/src/browser/wrt_service.cc', + 'tizen/src/browser/wrt_service.h', ], 'sources/': [ # chromium-efl supports only tizen webrtc using CAPI diff --git a/wrt/browser/wrt.js b/wrt/browser/wrt.js new file mode 100644 index 0000000..36b4035 --- /dev/null +++ b/wrt/browser/wrt.js @@ -0,0 +1,21 @@ +const {wrt} = process.binding('wrt'); +const {EventEmitter} = require('events') +const util = require('util') + +Object.setPrototypeOf(Object.getPrototypeOf(wrt), EventEmitter.prototype) + +module.exports = wrt + +console.log = console.error = console.warn = function(...args) { + wrt.log(util.format(...args)); +}; +process.stdout.write = process.stderr.write = function (chunk, encoding, callback) { + if (Buffer.isBuffer(chunk)) { + chunk = chunk.toString(encoding) + } + wrt.log(chunk) + if (callback) { + callback() + } + return true +} diff --git a/wrt/service/main.js b/wrt/service/main.js new file mode 100644 index 0000000..264669c --- /dev/null +++ b/wrt/service/main.js @@ -0,0 +1,15 @@ +'use strict'; + +const wrt = require('../browser/wrt'); +const vm = require('vm'); + +wrt.on('start-service', (event, appID) => { + console.log('start service app : ' + appID); + let sandbox = { console: console }; + let options = { filename: appID }; + vm.runInNewContext(wrt.readService(appID), sandbox, options); +}) + +process.on('exit', (code) => { + console.log('Exit with code : ' + code); +}) diff --git a/wrt/src/main.js b/wrt/src/main.js index c1045a5..e1ee03f 100644 --- a/wrt/src/main.js +++ b/wrt/src/main.js @@ -1,6 +1,5 @@ 'use strict'; -const {pwrt} = require('electron'); const path_debug = require('debug')('MAIN'); const runtime = require('./runtime'); const yargs = require('yargs'); @@ -32,7 +31,7 @@ let parseCommandLine = function() { return { appID: args.a, devMode: args.d, - path: args.p ? args.p : pwrt.getPath(), + path: args.p, windowSize: args.s }; }; diff --git a/wrt/src/runtime.js b/wrt/src/runtime.js index 2c1a1de..e9a6ead 100755 --- a/wrt/src/runtime.js +++ b/wrt/src/runtime.js @@ -1,11 +1,12 @@ 'use strict'; const EXTENSIONS_PATH = process.env.WAS_EXTENSIONS_PATH; const ExtensionManager = require('./extension_manager'); -const {app, ipcMain, pwrt} = require('electron'); +const {app, ipcMain} = require('electron'); const IPC_MESSAGE = require('./ipc_message'); const WAS_EVENT = require('./was_event'); const WebApplication = require('./web_application'); const events = require('./events'); +const wrt = require('../browser/wrt'); const runtime_debug = require('debug')('RUNTIME'); const try_debug = require('debug')('TRY'); @@ -51,9 +52,9 @@ class Runtime { }); app.on('will-finish-launching', function(event) { runtime_debug('will-finish-launching'); - if (pwrt.isElectronLaunch()) { + if (wrt.isElectronLaunch()) { console.log("Electron App launch"); - let filePath = pwrt.getPath(); + let filePath = wrt.getPath(); let pkgJson = require(filePath.substr(7, filePath.length - 12)); let mainJsPath = filePath.substr(7, filePath.length - 19) + (pkgJson.main || 'index.js'); @@ -68,7 +69,7 @@ class Runtime { if (!options.noExtensions) { this.extensionManager.build(); } - if (pwrt.isElectronLaunch()) { + if (wrt.isElectronLaunch()) { this.extensionManager.activateAll(app); return; } diff --git a/wrt/src/web_window.js b/wrt/src/web_window.js index 95476d8..fe6c3b9 100644 --- a/wrt/src/web_window.js +++ b/wrt/src/web_window.js @@ -1,8 +1,9 @@ 'use strict'; -const {BrowserWindow, app, pwrt} = require('electron'); +const {BrowserWindow, app} = require('electron'); const IPC_MESSAGE = require('./ipc_message'); const WAS_EVENT = require('./was_event'); const events = require('./events'); +const wrt = require('../browser/wrt'); const target_debug = require('debug')('TARGET'); const webwindow_debug = require('debug')('WEBWINDOW'); @@ -125,7 +126,7 @@ class WebWindow { }); this.mainWindow.webContents.on('did-finish-load', function() { webwindow_debug('WebWindow : webContents did-finish-load'); - pwrt.hideSplashScreen(1); + wrt.hideSplashScreen(1); if(!options.show){ webwindow_debug('WebWindow : browserWindow show options is ',options.show); @@ -221,8 +222,7 @@ class WebWindow { if (path && (path.trim() != '')) { this.mainWindow.loadURL(path); } else { - const {pwrt} = require('electron'); -        this.mainWindow.loadURL(pwrt.getPath()); +        this.mainWindow.loadURL(wrt.getPath()); } } show() { -- 2.7.4 From 992f0affc8602d20f2901b18724c88c5a5df663e Mon Sep 17 00:00:00 2001 From: Prathmesh Date: Fri, 15 Jun 2018 12:34:53 +0530 Subject: [PATCH 02/16] Implemented getting of start url from resource manager - Change the url load logic from window create to on appcontrol - Pass the AppControl event to Window(On top) - Make start url ready when getpath() is called - Refactor code to move under OS_TIZEN macro Change-Id: I6b739950d16b8391a9af05b0ba63f306b339fcfc Signed-off-by: Prathmesh --- atom/browser/api/atom_api_window.cc | 6 +++++- atom/browser/api/atom_api_window.h | 3 ++- atom/browser/browser.cc | 23 ++++++++++++++++++----- atom/browser/browser.h | 11 +++++++---- atom/browser/browser_observer.h | 2 -- atom/browser/native_window.cc | 20 ++++++++++++++++++++ atom/browser/native_window.h | 5 +++++ atom/browser/native_window_observer.h | 7 +++++++ tizen/common/resource_manager.cc | 6 ++++++ tizen/src/browser/api/wrt_api_core.cc | 12 +++++++++++- wrt/src/web_window.js | 6 +++++- 11 files changed, 86 insertions(+), 15 deletions(-) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index f19fbda..db323ae 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -310,7 +310,7 @@ void Window::OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) { } #endif -#if defined(USE_EFL) +#if defined(OS_TIZEN) void Window::OnSuspend() { Emit("app-on-suspend"); } @@ -318,6 +318,10 @@ void Window::OnSuspend() { void Window::OnResume() { Emit("app-on-resume"); } + +void Window::OnAppControl() { + Emit("app-on-appcontrol"); +} #endif // static diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 91b5633..b8eff85 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -96,9 +96,10 @@ class Window : public mate::TrackableObject, void OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) override; #endif -#if defined(USE_EFL) +#if defined(OS_TIZEN) void OnSuspend(); void OnResume(); + void OnAppControl(); #endif private: diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index 1110602..aca2f68 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -44,6 +44,7 @@ Browser::~Browser() { WindowList::RemoveObserver(this); } +#if defined(OS_TIZEN) const char* kAppControlMain = "http://tizen.org/appcontrol/operation/main"; const char* kAppControlEventScript = "(function(){" @@ -56,6 +57,7 @@ const char* kAppControlEventScript = "})()"; const char* kDefaultCSPRule = "default-src *; script-src 'self'; style-src 'self'; object-src 'none';"; +#endif // static Browser* Browser::Get() { @@ -260,19 +262,23 @@ void Browser::OnWindowAllClosed() { } } +#if defined(OS_TIZEN) void Browser::Hide() { - for (BrowserObserver& observer : observers_) - observer.OnSuspend(); + NativeWindow *last_window = WindowList::GetLastWindow(); + if (last_window) + last_window->NotifySuspend(); } void Browser::Show() { - for (BrowserObserver& observer : observers_) - observer.OnResume(); + NativeWindow *last_window = WindowList::GetLastWindow(); + if (last_window) + last_window->NotifyResume(); } void Browser::Initialize() { auto appdata = common::ApplicationDataManager::GetCurrentAppData(); resource_manager_.reset(new common::ResourceManager(appdata, locale_manager_.get())); + resource_manager_->set_base_resource_path(appdata->application_path()); } void Browser::AppControl(std::unique_ptr appcontrol) { @@ -312,9 +318,16 @@ void Browser::SendAppControlEvent() { void Browser::Launch(std::unique_ptr appcontrol) { launched_ = true; //To do:Implementation of relaunching of app + std::unique_ptr res = + resource_manager_->GetStartResource(appcontrol.get()); + if (res) + start_url_ = resource_manager_->GetLocalizedPath(res->uri()); + + NativeWindow *last_window = WindowList::GetLastWindow(); + if (last_window) + last_window->NotifyAppControl(); } -#if defined(OS_TIZEN) void Browser::SetSplashScreen() { auto appdata = common::ApplicationDataManager::GetCurrentAppData(); Evas_Object* window_ = elm_win_util_standard_add("", ""); diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 0e759e6..48365b8 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -16,12 +16,12 @@ #include "base/strings/string16.h" #include "base/values.h" #include "native_mate/arguments.h" +#if defined(OS_TIZEN) +#include "atom/browser/splash_screen.h" #include "tizen/common/app_control.h" #include "tizen/common/application_data.h" #include "tizen/common/resource_manager.h" #include "tizen/common/locale_manager.h" -#if defined(OS_TIZEN) -#include "atom/browser/splash_screen.h" #endif // defined(OS_TIZEN) @@ -98,7 +98,7 @@ class Browser : public WindowListObserver { // Set/Get the badge count. bool SetBadgeCount(int count); - bool launched() const { return launched_; } + int GetBadgeCount(); // Set/Get the login item settings of the app @@ -114,14 +114,16 @@ class Browser : public WindowListObserver { void SetLoginItemSettings(LoginItemSettings settings); LoginItemSettings GetLoginItemSettings(const LoginItemSettings& options); +#if defined(OS_TIZEN) void Hide(); void Show(); void AppControl(std::unique_ptr appcontrol); void Launch(std::unique_ptr appcontrol); void SendAppControlEvent(); -#if defined(OS_TIZEN) void SetSplashScreen(); void HideSplashScreen(int reason); + bool launched() const { return launched_; } + std::string StartURL() const { return start_url_;} #endif // defined(OS_TIZEN) #if defined(OS_MACOSX) @@ -263,6 +265,7 @@ class Browser : public WindowListObserver { std::unique_ptr resource_manager_; std::unique_ptr locale_manager_; std::unique_ptr splash_screen_; + std::string start_url_; bool launched_; bool is_electron_launch_; #endif diff --git a/atom/browser/browser_observer.h b/atom/browser/browser_observer.h index b5760ec..88a50a9 100644 --- a/atom/browser/browser_observer.h +++ b/atom/browser/browser_observer.h @@ -55,8 +55,6 @@ class BrowserObserver { // The browser's accessibility suppport has changed. virtual void OnAccessibilitySupportChanged() {} - virtual void OnSuspend() {} - virtual void OnResume() {} #if defined(OS_MACOSX) // The browser wants to resume a user activity via handoff. (macOS only) virtual void OnContinueUserActivity( diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 9e2c11a..4320eb8 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -605,6 +605,26 @@ void NativeWindow::NotifyWindowMessage( } #endif +#if defined(OS_TIZEN) +void NativeWindow::NotifySuspend() +{ + for (NativeWindowObserver& observer : observers_) + observer.OnSuspend(); +} + +void NativeWindow::NotifyResume() +{ + for (NativeWindowObserver& observer : observers_) + observer.OnResume(); +} + +void NativeWindow::NotifyAppControl() +{ + for (NativeWindowObserver& observer : observers_) + observer.OnAppControl(); +} +#endif + std::unique_ptr NativeWindow::DraggableRegionsToSkRegion( const std::vector& regions) { std::unique_ptr sk_region(new SkRegion); diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 654b68e..0e07787 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -248,6 +248,11 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowMessage(UINT message, WPARAM w_param, LPARAM l_param); #endif +#if defined(OS_TIZEN) + void NotifySuspend(); + void NotifyResume(); + void NotifyAppControl(); +#endif void AddObserver(NativeWindowObserver* obs) { observers_.AddObserver(obs); } diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index 8c908dc..96ac375 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -92,6 +92,13 @@ class NativeWindowObserver { // Called on Windows when App Commands arrive (WM_APPCOMMAND) virtual void OnExecuteWindowsCommand(const std::string& command_name) {} + +#if defined(OS_TIZEN) + // Tizen + virtual void OnSuspend() {} + virtual void OnResume() {} + virtual void OnAppControl() {} +#endif }; } // namespace atom diff --git a/tizen/common/resource_manager.cc b/tizen/common/resource_manager.cc index e177ab5..22fa8bf 100644 --- a/tizen/common/resource_manager.cc +++ b/tizen/common/resource_manager.cc @@ -258,6 +258,12 @@ std::unique_ptr ResourceManager::GetMatchedResource( std::unique_ptr ResourceManager::GetStartResource( const AppControl* app_control) { + + if (!app_control) { + LOGGER(ERROR) << "ERROR: No app control"; + return GetDefaultResource(); + } + std::string operation = app_control->operation(); if (operation.empty()) { LOGGER(ERROR) << "operation(mandatory) is NULL"; diff --git a/tizen/src/browser/api/wrt_api_core.cc b/tizen/src/browser/api/wrt_api_core.cc index 51f0f00..b418583 100644 --- a/tizen/src/browser/api/wrt_api_core.cc +++ b/tizen/src/browser/api/wrt_api_core.cc @@ -31,11 +31,20 @@ std::string WebRuntime::GetMessage() const { } std::string WebRuntime::GetPath() const { + atom::Browser* browser_model = atom::Browser::Get(); + if (browser_model) { + std::string res = browser_model->StartURL(); + if (!res.empty()) { + LOG(ERROR) << "PWRT Start URL = " << res; + return res; + } + } + + // Fall back: This code must ideally not execute auto app_data = common::ApplicationDataManager::GetCurrentAppData(); if (!app_data) { return std::string(); } - // TODO: Use resource-manager's GetStartResource() for localized urls base::FilePath path(app_data->application_path()); if (app_data->content_info()) { path = path.Append(app_data->content_info()->src()); @@ -43,6 +52,7 @@ std::string WebRuntime::GetPath() const { path = path.Append("index.html"); } std::string app_path = "file://" + path.value(); + LOG(ERROR) << "PWRT Start Url = " << app_path; return app_path; } diff --git a/wrt/src/web_window.js b/wrt/src/web_window.js index fe6c3b9..039b294 100644 --- a/wrt/src/web_window.js +++ b/wrt/src/web_window.js @@ -24,7 +24,6 @@ class WebWindow { this.handleEvents(winopt); this.appID = options.appID; webwindow_debug('this.appID ' + this.appID); - this.setUrl(options.path); } getBrowserWindowOption() { return { @@ -120,6 +119,10 @@ class WebWindow { webwindow_debug('WebWindow : app-on-resume'); events.emit(WAS_EVENT.WEBAPPLICATION.RESUME, 'web_window', self.mainWindow.id); }); + this.mainWindow.on('app-on-appcontrol', function() { + webwindow_debug('WebWindow : app-on-appcontrol'); + self.setUrl(''); + }); this.mainWindow.webContents.on('crashed', function() { webwindow_debug('WebWindow : webContents crashed'); self.webApplication.exit(100); @@ -219,6 +222,7 @@ class WebWindow { }); } setUrl(path) { + webwindow_debug('WebWindow : Set URL'); if (path && (path.trim() != '')) { this.mainWindow.loadURL(path); } else { -- 2.7.4 From 41bf4458a4ad7ac22f9c6713e4b88c1ab291019f Mon Sep 17 00:00:00 2001 From: Prathmesh Date: Mon, 18 Jun 2018 14:52:27 +0530 Subject: [PATCH 03/16] Block loading of extension in render - Plugins are already loaded in browser - There is no use of loading in renderer as the plugins loaded in browser will be used. Change-Id: I8175667d01f30be7242ff9eb24f7db597533a7c3 Signed-off-by: Prathmesh --- tizen/extensions/renderer/xwalk_extension_client.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tizen/extensions/renderer/xwalk_extension_client.cc b/tizen/extensions/renderer/xwalk_extension_client.cc index d113269..4199fed 100644 --- a/tizen/extensions/renderer/xwalk_extension_client.cc +++ b/tizen/extensions/renderer/xwalk_extension_client.cc @@ -149,8 +149,11 @@ void XWalkExtensionClient::OnReceivedIPCMessage( } void XWalkExtensionClient::LoadUserExtensions(const std::string app_path) { - XWalkExtensionServer* server = XWalkExtensionServer::GetInstance(); - server->LoadUserExtensions(app_path); + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(switches::kSingleProcess)) { + XWalkExtensionServer* server = XWalkExtensionServer::GetInstance(); + server->LoadUserExtensions(app_path); + } } } // namespace extensions -- 2.7.4 From c9e544ecfdf62d04a2ea5e30f2c2356a432f5d25 Mon Sep 17 00:00:00 2001 From: "jaekuk, lee" Date: Wed, 20 Jun 2018 17:45:03 +0900 Subject: [PATCH 04/16] move activateAll API up Change-Id: Id3787e59ff3c77f2c6dfa3772fde9cd7b269ca0c Signed-off-by: jaekuk, lee --- wrt/src/runtime.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wrt/src/runtime.js b/wrt/src/runtime.js index e9a6ead..4bcc1f8 100755 --- a/wrt/src/runtime.js +++ b/wrt/src/runtime.js @@ -69,12 +69,11 @@ class Runtime { if (!options.noExtensions) { this.extensionManager.build(); } + this.extensionManager.activateAll(app); if (wrt.isElectronLaunch()) { - this.extensionManager.activateAll(app); return; } this.webApplication = new WebApplication(options); - this.extensionManager.activateAll(app); }); } onPause(web_window_id) { -- 2.7.4 From df0169c030661bfc2a87de93198ad743a3fa9bb2 Mon Sep 17 00:00:00 2001 From: Prathmesh Manurkar Date: Wed, 20 Jun 2018 14:58:40 +0000 Subject: [PATCH 05/16] Revert "Implemented getting of start url from resource manager" This reverts commit 992f0affc8602d20f2901b18724c88c5a5df663e. Change-Id: Ia1d6019843a934f54ce340c3db8ec742e5b4d841 --- atom/browser/api/atom_api_window.cc | 6 +----- atom/browser/api/atom_api_window.h | 3 +-- atom/browser/browser.cc | 23 +++++------------------ atom/browser/browser.h | 11 ++++------- atom/browser/browser_observer.h | 2 ++ atom/browser/native_window.cc | 20 -------------------- atom/browser/native_window.h | 5 ----- atom/browser/native_window_observer.h | 7 ------- tizen/common/resource_manager.cc | 6 ------ tizen/src/browser/api/wrt_api_core.cc | 12 +----------- wrt/src/web_window.js | 6 +----- 11 files changed, 15 insertions(+), 86 deletions(-) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index db323ae..f19fbda 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -310,7 +310,7 @@ void Window::OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) { } #endif -#if defined(OS_TIZEN) +#if defined(USE_EFL) void Window::OnSuspend() { Emit("app-on-suspend"); } @@ -318,10 +318,6 @@ void Window::OnSuspend() { void Window::OnResume() { Emit("app-on-resume"); } - -void Window::OnAppControl() { - Emit("app-on-appcontrol"); -} #endif // static diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index b8eff85..91b5633 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -96,10 +96,9 @@ class Window : public mate::TrackableObject, void OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) override; #endif -#if defined(OS_TIZEN) +#if defined(USE_EFL) void OnSuspend(); void OnResume(); - void OnAppControl(); #endif private: diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index aca2f68..1110602 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -44,7 +44,6 @@ Browser::~Browser() { WindowList::RemoveObserver(this); } -#if defined(OS_TIZEN) const char* kAppControlMain = "http://tizen.org/appcontrol/operation/main"; const char* kAppControlEventScript = "(function(){" @@ -57,7 +56,6 @@ const char* kAppControlEventScript = "})()"; const char* kDefaultCSPRule = "default-src *; script-src 'self'; style-src 'self'; object-src 'none';"; -#endif // static Browser* Browser::Get() { @@ -262,23 +260,19 @@ void Browser::OnWindowAllClosed() { } } -#if defined(OS_TIZEN) void Browser::Hide() { - NativeWindow *last_window = WindowList::GetLastWindow(); - if (last_window) - last_window->NotifySuspend(); + for (BrowserObserver& observer : observers_) + observer.OnSuspend(); } void Browser::Show() { - NativeWindow *last_window = WindowList::GetLastWindow(); - if (last_window) - last_window->NotifyResume(); + for (BrowserObserver& observer : observers_) + observer.OnResume(); } void Browser::Initialize() { auto appdata = common::ApplicationDataManager::GetCurrentAppData(); resource_manager_.reset(new common::ResourceManager(appdata, locale_manager_.get())); - resource_manager_->set_base_resource_path(appdata->application_path()); } void Browser::AppControl(std::unique_ptr appcontrol) { @@ -318,16 +312,9 @@ void Browser::SendAppControlEvent() { void Browser::Launch(std::unique_ptr appcontrol) { launched_ = true; //To do:Implementation of relaunching of app - std::unique_ptr res = - resource_manager_->GetStartResource(appcontrol.get()); - if (res) - start_url_ = resource_manager_->GetLocalizedPath(res->uri()); - - NativeWindow *last_window = WindowList::GetLastWindow(); - if (last_window) - last_window->NotifyAppControl(); } +#if defined(OS_TIZEN) void Browser::SetSplashScreen() { auto appdata = common::ApplicationDataManager::GetCurrentAppData(); Evas_Object* window_ = elm_win_util_standard_add("", ""); diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 48365b8..0e759e6 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -16,12 +16,12 @@ #include "base/strings/string16.h" #include "base/values.h" #include "native_mate/arguments.h" -#if defined(OS_TIZEN) -#include "atom/browser/splash_screen.h" #include "tizen/common/app_control.h" #include "tizen/common/application_data.h" #include "tizen/common/resource_manager.h" #include "tizen/common/locale_manager.h" +#if defined(OS_TIZEN) +#include "atom/browser/splash_screen.h" #endif // defined(OS_TIZEN) @@ -98,7 +98,7 @@ class Browser : public WindowListObserver { // Set/Get the badge count. bool SetBadgeCount(int count); - + bool launched() const { return launched_; } int GetBadgeCount(); // Set/Get the login item settings of the app @@ -114,16 +114,14 @@ class Browser : public WindowListObserver { void SetLoginItemSettings(LoginItemSettings settings); LoginItemSettings GetLoginItemSettings(const LoginItemSettings& options); -#if defined(OS_TIZEN) void Hide(); void Show(); void AppControl(std::unique_ptr appcontrol); void Launch(std::unique_ptr appcontrol); void SendAppControlEvent(); +#if defined(OS_TIZEN) void SetSplashScreen(); void HideSplashScreen(int reason); - bool launched() const { return launched_; } - std::string StartURL() const { return start_url_;} #endif // defined(OS_TIZEN) #if defined(OS_MACOSX) @@ -265,7 +263,6 @@ class Browser : public WindowListObserver { std::unique_ptr resource_manager_; std::unique_ptr locale_manager_; std::unique_ptr splash_screen_; - std::string start_url_; bool launched_; bool is_electron_launch_; #endif diff --git a/atom/browser/browser_observer.h b/atom/browser/browser_observer.h index 88a50a9..b5760ec 100644 --- a/atom/browser/browser_observer.h +++ b/atom/browser/browser_observer.h @@ -55,6 +55,8 @@ class BrowserObserver { // The browser's accessibility suppport has changed. virtual void OnAccessibilitySupportChanged() {} + virtual void OnSuspend() {} + virtual void OnResume() {} #if defined(OS_MACOSX) // The browser wants to resume a user activity via handoff. (macOS only) virtual void OnContinueUserActivity( diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 4320eb8..9e2c11a 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -605,26 +605,6 @@ void NativeWindow::NotifyWindowMessage( } #endif -#if defined(OS_TIZEN) -void NativeWindow::NotifySuspend() -{ - for (NativeWindowObserver& observer : observers_) - observer.OnSuspend(); -} - -void NativeWindow::NotifyResume() -{ - for (NativeWindowObserver& observer : observers_) - observer.OnResume(); -} - -void NativeWindow::NotifyAppControl() -{ - for (NativeWindowObserver& observer : observers_) - observer.OnAppControl(); -} -#endif - std::unique_ptr NativeWindow::DraggableRegionsToSkRegion( const std::vector& regions) { std::unique_ptr sk_region(new SkRegion); diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 0e07787..654b68e 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -248,11 +248,6 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowMessage(UINT message, WPARAM w_param, LPARAM l_param); #endif -#if defined(OS_TIZEN) - void NotifySuspend(); - void NotifyResume(); - void NotifyAppControl(); -#endif void AddObserver(NativeWindowObserver* obs) { observers_.AddObserver(obs); } diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index 96ac375..8c908dc 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -92,13 +92,6 @@ class NativeWindowObserver { // Called on Windows when App Commands arrive (WM_APPCOMMAND) virtual void OnExecuteWindowsCommand(const std::string& command_name) {} - -#if defined(OS_TIZEN) - // Tizen - virtual void OnSuspend() {} - virtual void OnResume() {} - virtual void OnAppControl() {} -#endif }; } // namespace atom diff --git a/tizen/common/resource_manager.cc b/tizen/common/resource_manager.cc index 22fa8bf..e177ab5 100644 --- a/tizen/common/resource_manager.cc +++ b/tizen/common/resource_manager.cc @@ -258,12 +258,6 @@ std::unique_ptr ResourceManager::GetMatchedResource( std::unique_ptr ResourceManager::GetStartResource( const AppControl* app_control) { - - if (!app_control) { - LOGGER(ERROR) << "ERROR: No app control"; - return GetDefaultResource(); - } - std::string operation = app_control->operation(); if (operation.empty()) { LOGGER(ERROR) << "operation(mandatory) is NULL"; diff --git a/tizen/src/browser/api/wrt_api_core.cc b/tizen/src/browser/api/wrt_api_core.cc index b418583..51f0f00 100644 --- a/tizen/src/browser/api/wrt_api_core.cc +++ b/tizen/src/browser/api/wrt_api_core.cc @@ -31,20 +31,11 @@ std::string WebRuntime::GetMessage() const { } std::string WebRuntime::GetPath() const { - atom::Browser* browser_model = atom::Browser::Get(); - if (browser_model) { - std::string res = browser_model->StartURL(); - if (!res.empty()) { - LOG(ERROR) << "PWRT Start URL = " << res; - return res; - } - } - - // Fall back: This code must ideally not execute auto app_data = common::ApplicationDataManager::GetCurrentAppData(); if (!app_data) { return std::string(); } + // TODO: Use resource-manager's GetStartResource() for localized urls base::FilePath path(app_data->application_path()); if (app_data->content_info()) { path = path.Append(app_data->content_info()->src()); @@ -52,7 +43,6 @@ std::string WebRuntime::GetPath() const { path = path.Append("index.html"); } std::string app_path = "file://" + path.value(); - LOG(ERROR) << "PWRT Start Url = " << app_path; return app_path; } diff --git a/wrt/src/web_window.js b/wrt/src/web_window.js index 039b294..fe6c3b9 100644 --- a/wrt/src/web_window.js +++ b/wrt/src/web_window.js @@ -24,6 +24,7 @@ class WebWindow { this.handleEvents(winopt); this.appID = options.appID; webwindow_debug('this.appID ' + this.appID); + this.setUrl(options.path); } getBrowserWindowOption() { return { @@ -119,10 +120,6 @@ class WebWindow { webwindow_debug('WebWindow : app-on-resume'); events.emit(WAS_EVENT.WEBAPPLICATION.RESUME, 'web_window', self.mainWindow.id); }); - this.mainWindow.on('app-on-appcontrol', function() { - webwindow_debug('WebWindow : app-on-appcontrol'); - self.setUrl(''); - }); this.mainWindow.webContents.on('crashed', function() { webwindow_debug('WebWindow : webContents crashed'); self.webApplication.exit(100); @@ -222,7 +219,6 @@ class WebWindow { }); } setUrl(path) { - webwindow_debug('WebWindow : Set URL'); if (path && (path.trim() != '')) { this.mainWindow.loadURL(path); } else { -- 2.7.4 From 16b5d8ccddca0d91fe308eb1a803b9cb41fafc2f Mon Sep 17 00:00:00 2001 From: Prathmesh Date: Tue, 19 Jun 2018 16:32:52 +0530 Subject: [PATCH 06/16] Show window early for hosted web application - If the window is not shown and the url is http or https (hosted web application), then show on load start - Currently the window is shown when content is ready, but for hosted app the contents need to downloaded. So there will be some delay in showing window - If the app is hosted, then show window on load start Change-Id: I77948215a9bd501c43ff258a440c3d386c6f4389 Signed-off-by: Prathmesh --- atom/browser/api/atom_api_web_contents.cc | 8 ++++++++ atom/browser/native_window_efl.cc | 11 ++++++++--- atom/browser/native_window_efl.h | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index d81d2cb..a784f77 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -742,6 +742,14 @@ void WebContents::DidFailLoad(content::RenderFrameHost* render_frame_host, } void WebContents::DidStartLoading() { +#if defined(OS_TIZEN) + if (!owner_window()->IsVisible()) { + std::string scheme = web_contents()->GetURL().scheme(); + if (std::string::npos != scheme.find("http")) { + owner_window()->Show(); + } + } +#endif Emit("did-start-loading"); } diff --git a/atom/browser/native_window_efl.cc b/atom/browser/native_window_efl.cc index 2f214b7..bcbe509 100644 --- a/atom/browser/native_window_efl.cc +++ b/atom/browser/native_window_efl.cc @@ -112,7 +112,7 @@ NativeWindowEfl::NativeWindowEfl( #if defined(OS_TIZEN_TV_PRODUCT) CreateMouseCursor(box); #endif - + visibilityStatus_ = false; } NativeWindowEfl::~NativeWindowEfl() { @@ -122,6 +122,7 @@ NativeWindowEfl::~NativeWindowEfl() { eext_object_event_callback_del(web_view_, EEXT_CALLBACK_MORE, &HWBackKeyCallback); #endif + visibilityStatus_ = false; } #if defined(OS_TIZEN_TV_PRODUCT) @@ -156,6 +157,7 @@ void NativeWindowEfl::Close() { evas_object_del(window_); window_ = nullptr; + visibilityStatus_ = false; CloseContents(web_contents()); } @@ -163,6 +165,8 @@ void NativeWindowEfl::CloseImmediately() { if(window_) evas_object_del(window_); window_ = nullptr; + + visibilityStatus_ = false; NotifyWindowClosed(); } @@ -179,6 +183,7 @@ void NativeWindowEfl::Show() { LOG(ERROR) << "There's no available window or webview."; evas_object_show(window_); evas_object_show(web_view_); + visibilityStatus_ = true; } void NativeWindowEfl::ShowInactive() { @@ -188,11 +193,11 @@ void NativeWindowEfl::ShowInactive() { void NativeWindowEfl::Hide() { evas_object_hide(web_view_); evas_object_hide(window_); + visibilityStatus_ = false; } bool NativeWindowEfl::IsVisible() { - NOTIMPLEMENTED(); - return true; + return visibilityStatus_; } bool NativeWindowEfl::IsEnabled() { diff --git a/atom/browser/native_window_efl.h b/atom/browser/native_window_efl.h index fc04293..b7f4024 100644 --- a/atom/browser/native_window_efl.h +++ b/atom/browser/native_window_efl.h @@ -112,6 +112,7 @@ class NativeWindowEfl : public NativeWindow { std::string title_; bool fullscreenable_; + bool visibilityStatus_; DISALLOW_COPY_AND_ASSIGN(NativeWindowEfl); }; -- 2.7.4 From cd0e6cab12a8cea0efb206cb9cbdbcfe87191061 Mon Sep 17 00:00:00 2001 From: Prathmesh Date: Wed, 20 Jun 2018 20:26:21 +0530 Subject: [PATCH 07/16] Fix up for hosted app Change-Id: I9d4391250d6bd0f6d3191ddb31df834425f6cd39 Signed-off-by: Prathmesh --- tizen/src/browser/api/wrt_api_core.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tizen/src/browser/api/wrt_api_core.cc b/tizen/src/browser/api/wrt_api_core.cc index 51f0f00..c185cc9 100644 --- a/tizen/src/browser/api/wrt_api_core.cc +++ b/tizen/src/browser/api/wrt_api_core.cc @@ -35,6 +35,11 @@ std::string WebRuntime::GetPath() const { if (!app_data) { return std::string(); } + std::string checkpath = app_data->content_info()->src(); + if (std::string::npos != checkpath.find("http")) { + return checkpath; + } + // TODO: Use resource-manager's GetStartResource() for localized urls base::FilePath path(app_data->application_path()); if (app_data->content_info()) { -- 2.7.4 From 69e91caa0c065f9bb3c505ef752aadf1a2dab738 Mon Sep 17 00:00:00 2001 From: Prathmesh Date: Fri, 15 Jun 2018 12:34:53 +0530 Subject: [PATCH 08/16] Implemented getting of start url from resource manager - Change the url load logic from window create to on appcontrol - Pass the AppControl event to Window(On top) - Make start url ready when getpath() is called - Refactor code to move under OS_TIZEN macro Change-Id: I95e3b467578f363a175efe6d2a04c500f6f6793d Signed-off-by: Prathmesh --- atom/browser/api/atom_api_window.cc | 6 +++++- atom/browser/api/atom_api_window.h | 3 ++- atom/browser/browser.cc | 23 ++++++++++++++++++----- atom/browser/browser.h | 11 +++++++---- atom/browser/browser_observer.h | 2 -- atom/browser/native_window.cc | 20 ++++++++++++++++++++ atom/browser/native_window.h | 5 +++++ atom/browser/native_window_observer.h | 7 +++++++ tizen/common/resource_manager.cc | 6 ++++++ tizen/src/browser/api/wrt_api_core.cc | 23 ++++++++++++++++++----- tizen/src/wrt_main.cc | 3 +++ wrt/src/web_window.js | 6 +++++- 12 files changed, 96 insertions(+), 19 deletions(-) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index f19fbda..db323ae 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -310,7 +310,7 @@ void Window::OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) { } #endif -#if defined(USE_EFL) +#if defined(OS_TIZEN) void Window::OnSuspend() { Emit("app-on-suspend"); } @@ -318,6 +318,10 @@ void Window::OnSuspend() { void Window::OnResume() { Emit("app-on-resume"); } + +void Window::OnAppControl() { + Emit("app-on-appcontrol"); +} #endif // static diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 91b5633..b8eff85 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -96,9 +96,10 @@ class Window : public mate::TrackableObject, void OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) override; #endif -#if defined(USE_EFL) +#if defined(OS_TIZEN) void OnSuspend(); void OnResume(); + void OnAppControl(); #endif private: diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index 1110602..aca2f68 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -44,6 +44,7 @@ Browser::~Browser() { WindowList::RemoveObserver(this); } +#if defined(OS_TIZEN) const char* kAppControlMain = "http://tizen.org/appcontrol/operation/main"; const char* kAppControlEventScript = "(function(){" @@ -56,6 +57,7 @@ const char* kAppControlEventScript = "})()"; const char* kDefaultCSPRule = "default-src *; script-src 'self'; style-src 'self'; object-src 'none';"; +#endif // static Browser* Browser::Get() { @@ -260,19 +262,23 @@ void Browser::OnWindowAllClosed() { } } +#if defined(OS_TIZEN) void Browser::Hide() { - for (BrowserObserver& observer : observers_) - observer.OnSuspend(); + NativeWindow *last_window = WindowList::GetLastWindow(); + if (last_window) + last_window->NotifySuspend(); } void Browser::Show() { - for (BrowserObserver& observer : observers_) - observer.OnResume(); + NativeWindow *last_window = WindowList::GetLastWindow(); + if (last_window) + last_window->NotifyResume(); } void Browser::Initialize() { auto appdata = common::ApplicationDataManager::GetCurrentAppData(); resource_manager_.reset(new common::ResourceManager(appdata, locale_manager_.get())); + resource_manager_->set_base_resource_path(appdata->application_path()); } void Browser::AppControl(std::unique_ptr appcontrol) { @@ -312,9 +318,16 @@ void Browser::SendAppControlEvent() { void Browser::Launch(std::unique_ptr appcontrol) { launched_ = true; //To do:Implementation of relaunching of app + std::unique_ptr res = + resource_manager_->GetStartResource(appcontrol.get()); + if (res) + start_url_ = resource_manager_->GetLocalizedPath(res->uri()); + + NativeWindow *last_window = WindowList::GetLastWindow(); + if (last_window) + last_window->NotifyAppControl(); } -#if defined(OS_TIZEN) void Browser::SetSplashScreen() { auto appdata = common::ApplicationDataManager::GetCurrentAppData(); Evas_Object* window_ = elm_win_util_standard_add("", ""); diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 0e759e6..48365b8 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -16,12 +16,12 @@ #include "base/strings/string16.h" #include "base/values.h" #include "native_mate/arguments.h" +#if defined(OS_TIZEN) +#include "atom/browser/splash_screen.h" #include "tizen/common/app_control.h" #include "tizen/common/application_data.h" #include "tizen/common/resource_manager.h" #include "tizen/common/locale_manager.h" -#if defined(OS_TIZEN) -#include "atom/browser/splash_screen.h" #endif // defined(OS_TIZEN) @@ -98,7 +98,7 @@ class Browser : public WindowListObserver { // Set/Get the badge count. bool SetBadgeCount(int count); - bool launched() const { return launched_; } + int GetBadgeCount(); // Set/Get the login item settings of the app @@ -114,14 +114,16 @@ class Browser : public WindowListObserver { void SetLoginItemSettings(LoginItemSettings settings); LoginItemSettings GetLoginItemSettings(const LoginItemSettings& options); +#if defined(OS_TIZEN) void Hide(); void Show(); void AppControl(std::unique_ptr appcontrol); void Launch(std::unique_ptr appcontrol); void SendAppControlEvent(); -#if defined(OS_TIZEN) void SetSplashScreen(); void HideSplashScreen(int reason); + bool launched() const { return launched_; } + std::string StartURL() const { return start_url_;} #endif // defined(OS_TIZEN) #if defined(OS_MACOSX) @@ -263,6 +265,7 @@ class Browser : public WindowListObserver { std::unique_ptr resource_manager_; std::unique_ptr locale_manager_; std::unique_ptr splash_screen_; + std::string start_url_; bool launched_; bool is_electron_launch_; #endif diff --git a/atom/browser/browser_observer.h b/atom/browser/browser_observer.h index b5760ec..88a50a9 100644 --- a/atom/browser/browser_observer.h +++ b/atom/browser/browser_observer.h @@ -55,8 +55,6 @@ class BrowserObserver { // The browser's accessibility suppport has changed. virtual void OnAccessibilitySupportChanged() {} - virtual void OnSuspend() {} - virtual void OnResume() {} #if defined(OS_MACOSX) // The browser wants to resume a user activity via handoff. (macOS only) virtual void OnContinueUserActivity( diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 9e2c11a..4320eb8 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -605,6 +605,26 @@ void NativeWindow::NotifyWindowMessage( } #endif +#if defined(OS_TIZEN) +void NativeWindow::NotifySuspend() +{ + for (NativeWindowObserver& observer : observers_) + observer.OnSuspend(); +} + +void NativeWindow::NotifyResume() +{ + for (NativeWindowObserver& observer : observers_) + observer.OnResume(); +} + +void NativeWindow::NotifyAppControl() +{ + for (NativeWindowObserver& observer : observers_) + observer.OnAppControl(); +} +#endif + std::unique_ptr NativeWindow::DraggableRegionsToSkRegion( const std::vector& regions) { std::unique_ptr sk_region(new SkRegion); diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 654b68e..0e07787 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -248,6 +248,11 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowMessage(UINT message, WPARAM w_param, LPARAM l_param); #endif +#if defined(OS_TIZEN) + void NotifySuspend(); + void NotifyResume(); + void NotifyAppControl(); +#endif void AddObserver(NativeWindowObserver* obs) { observers_.AddObserver(obs); } diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index 8c908dc..96ac375 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -92,6 +92,13 @@ class NativeWindowObserver { // Called on Windows when App Commands arrive (WM_APPCOMMAND) virtual void OnExecuteWindowsCommand(const std::string& command_name) {} + +#if defined(OS_TIZEN) + // Tizen + virtual void OnSuspend() {} + virtual void OnResume() {} + virtual void OnAppControl() {} +#endif }; } // namespace atom diff --git a/tizen/common/resource_manager.cc b/tizen/common/resource_manager.cc index e177ab5..22fa8bf 100644 --- a/tizen/common/resource_manager.cc +++ b/tizen/common/resource_manager.cc @@ -258,6 +258,12 @@ std::unique_ptr ResourceManager::GetMatchedResource( std::unique_ptr ResourceManager::GetStartResource( const AppControl* app_control) { + + if (!app_control) { + LOGGER(ERROR) << "ERROR: No app control"; + return GetDefaultResource(); + } + std::string operation = app_control->operation(); if (operation.empty()) { LOGGER(ERROR) << "operation(mandatory) is NULL"; diff --git a/tizen/src/browser/api/wrt_api_core.cc b/tizen/src/browser/api/wrt_api_core.cc index c185cc9..5e1a0d5 100644 --- a/tizen/src/browser/api/wrt_api_core.cc +++ b/tizen/src/browser/api/wrt_api_core.cc @@ -31,16 +31,28 @@ std::string WebRuntime::GetMessage() const { } std::string WebRuntime::GetPath() const { + atom::Browser* browser_model = atom::Browser::Get(); + if (browser_model) { + std::string res = browser_model->StartURL(); + if (!res.empty()) { + LOG(ERROR) << "PWRT Start URL = " << res; + return res; + } + } + + // Fall back: This code must ideally not execute auto app_data = common::ApplicationDataManager::GetCurrentAppData(); if (!app_data) { return std::string(); } - std::string checkpath = app_data->content_info()->src(); - if (std::string::npos != checkpath.find("http")) { - return checkpath; - } - // TODO: Use resource-manager's GetStartResource() for localized urls + if (app_data->content_info()) { + std::string checkpath = app_data->content_info()->src(); + if (std::string::npos != checkpath.find("http")) { + LOG(ERROR) << "PWRT Start Url = " << checkpath; + return checkpath; + } + } base::FilePath path(app_data->application_path()); if (app_data->content_info()) { path = path.Append(app_data->content_info()->src()); @@ -48,6 +60,7 @@ std::string WebRuntime::GetPath() const { path = path.Append("index.html"); } std::string app_path = "file://" + path.value(); + LOG(ERROR) << "PWRT Start Url = " << app_path; return app_path; } diff --git a/tizen/src/wrt_main.cc b/tizen/src/wrt_main.cc index fc0320d..3bfb612 100644 --- a/tizen/src/wrt_main.cc +++ b/tizen/src/wrt_main.cc @@ -53,6 +53,9 @@ bool hasTizenPackageID(int argc, const char* const* argv) { if (0 == strncmp(argv[0], "/opt/usr/globalapps/", strlen("/opt/usr/globalapps/"))) { return true; } + if (0 == strncmp(argv[0], "/opt/usr/apps/", strlen("/opt/usr/apps/"))) { + return true; + } } return false; } diff --git a/wrt/src/web_window.js b/wrt/src/web_window.js index fe6c3b9..039b294 100644 --- a/wrt/src/web_window.js +++ b/wrt/src/web_window.js @@ -24,7 +24,6 @@ class WebWindow { this.handleEvents(winopt); this.appID = options.appID; webwindow_debug('this.appID ' + this.appID); - this.setUrl(options.path); } getBrowserWindowOption() { return { @@ -120,6 +119,10 @@ class WebWindow { webwindow_debug('WebWindow : app-on-resume'); events.emit(WAS_EVENT.WEBAPPLICATION.RESUME, 'web_window', self.mainWindow.id); }); + this.mainWindow.on('app-on-appcontrol', function() { + webwindow_debug('WebWindow : app-on-appcontrol'); + self.setUrl(''); + }); this.mainWindow.webContents.on('crashed', function() { webwindow_debug('WebWindow : webContents crashed'); self.webApplication.exit(100); @@ -219,6 +222,7 @@ class WebWindow { }); } setUrl(path) { + webwindow_debug('WebWindow : Set URL'); if (path && (path.trim() != '')) { this.mainWindow.loadURL(path); } else { -- 2.7.4 From 6c5feeaf9a4d32da96d6c117d6422527b9bef7bd Mon Sep 17 00:00:00 2001 From: "ws29.jung" Date: Fri, 22 Jun 2018 11:40:16 +0900 Subject: [PATCH 09/16] Enable Extension manager Now extensions can run if it is placed on right place. Change-Id: I1d39d1b01c7f10b41533b329d7ed6995df675345 Signed-off-by: ws29.jung --- atom/browser/api/atom_api_web_contents.cc | 2 +- lib/browser/chrome-extension.js | 14 +++++++------- lib/browser/init.js | 2 +- lib/renderer/content-scripts-injector.js | 5 +++++ wrt/src/extension_manager.js | 7 ++++--- wrt/src/runtime.js | 17 +++++++++++++++++ 6 files changed, 35 insertions(+), 12 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index a784f77..c7d8426 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -743,7 +743,7 @@ void WebContents::DidFailLoad(content::RenderFrameHost* render_frame_host, void WebContents::DidStartLoading() { #if defined(OS_TIZEN) - if (!owner_window()->IsVisible()) { + if (owner_window() && !owner_window()->IsVisible()) { std::string scheme = web_contents()->GetURL().scheme(); if (std::string::npos != scheme.find("http")) { owner_window()->Show(); diff --git a/lib/browser/chrome-extension.js b/lib/browser/chrome-extension.js index b9d61a0..f8a1715 100644 --- a/lib/browser/chrome-extension.js +++ b/lib/browser/chrome-extension.js @@ -1,7 +1,4 @@ const {app, ipcMain, webContents, BrowserWindow} = require('electron') -const {getAllWebContents} = process.atomBinding('web_contents') -const renderProcessPreferences = process.atomBinding('render_process_preferences').forAllWebContents() - const {Buffer} = require('buffer') const fs = require('fs') const path = require('path') @@ -121,7 +118,7 @@ const hookWebContentsEvents = function (webContents) { sendToBackgroundPages('CHROME_TABS_ONCREATED') - webContents.on('will-navigate', (event, url) => { + webContents.once('will-navigate', (event, url) => { sendToBackgroundPages('CHROME_WEBNAVIGATION_ONBEFORENAVIGATE', { frameId: 0, parentFrameId: -1, @@ -132,7 +129,7 @@ const hookWebContentsEvents = function (webContents) { }) }) - webContents.on('did-navigate', (event, url) => { + webContents.once('did-navigate', (event, url) => { sendToBackgroundPages('CHROME_WEBNAVIGATION_ONCOMPLETED', { frameId: 0, parentFrameId: -1, @@ -250,6 +247,7 @@ const injectContentScripts = function (manifest) { extensionId: manifest.extensionId, contentScripts: manifest.content_scripts.map(contentScriptToEntry) } + const renderProcessPreferences = process.atomBinding('render_process_preferences').forAllWebContents() contentScripts[manifest.name] = renderProcessPreferences.addEntry(entry) } catch (e) { console.error('Failed to read content scripts', e) @@ -259,6 +257,7 @@ const injectContentScripts = function (manifest) { const removeContentScripts = function (manifest) { if (!contentScripts[manifest.name]) return + const renderProcessPreferences = process.atomBinding('render_process_preferences').forAllWebContents() renderProcessPreferences.removeEntry(contentScripts[manifest.name]) delete contentScripts[manifest.name] } @@ -293,7 +292,7 @@ app.on('web-contents-created', function (event, webContents) { if (!isWindowOrWebView(webContents)) return hookWebContentsEvents(webContents) - webContents.on('devtools-opened', function () { + webContents.once('devtools-opened', function () { loadDevToolsExtensions(webContents, objectValues(manifestMap)) }) }) @@ -374,6 +373,7 @@ app.once('ready', function () { const manifest = getManifestFromPath(srcDirectory) if (manifest) { loadExtension(manifest) + const {getAllWebContents} = process.atomBinding('web_contents') for (const webContents of getAllWebContents()) { if (isWindowOrWebView(webContents)) { loadDevToolsExtensions(webContents, [manifest]) @@ -430,7 +430,7 @@ app.once('ready', function () { if (!manifest) return const page = backgroundPages[manifest.extensionId] if (!page) return - page.webContents.sendToAll(`CHROME_PAGEACTION_ONCLICKED_${manifest.extensionId}`, webContents.Id); + page.webContents.sendToAll(`CHROME_PAGEACTION_ONCLICKED_${manifest.extensionId}`, webContents.Id); } }) diff --git a/lib/browser/init.js b/lib/browser/init.js index cfcf26f..39be413 100644 --- a/lib/browser/init.js +++ b/lib/browser/init.js @@ -156,7 +156,7 @@ app.setAppPath(packagePath) // Load the chrome extension support. // FIXME: When prelaunch, initializing electron modules // in chrome-extension cause segmentation fault. -//require('./chrome-extension') +require('./chrome-extension') // Load internal desktop-capturer module. // FIXME: This is guard for bringup. diff --git a/lib/renderer/content-scripts-injector.js b/lib/renderer/content-scripts-injector.js index 124fd58..b0401cc 100644 --- a/lib/renderer/content-scripts-injector.js +++ b/lib/renderer/content-scripts-injector.js @@ -3,6 +3,7 @@ const {runInThisContext} = require('vm') // Check whether pattern matches. // https://developer.chrome.com/extensions/match_patterns +let firstInject = true const matchesPattern = function (pattern) { if (pattern === '') return true @@ -13,6 +14,8 @@ const matchesPattern = function (pattern) { // Run the code with chrome API integrated. const runContentScript = function (extensionId, url, code) { const context = {} + const fire = runContentScript.bind(window, extensionId, url, code) + document.removeEventListener('DOMContentLoaded', fire) require('./chrome-api').injectTo(extensionId, false, context) const wrapper = `(function (chrome) {\n ${code}\n })` const compiledWrapper = runInThisContext(wrapper, { @@ -63,6 +66,7 @@ ipcRenderer.on('CHROME_TABS_EXECUTESCRIPT', function (event, senderWebContentsId // Read the renderer process preferences. const preferences = process.getRenderProcessPreferences() if (preferences) { + if (!firstInject) return for (const pref of preferences) { if (pref.contentScripts) { for (const script of pref.contentScripts) { @@ -70,4 +74,5 @@ if (preferences) { } } } + firstInject = false; } diff --git a/wrt/src/extension_manager.js b/wrt/src/extension_manager.js index 1b9b965..2c51b85 100755 --- a/wrt/src/extension_manager.js +++ b/wrt/src/extension_manager.js @@ -12,9 +12,9 @@ const {BrowserWindow} = require('electron'); var EXTENSIONS_PATH = process.env.WAS_EXTENSIONS_PATH; if (!EXTENSIONS_PATH) { - var resourcePath = __dirname.split('app.asar')[0]; + var resourcePath = __dirname.split('wrt')[0]; extension_debug('WARNING! WAS_EXTENSIONS_PATH not set - extensions cannot be loaded'); - EXTENSIONS_PATH = path.join(resourcePath, 'runtime_addon'); + EXTENSIONS_PATH = path.join(resourcePath, 'electron/runtime_addon'); extension_debug('Temporarily set WAS_EXTENSIONS_PATH=' + EXTENSIONS_PATH); } @@ -256,8 +256,9 @@ class ExtensionManager { else extension_debug('extension.activate not defined!'); } else if (this.extensions_[T_CRX] !== undefined && this.extensions_[T_CRX][name] !== undefined) { extension_path = this.extensions_[T_CRX][name]; - extension_debug('activate 22: ' + extension_path + ' name:' + name); + extension_debug('activate 2: ' + extension_path + ' name:' + name); try { + extension_debug('BrowserWindow.addExtension: ' + extension_path); BrowserWindow.addExtension(extension_path); } catch (e) { extension_debug('activate - error on addExtension() : ' + e); diff --git a/wrt/src/runtime.js b/wrt/src/runtime.js index 4bcc1f8..55b5c27 100755 --- a/wrt/src/runtime.js +++ b/wrt/src/runtime.js @@ -184,6 +184,23 @@ class Runtime { runtime_debug('handleIpcMessages: DEACTIVATE ' + name); return this.extensionManager.deactivate(app, name); }); + ipcMain.on(IPC_MESSAGE.EXTENSIONS.INSTALLED, (sender, name) => { + runtime_debug('handleIpcMessages: INSTALLED ' + name); + this.extensionManager.build(); + return this.extensionManager.activate(app, name); + }); + ipcMain.on(IPC_MESSAGE.EXTENSIONS.UNINSTALLED, (sender, name) => { + runtime_debug('handleIpcMessages: UNINSTALLED ' + name); + return this.extensionManager.deactivate(app, name); + }); + ipcMain.on(IPC_MESSAGE.EXTENSIONS.ACTIVATE, (sender, name) => { + runtime_debug('handleIpcMessages: ACTIVATE ' + name); + return this.extensionManager.activate(app, name); + }); + ipcMain.on(IPC_MESSAGE.EXTENSIONS.DEACTIVATE, (sender, name) => { + runtime_debug('handleIpcMessages: DEACTIVATE ' + name); + return this.extensionManager.deactivate(app, name); + }); } } module.exports = Runtime; -- 2.7.4 From fa0541c9fdef27d800843c0136a49fbaa75ce212 Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Thu, 28 Jun 2018 14:51:49 +0530 Subject: [PATCH 10/16] Fixed the usage of |this| variable in async event handlers callbacks Updated the usage of |this| variables usage in asynchronous functions Change-Id: I3a5e8ef13be84369d538f72002737307f1f02ff3 Signed-off-by: surya.kumar7 --- wrt/src/runtime.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/wrt/src/runtime.js b/wrt/src/runtime.js index 55b5c27..4d34751 100755 --- a/wrt/src/runtime.js +++ b/wrt/src/runtime.js @@ -29,7 +29,7 @@ class Runtime { }); app.on('will-quit', function(event) { runtime_debug('will-quit'); - this.extensionManager.deactivateAll(app); + _this.extensionManager.deactivateAll(app); return _this.killAllProcesses(); }); app.on('quit', function(event) { @@ -65,15 +65,15 @@ class Runtime { }); app.on('ready', function(event) { runtime_debug('ready'); - this.extensionManager = new ExtensionManager(EXTENSIONS_PATH); + _this.extensionManager = new ExtensionManager(EXTENSIONS_PATH); if (!options.noExtensions) { - this.extensionManager.build(); + _this.extensionManager.build(); } - this.extensionManager.activateAll(app); + _this.extensionManager.activateAll(app); if (wrt.isElectronLaunch()) { return; } - this.webApplication = new WebApplication(options); + _this.webApplication = new WebApplication(options); }); } onPause(web_window_id) { @@ -169,37 +169,37 @@ class Runtime { }); ipcMain.on(IPC_MESSAGE.EXTENSIONS.INSTALLED, (sender, name) => { runtime_debug('handleIpcMessages: INSTALLED ' + name); - this.extensionManager.build(); - return this.extensionManager.activate(app, name); + _this.extensionManager.build(); + return _this.extensionManager.activate(app, name); }); ipcMain.on(IPC_MESSAGE.EXTENSIONS.UNINSTALLED, (sender, name) => { runtime_debug('handleIpcMessages: UNINSTALLED ' + name); - return this.extensionManager.deactivate(app, name); + return _this.extensionManager.deactivate(app, name); }); ipcMain.on(IPC_MESSAGE.EXTENSIONS.ACTIVATE, (sender, name) => { runtime_debug('handleIpcMessages: ACTIVATE ' + name); - return this.extensionManager.activate(app, name); + return _this.extensionManager.activate(app, name); }); ipcMain.on(IPC_MESSAGE.EXTENSIONS.DEACTIVATE, (sender, name) => { runtime_debug('handleIpcMessages: DEACTIVATE ' + name); - return this.extensionManager.deactivate(app, name); + return _this.extensionManager.deactivate(app, name); }); ipcMain.on(IPC_MESSAGE.EXTENSIONS.INSTALLED, (sender, name) => { runtime_debug('handleIpcMessages: INSTALLED ' + name); - this.extensionManager.build(); - return this.extensionManager.activate(app, name); + _this.extensionManager.build(); + return _this.extensionManager.activate(app, name); }); ipcMain.on(IPC_MESSAGE.EXTENSIONS.UNINSTALLED, (sender, name) => { runtime_debug('handleIpcMessages: UNINSTALLED ' + name); - return this.extensionManager.deactivate(app, name); + return _this.extensionManager.deactivate(app, name); }); ipcMain.on(IPC_MESSAGE.EXTENSIONS.ACTIVATE, (sender, name) => { runtime_debug('handleIpcMessages: ACTIVATE ' + name); - return this.extensionManager.activate(app, name); + return _this.extensionManager.activate(app, name); }); ipcMain.on(IPC_MESSAGE.EXTENSIONS.DEACTIVATE, (sender, name) => { runtime_debug('handleIpcMessages: DEACTIVATE ' + name); - return this.extensionManager.deactivate(app, name); + return _this.extensionManager.deactivate(app, name); }); } } -- 2.7.4 From 83be54d713e3d741c63750c4cecd720e2752248d Mon Sep 17 00:00:00 2001 From: SangYong Park Date: Fri, 29 Jun 2018 13:41:41 +0900 Subject: [PATCH 11/16] Fix extension cleanup issue Exception is occured when extension cleanup by web device api. (exit()) because, before-quit event did not occur. Change-Id: Iea468e56347ab14459fa5b4b4b6e21ac64ba8371 Signed-off-by: SangYong Park --- atom/browser/api/atom_api_web_contents.cc | 3 +-- wrt/src/main.js | 7 +++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index c7d8426..7e3e176 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -938,8 +938,7 @@ void WebContents::HandleWrtPluginMessage(Ewk_Wrt_Message_Data* msg) { Eina_Stringshare* msg_ref_id = msg->GetReferenceId(); Eina_Stringshare* msg_value = msg->GetValue(); if (TYPE_IS("tizen://exit")) { - atom::Browser *browser_model = atom::Browser::Get(); - browser_model->Shutdown(); + atom::Browser::Get()->Quit(); } eina_stringshare_del(msg_ref_id); diff --git a/wrt/src/main.js b/wrt/src/main.js index e1ee03f..b84ef59 100644 --- a/wrt/src/main.js +++ b/wrt/src/main.js @@ -14,6 +14,13 @@ const yargs = require('yargs'); process.env.DEBUG = originalDebug; } +process.on('uncaughtException', function (error) { + // Do nothing if the user has a custom uncaught exception handler. + var ref, stack + stack = (ref = error.stack) != null ? ref : error.name + ': ' + error.message + console.error('A JavaScript error occurred in the main process\n' + stack) +}) + let parseCommandLine = function() { let options = yargs(process.argv.slice(1)).wrap(80); options.usage('WebRuntime'); -- 2.7.4 From 0eda159e45914f690a6f82dff509ecc162d3e793 Mon Sep 17 00:00:00 2001 From: SangYong Park Date: Mon, 2 Jul 2018 20:11:40 +0900 Subject: [PATCH 12/16] Block to work add-on in settings app add-on settings app should work properly without add-on's interference. Change-Id: Ic284835cd929374708c8c58b49764339d59bb9a5 Signed-off-by: SangYong Park --- tizen/src/browser/api/wrt_api_core.cc | 6 ++++++ tizen/src/browser/api/wrt_api_core.h | 1 + wrt/src/runtime.js | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tizen/src/browser/api/wrt_api_core.cc b/tizen/src/browser/api/wrt_api_core.cc index 5e1a0d5..c171f64 100644 --- a/tizen/src/browser/api/wrt_api_core.cc +++ b/tizen/src/browser/api/wrt_api_core.cc @@ -26,6 +26,11 @@ WebRuntime::~WebRuntime() { instance_ = nullptr; } +std::string WebRuntime::AppID() const { + auto app_data = common::ApplicationDataManager::GetCurrentAppData(); + return app_data->app_id(); +} + std::string WebRuntime::GetMessage() const { return "message from C++"; } @@ -111,6 +116,7 @@ void WebRuntime::BuildPrototype( prototype->SetClassName(mate::StringToV8(isolate, "WRT")); // TODO: Needs adding necessary interface methods mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) + .SetProperty("appID", &WebRuntime::AppID) .SetMethod("getMessage", &WebRuntime::GetMessage) .SetMethod("getPath", &WebRuntime::GetPath) .SetMethod("isTizenWebApp", &WebRuntime::isTizenWebApp) diff --git a/tizen/src/browser/api/wrt_api_core.h b/tizen/src/browser/api/wrt_api_core.h index 6c27987..99eb3c0 100644 --- a/tizen/src/browser/api/wrt_api_core.h +++ b/tizen/src/browser/api/wrt_api_core.h @@ -22,6 +22,7 @@ class WebRuntime : public mate::EventEmitter { ~WebRuntime() override; private: + std::string AppID() const; std::string GetMessage() const; std::string GetPath() const; bool isTizenWebApp() const; diff --git a/wrt/src/runtime.js b/wrt/src/runtime.js index 4d34751..d0e5460 100755 --- a/wrt/src/runtime.js +++ b/wrt/src/runtime.js @@ -66,7 +66,7 @@ class Runtime { app.on('ready', function(event) { runtime_debug('ready'); _this.extensionManager = new ExtensionManager(EXTENSIONS_PATH); - if (!options.noExtensions) { + if (!options.noExtensions && wrt.appID !== 'NVPDzvckj9.RuntimeAddonSetting') { _this.extensionManager.build(); } _this.extensionManager.activateAll(app); -- 2.7.4 From 6e80936f617d1e571ced94751ab6e1008bc4df7c Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Wed, 20 Jun 2018 22:57:22 +0530 Subject: [PATCH 13/16] Implementation of Appcontrol functionalities Added a few functionalities performed during AppControl in crosswalk-tizen 1. Added CSP support 2. Added Long polling support 3. Added TizenBrowserParts class to remove bloating atom's Browser Change-Id: Ifc2d40aa011beee881adf55cbfaca30e78df9bf7 Signed-off-by: surya.kumar7 --- atom/browser/api/atom_api_web_contents.cc | 10 ++++ atom/browser/api/atom_api_web_contents.h | 2 + atom/browser/browser.cc | 7 --- atom/browser/browser.h | 11 ++--- atom/common/api/api_messages.h | 8 ++++ atom/renderer/atom_render_view_observer.cc | 31 ++++++++++++ atom/renderer/atom_render_view_observer.h | 3 ++ tizen/browser/tizen_browser_parts.cc | 75 ++++++++++++++++++++++++++++++ tizen/browser/tizen_browser_parts.h | 54 +++++++++++++++++++++ wrt.gyp | 2 + 10 files changed, 190 insertions(+), 13 deletions(-) create mode 100644 tizen/browser/tizen_browser_parts.cc create mode 100644 tizen/browser/tizen_browser_parts.h diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 7e3e176..43b1940 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -685,6 +685,7 @@ void WebContents::RenderViewCreated(content::RenderViewHost* render_view_host) { render_view_host->GetRoutingID()); if (impl) impl->disable_hidden_ = !background_throttling_; + atom::Browser::Get()->RenderViewCreated(render_view_host); } void WebContents::RenderViewDeleted(content::RenderViewHost* render_view_host) { @@ -954,6 +955,7 @@ void WebContents::HandleWrtPluginMessage(Ewk_Wrt_Message_Data* msg) { bool WebContents::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(WebContents, message) + IPC_MESSAGE_HANDLER_DELAY_REPLY(WrtViewMsg_GetCSP, OnGetContentSecurityPolicy) IPC_MESSAGE_HANDLER(AtomViewHostMsg_Message, OnRendererMessage) IPC_MESSAGE_HANDLER_DELAY_REPLY(AtomViewHostMsg_Message_Sync, OnRendererMessageSync) @@ -1701,6 +1703,14 @@ void WebContents::OnGetZoomLevel(IPC::Message* reply_msg) { Send(reply_msg); } +void WebContents::OnGetContentSecurityPolicy(IPC::Message* reply_msg) { + std::string csp_rule; + std::string csp_report_rule; + atom::Browser::Get()->GetCSP(csp_rule, csp_report_rule); + WrtViewMsg_GetCSP::WriteReplyParams(reply_msg, csp_rule, csp_report_rule); + Send(reply_msg); +} + v8::Local WebContents::GetWebPreferences(v8::Isolate* isolate) { WebContentsPreferences* web_preferences = WebContentsPreferences::FromWebContents(web_contents()); diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index ef1578c..6d50694 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -387,6 +387,8 @@ class WebContents : public mate::TrackableObject, // get the zoom level. void OnGetZoomLevel(IPC::Message* reply_msg); + void OnGetContentSecurityPolicy(IPC::Message* reply_msg); + v8::Global session_; v8::Global devtools_web_contents_; v8::Global debugger_; diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index aca2f68..dcfc6bc 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -30,7 +30,6 @@ namespace atom { Browser::Browser() : is_quiting_(false), #if defined(OS_TIZEN) - locale_manager_(new common::LocaleManager()), launched_(false), is_electron_launch_(false), #endif @@ -275,12 +274,6 @@ void Browser::Show() { last_window->NotifyResume(); } -void Browser::Initialize() { - auto appdata = common::ApplicationDataManager::GetCurrentAppData(); - resource_manager_.reset(new common::ResourceManager(appdata, locale_manager_.get())); - resource_manager_->set_base_resource_path(appdata->application_path()); -} - void Browser::AppControl(std::unique_ptr appcontrol) { std::unique_ptr res = resource_manager_->GetStartResource(appcontrol.get()); diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 48365b8..358bcb9 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -18,6 +18,7 @@ #include "native_mate/arguments.h" #if defined(OS_TIZEN) #include "atom/browser/splash_screen.h" +#include "tizen/browser/tizen_browser_parts.h" #include "tizen/common/app_control.h" #include "tizen/common/application_data.h" #include "tizen/common/resource_manager.h" @@ -43,14 +44,14 @@ class AtomMenuModel; class LoginHandler; // This class is used for control application-wide operations. -class Browser : public WindowListObserver { +class Browser : public WindowListObserver, + public tizen::TizenBrowserParts { public: Browser(); ~Browser(); static Browser* Get(); - void Initialize(); // Try to close all windows and quit the application. void Quit(); @@ -117,8 +118,8 @@ class Browser : public WindowListObserver { #if defined(OS_TIZEN) void Hide(); void Show(); - void AppControl(std::unique_ptr appcontrol); - void Launch(std::unique_ptr appcontrol); + void AppControl(std::unique_ptr appcontrol) override; + void Launch(std::unique_ptr appcontrol) override; void SendAppControlEvent(); void SetSplashScreen(); void HideSplashScreen(int reason); @@ -262,8 +263,6 @@ class Browser : public WindowListObserver { base::ObserverList observers_; #if defined(OS_TIZEN) - std::unique_ptr resource_manager_; - std::unique_ptr locale_manager_; std::unique_ptr splash_screen_; std::string start_url_; bool launched_; diff --git a/atom/common/api/api_messages.h b/atom/common/api/api_messages.h index 5052c40..44e8ad6 100644 --- a/atom/common/api/api_messages.h +++ b/atom/common/api/api_messages.h @@ -64,3 +64,11 @@ IPC_MESSAGE_ROUTED1(AtomHostMsg_WrtMessage, IPC_SYNC_MESSAGE_ROUTED1_1(AtomHostMsg_WrtSyncMessage, Ewk_Wrt_Message_Data /* data */, std::string /*result*/) + +// Wrt related messages +IPC_SYNC_MESSAGE_ROUTED0_2(WrtViewMsg_GetCSP, + std::string, + std::string) + +IPC_MESSAGE_ROUTED1(WrtViewMsg_SetLongPolling, + unsigned long) \ No newline at end of file diff --git a/atom/renderer/atom_render_view_observer.cc b/atom/renderer/atom_render_view_observer.cc index a68238b..8923fdf 100644 --- a/atom/renderer/atom_render_view_observer.cc +++ b/atom/renderer/atom_render_view_observer.cc @@ -23,6 +23,7 @@ #include "native_mate/dictionary.h" #include "net/base/net_module.h" #include "net/grit/net_resources.h" +#include "third_party/WebKit/public/web/WebContentSecurityPolicy.h" #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebDraggableRegion.h" #include "third_party/WebKit/public/web/WebFrame.h" @@ -116,6 +117,7 @@ void AtomRenderViewObserver::EmitIPCEvent(blink::WebFrame* frame, void AtomRenderViewObserver::DidCreateDocumentElement( blink::WebLocalFrame* frame) { document_created_ = true; + SetContentSecurityPolicy(frame); } void AtomRenderViewObserver::DraggableRegionsChanged(blink::WebFrame* frame) { @@ -136,6 +138,7 @@ bool AtomRenderViewObserver::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(AtomRenderViewObserver, message) IPC_MESSAGE_HANDLER(AtomViewMsg_Message, OnBrowserMessage) + IPC_MESSAGE_HANDLER(WrtViewMsg_SetLongPolling, OnSetLongPolling) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() @@ -169,4 +172,32 @@ void AtomRenderViewObserver::OnBrowserMessage(bool send_to_all, } } +void AtomRenderViewObserver::SetContentSecurityPolicy(blink::WebLocalFrame* frame) { + std::string csp_rule; + std::string csp_report_rule; + Send(new WrtViewMsg_GetCSP(render_view()->GetRoutingID(), &csp_rule, &csp_report_rule)); + + if (!csp_rule.empty()) { + frame->document().setContentSecurityPolicyUsingHeader( + blink::WebString::fromUTF8(csp_rule), + blink::WebContentSecurityPolicyType::WebContentSecurityPolicyTypeEnforce); + } + + if (!csp_report_rule.empty()) { + frame->document().setContentSecurityPolicyUsingHeader( + blink::WebString::fromUTF8(csp_report_rule), + blink::WebContentSecurityPolicyType::WebContentSecurityPolicyTypeReport); + } +} + +void AtomRenderViewObserver::OnSetLongPolling(unsigned long timeout) { + if (!document_created_) + return; + + blink::WebView* view = render_view()->GetWebView(); + if (!view) + return; + view->setLongPollingGlobalTimeout(timeout); +} + } // namespace atom diff --git a/atom/renderer/atom_render_view_observer.h b/atom/renderer/atom_render_view_observer.h index e642bbe..cd69e2a 100644 --- a/atom/renderer/atom_render_view_observer.h +++ b/atom/renderer/atom_render_view_observer.h @@ -40,6 +40,9 @@ class AtomRenderViewObserver : public content::RenderViewObserver { const base::string16& channel, const base::ListValue& args); + void SetContentSecurityPolicy(blink::WebLocalFrame* frame); + void OnSetLongPolling(unsigned long); + AtomRendererClient* renderer_client_; // Whether the document object has been created. diff --git a/tizen/browser/tizen_browser_parts.cc b/tizen/browser/tizen_browser_parts.cc new file mode 100644 index 0000000..231a9b3 --- /dev/null +++ b/tizen/browser/tizen_browser_parts.cc @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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. + */ + +#include "atom/common/api/api_messages.h" +#include "base/logging.h" +#include "tizen/browser/tizen_browser_parts.h" + +namespace tizen { + +namespace { + +const char* kDefaultCSPRule = + "default-src *; script-src 'self'; style-src 'self'; object-src 'none';"; + +} // namespace + +TizenBrowserParts::TizenBrowserParts() + : locale_manager_(new common::LocaleManager()) { +} + +void TizenBrowserParts::Initialize() { + app_data_ = common::ApplicationDataManager::GetCurrentAppData(); + resource_manager_.reset(new common::ResourceManager(app_data_, locale_manager_.get())); + resource_manager_->set_base_resource_path(app_data_->application_path()); + + if (app_data_->csp_info() != NULL || app_data_->csp_report_info() != NULL || + app_data_->allowed_navigation_info() != NULL) { + security_model_version_ = 2; + if (app_data_->csp_info() == NULL || + app_data_->csp_info()->security_rules().empty()) { + csp_rule_ = kDefaultCSPRule; + } else { + csp_rule_ = app_data_->csp_info()->security_rules(); + } + if (app_data_->csp_report_info() != NULL && + !app_data_->csp_report_info()->security_rules().empty()) { + csp_report_rule_ = app_data_->csp_report_info()->security_rules(); + } + } else { + security_model_version_ = 1; + } +} + +void TizenBrowserParts::GetCSP(std::string &csp_rule, std::string &csp_report_rule) { + csp_rule = csp_rule_; + csp_report_rule = csp_report_rule_; +} + +void TizenBrowserParts::SetLongPollingTimeout(content::RenderViewHost* rvh) { + if (app_data_->setting_info() != NULL && + app_data_->setting_info()->long_polling()) { + boost::optional polling_val(app_data_->setting_info()->long_polling()); + unsigned long *ptr = reinterpret_cast (&polling_val.get()); + rvh->Send(new WrtViewMsg_SetLongPolling(rvh->GetRoutingID(), *ptr)); + } +} + +void TizenBrowserParts::RenderViewCreated(content::RenderViewHost* render_view_host) { + SetLongPollingTimeout(render_view_host); +} + +} \ No newline at end of file diff --git a/tizen/browser/tizen_browser_parts.h b/tizen/browser/tizen_browser_parts.h new file mode 100644 index 0000000..4f6d552 --- /dev/null +++ b/tizen/browser/tizen_browser_parts.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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. + */ + +#ifndef TIZEN_BROWSER_TIZEN_BROWSER_PARTS_H_ +#define TIZEN_BROWSER_TIZEN_BROWSER_PARTS_H_ + +#include "content/public/browser/render_view_host.h" +#include "tizen/common/app_control.h" +#include "tizen/common/application_data.h" +#include "tizen/common/resource_manager.h" +#include "tizen/common/locale_manager.h" + +namespace tizen { + +class TizenBrowserParts { + public: + TizenBrowserParts(); + virtual void AppControl(std::unique_ptr appcontrol) = 0; + virtual void Launch(std::unique_ptr appcontrol) = 0; + virtual bool launched() const = 0; + void RenderViewCreated(content::RenderViewHost* render_view_host); + void GetCSP(std::string &csp_rule, std::string &csp_report_rule); + void Initialize(); + + protected: + std::unique_ptr locale_manager_; + std::unique_ptr resource_manager_; + virtual ~TizenBrowserParts() {} + + private: + void SetLongPollingTimeout(content::RenderViewHost* render_view_host); + + common::ApplicationData* app_data_; + int security_model_version_; + std::string csp_rule_; + std::string csp_report_rule_; +}; + +} // namespace tizen + +#endif // TIZEN_BROWSER_TIZEN_BROWSER_PARTS_H_ \ No newline at end of file diff --git a/wrt.gyp b/wrt.gyp index 32f0a97..2410d1c 100644 --- a/wrt.gyp +++ b/wrt.gyp @@ -122,6 +122,8 @@ 'tizen/src/browser/wrt_ipc.h', 'tizen/src/browser/wrt_service.cc', 'tizen/src/browser/wrt_service.h', + 'tizen/browser/tizen_browser_parts.cc', + 'tizen/browser/tizen_browser_parts.h', ], 'sources/': [ # chromium-efl supports only tizen webrtc using CAPI -- 2.7.4 From 148341ec7f61682ce7db735546e02ff1a1375f7b Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Thu, 5 Jul 2018 15:55:23 +0530 Subject: [PATCH 14/16] fixup! Implementation of Appcontrol functionalities Sometimes RenderViews are created much before app_data's Initialize() was called Moved Initialize() to resemble crosswalk's sequence Change-Id: Icb765754253871b3f010d4e9877e798d101aa147 Signed-off-by: surya.kumar7 --- atom/app/ui_runtime.cc | 2 +- tizen/browser/tizen_browser_parts.cc | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/atom/app/ui_runtime.cc b/atom/app/ui_runtime.cc index 9bde160..b38b7ed 100644 --- a/atom/app/ui_runtime.cc +++ b/atom/app/ui_runtime.cc @@ -56,6 +56,7 @@ void UiRuntime::SetParam(content::ContentMainParams *params) { bool UiRuntime::OnCreate() { auto appdata = common::ApplicationDataManager::GetCurrentAppData(); + atom::Browser::Get()->Initialize(); if(appdata->splash_screen_info()){ atom::Browser* browser_model = atom::Browser::Get(); browser_model->SetSplashScreen(); @@ -91,7 +92,6 @@ void UiRuntime::OnAppControl(app_control_h app_control) { if (browser_model->launched()) { browser_model->AppControl(std::move(appcontrol)); } else { - browser_model->Initialize(); browser_model->Launch(std::move(appcontrol)); } } diff --git a/tizen/browser/tizen_browser_parts.cc b/tizen/browser/tizen_browser_parts.cc index 231a9b3..d037cfc 100644 --- a/tizen/browser/tizen_browser_parts.cc +++ b/tizen/browser/tizen_browser_parts.cc @@ -37,7 +37,7 @@ void TizenBrowserParts::Initialize() { resource_manager_->set_base_resource_path(app_data_->application_path()); if (app_data_->csp_info() != NULL || app_data_->csp_report_info() != NULL || - app_data_->allowed_navigation_info() != NULL) { + app_data_->allowed_navigation_info() != NULL) { security_model_version_ = 2; if (app_data_->csp_info() == NULL || app_data_->csp_info()->security_rules().empty()) { @@ -60,9 +60,10 @@ void TizenBrowserParts::GetCSP(std::string &csp_rule, std::string &csp_report_ru } void TizenBrowserParts::SetLongPollingTimeout(content::RenderViewHost* rvh) { - if (app_data_->setting_info() != NULL && - app_data_->setting_info()->long_polling()) { - boost::optional polling_val(app_data_->setting_info()->long_polling()); + auto setting = app_data_->setting_info(); + if (setting.get() != NULL && + setting->long_polling()) { + boost::optional polling_val(setting->long_polling()); unsigned long *ptr = reinterpret_cast (&polling_val.get()); rvh->Send(new WrtViewMsg_SetLongPolling(rvh->GetRoutingID(), *ptr)); } -- 2.7.4 From 2c60a0f040cd16a77c6922b48e388e4927abc976 Mon Sep 17 00:00:00 2001 From: "min7.choi" Date: Tue, 10 Jul 2018 20:13:11 +0900 Subject: [PATCH 15/16] Update gbs.conf file Fixed build repo Change-Id: I3cc48e8795c0fe9ce71dd49c562ba821e123bad1 Signed-off-by: min7.choi --- efl/build/gbs.conf | 4 ++-- tizen/script/gbs.conf | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/efl/build/gbs.conf b/efl/build/gbs.conf index 65ecab6..4447e01 100755 --- a/efl/build/gbs.conf +++ b/efl/build/gbs.conf @@ -54,7 +54,7 @@ user = blinkbot passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== [repo.electron_armv7l] -url = http://10.113.138.88/tizenrepo/electron_repo/armv7l/ +url = http://10.113.138.88/tizenrepo/electron_repo/tizen_4.0_standard_armv7l/ ############################################### # @@ -189,7 +189,7 @@ url = http://168.219.244.109/tizen-rsa/tizen-4.0-base-main2018/standard/latest/r url = http://168.219.244.109/products/tv/archive/2018/MAIN2018/KantM/latest/repos/product/armv7l/packages/ [repo.electron_tv] -url = http://10.113.138.88/tizenrepo/electron_repo/tv/ +url = http://10.113.138.88/tizenrepo/electron_repo/tizen_4.0_kantm/ ############################################### # diff --git a/tizen/script/gbs.conf b/tizen/script/gbs.conf index 2a16e4b..ead5691 100755 --- a/tizen/script/gbs.conf +++ b/tizen/script/gbs.conf @@ -54,7 +54,8 @@ user = blinkbot passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== [repo.electron_armv7l] -url = http://10.113.138.88/tizenrepo/electron_repo/armv7l/ +url = http://10.113.138.88/tizenrepo/electron_repo/tizen_4.0_standard_armv7l/ + ############################################### # @@ -189,4 +190,4 @@ url = http://168.219.244.109/tizen-rsa/tizen-4.0-base-main2018/standard/latest/r url = http://168.219.244.109/products/tv/archive/2018/MAIN2018/KantM/latest/repos/product/armv7l/packages/ [repo.electron_tv] -url = http://10.113.138.88/tizenrepo/electron_repo/tv/ +url = http://10.113.138.88/tizenrepo/electron_repo/tizen_4.0_kantm/ -- 2.7.4 From 1681c420e461342e1e921428bdc8728de12c7b1a Mon Sep 17 00:00:00 2001 From: "ws29.jung" Date: Wed, 11 Jul 2018 11:01:14 +0900 Subject: [PATCH 16/16] Check Injected Bundle inject status Before this patch, Injected Bundle was injected everytime when BrowserContext is constructed. BrowserContext can be constructed multiple time with webapp but Bundle Injection should be done only at the first time. With this patch, Injection will be done only once. Change-Id: Ia7fc7e0e896cca749182ead287829f99118b03b2 Signed-off-by: ws29.jung --- vendor/brightray/browser/browser_context.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/vendor/brightray/browser/browser_context.cc b/vendor/brightray/browser/browser_context.cc index 2f709bb..95530bf 100644 --- a/vendor/brightray/browser/browser_context.cc +++ b/vendor/brightray/browser/browser_context.cc @@ -84,6 +84,7 @@ class BrowserContext::ResourceContext : public content::ResourceContext { }; // static +bool did_bundle_injected = false; BrowserContext::BrowserContextMap BrowserContext::browser_context_map_; // static @@ -144,8 +145,11 @@ BrowserContext::BrowserContext(const std::string& partition, bool in_memory) #endif //content::ZygoteHandle *handle = content::GetGenericZygote(); //*handle->LoadInjectedBundlePath(injected_bundle_path); - (*content::GetGenericZygote())-> - LoadInjectedBundlePath(injected_bundle_path); + if (!did_bundle_injected) { + (*content::GetGenericZygote())-> + LoadInjectedBundlePath(injected_bundle_path); + did_bundle_injected = true; + } #if defined(OS_TIZEN) } #endif -- 2.7.4