From 16b5d8ccddca0d91fe308eb1a803b9cb41fafc2f Mon Sep 17 00:00:00 2001 From: Prathmesh Date: Tue, 19 Jun 2018 16:32:52 +0530 Subject: [PATCH 01/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 02/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 03/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 04/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 05/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 06/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 07/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 08/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 09/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 10/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 11/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 From f95603be440503ae853f0daa92f1bb6c36348207 Mon Sep 17 00:00:00 2001 From: deepti Date: Wed, 11 Jul 2018 16:09:49 +0530 Subject: [PATCH 12/16] Implementation of Resume and Suspend function. Created IPC for Resume and Suspend operation to reach at Chromium level. Change-Id: I2a38c77f225b102da14607b3a5dde787c78e697a Signed-off-by: deepti --- atom/browser/browser.cc | 18 ++++++++++++++---- atom/common/api/api_messages.h | 7 ++++++- atom/renderer/atom_render_view_observer.cc | 20 ++++++++++++++++++++ atom/renderer/atom_render_view_observer.h | 3 ++- tizen/browser/tizen_browser_parts.cc | 16 +++++++++++++++- tizen/browser/tizen_browser_parts.h | 4 +++- 6 files changed, 60 insertions(+), 8 deletions(-) diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index dcfc6bc..0cd2e39 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -18,6 +18,8 @@ #include "base/threading/thread_task_runner_handle.h" #include "brightray/browser/brightray_paths.h" #include "content/public/browser/render_frame_host.h" +#include "content/public/browser/render_view_host.h" + #if defined(OS_TIZEN) #include "tizen/common/command_line.h" #include "tizen/common/application_data.h" @@ -264,14 +266,22 @@ void Browser::OnWindowAllClosed() { #if defined(OS_TIZEN) void Browser::Hide() { NativeWindow *last_window = WindowList::GetLastWindow(); - if (last_window) - last_window->NotifySuspend(); + if (!last_window) + return; + + last_window->NotifySuspend(); + auto rvh = last_window->web_contents()->GetRenderViewHost(); + atom::Browser::Get()->Suspend(rvh); } void Browser::Show() { NativeWindow *last_window = WindowList::GetLastWindow(); - if (last_window) - last_window->NotifyResume(); + if (!last_window) + return; + + last_window->NotifyResume(); + auto rvh = last_window->web_contents()->GetRenderViewHost(); + atom::Browser::Get()->Resume(rvh); } void Browser::AppControl(std::unique_ptr appcontrol) { diff --git a/atom/common/api/api_messages.h b/atom/common/api/api_messages.h index 44e8ad6..8335a4e 100644 --- a/atom/common/api/api_messages.h +++ b/atom/common/api/api_messages.h @@ -71,4 +71,9 @@ IPC_SYNC_MESSAGE_ROUTED0_2(WrtViewMsg_GetCSP, std::string) IPC_MESSAGE_ROUTED1(WrtViewMsg_SetLongPolling, - unsigned long) \ No newline at end of file + unsigned long) + +IPC_MESSAGE_ROUTED0(WrtViewMsg_SuspendScheduledTask) +IPC_MESSAGE_ROUTED0(WrtViewMsg_ResumeScheduledTasks) + + diff --git a/atom/renderer/atom_render_view_observer.cc b/atom/renderer/atom_render_view_observer.cc index 8923fdf..a608567 100644 --- a/atom/renderer/atom_render_view_observer.cc +++ b/atom/renderer/atom_render_view_observer.cc @@ -139,12 +139,32 @@ bool AtomRenderViewObserver::OnMessageReceived(const IPC::Message& message) { IPC_BEGIN_MESSAGE_MAP(AtomRenderViewObserver, message) IPC_MESSAGE_HANDLER(AtomViewMsg_Message, OnBrowserMessage) IPC_MESSAGE_HANDLER(WrtViewMsg_SetLongPolling, OnSetLongPolling) + IPC_MESSAGE_HANDLER(WrtViewMsg_SuspendScheduledTask, OnSuspendScheduledTasks) + IPC_MESSAGE_HANDLER(WrtViewMsg_ResumeScheduledTasks, OnResumeScheduledTasks) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; } +void AtomRenderViewObserver::OnSuspendScheduledTasks() { + if (!document_created_) + return; + + blink::WebView* view = render_view()->GetWebView(); + if (view) + view->suspendScheduledTasks(); +} + +void AtomRenderViewObserver::OnResumeScheduledTasks() { + if (!document_created_) + return; + + blink::WebView* view = render_view()->GetWebView(); + if (view) + view->resumeScheduledTasks(); +} + void AtomRenderViewObserver::OnDestruct() { delete this; } diff --git a/atom/renderer/atom_render_view_observer.h b/atom/renderer/atom_render_view_observer.h index cd69e2a..00cfb3b 100644 --- a/atom/renderer/atom_render_view_observer.h +++ b/atom/renderer/atom_render_view_observer.h @@ -21,7 +21,8 @@ class AtomRenderViewObserver : public content::RenderViewObserver { public: explicit AtomRenderViewObserver(content::RenderView* render_view, AtomRendererClient* renderer_client); - + void OnSuspendScheduledTasks(); + void OnResumeScheduledTasks(); protected: virtual ~AtomRenderViewObserver(); diff --git a/tizen/browser/tizen_browser_parts.cc b/tizen/browser/tizen_browser_parts.cc index d037cfc..10dd2f6 100644 --- a/tizen/browser/tizen_browser_parts.cc +++ b/tizen/browser/tizen_browser_parts.cc @@ -73,4 +73,18 @@ void TizenBrowserParts::RenderViewCreated(content::RenderViewHost* render_view_h SetLongPollingTimeout(render_view_host); } -} \ No newline at end of file +void TizenBrowserParts::Suspend(content::RenderViewHost* rvh) { + if(!rvh) + return; + + rvh->Send(new WrtViewMsg_SuspendScheduledTask(rvh->GetRoutingID())); +} + +void TizenBrowserParts::Resume(content::RenderViewHost* rvh) { + if(!rvh) + return; + + rvh->Send(new WrtViewMsg_ResumeScheduledTasks(rvh->GetRoutingID())); +} + +} diff --git a/tizen/browser/tizen_browser_parts.h b/tizen/browser/tizen_browser_parts.h index 4f6d552..a280f2f 100644 --- a/tizen/browser/tizen_browser_parts.h +++ b/tizen/browser/tizen_browser_parts.h @@ -32,6 +32,8 @@ class TizenBrowserParts { virtual void Launch(std::unique_ptr appcontrol) = 0; virtual bool launched() const = 0; void RenderViewCreated(content::RenderViewHost* render_view_host); + void Suspend(content::RenderViewHost* rvh); + void Resume(content::RenderViewHost* rvh); void GetCSP(std::string &csp_rule, std::string &csp_report_rule); void Initialize(); @@ -51,4 +53,4 @@ class TizenBrowserParts { } // namespace tizen -#endif // TIZEN_BROWSER_TIZEN_BROWSER_PARTS_H_ \ No newline at end of file +#endif // TIZEN_BROWSER_TIZEN_BROWSER_PARTS_H_ -- 2.7.4 From 94d8b24ad8eb21b8212252f9a84899b8d2ab741e Mon Sep 17 00:00:00 2001 From: Venugopal S M Date: Fri, 13 Jul 2018 13:57:35 +0530 Subject: [PATCH 13/16] fixup! Implementation of Appcontrol functionalities For sending IPC only a valid webview is needed. There is No need to check document element existence. Change-Id: Ie30738e685fc89ce1586b2ee2a23612563a36c39 Signed-off-by: Venugopal S M --- atom/renderer/atom_render_view_observer.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/atom/renderer/atom_render_view_observer.cc b/atom/renderer/atom_render_view_observer.cc index a608567..3870e61 100644 --- a/atom/renderer/atom_render_view_observer.cc +++ b/atom/renderer/atom_render_view_observer.cc @@ -211,9 +211,6 @@ void AtomRenderViewObserver::SetContentSecurityPolicy(blink::WebLocalFrame* fram } void AtomRenderViewObserver::OnSetLongPolling(unsigned long timeout) { - if (!document_created_) - return; - blink::WebView* view = render_view()->GetWebView(); if (!view) return; -- 2.7.4 From 2a3df2cf595d83d769d317c1296d5f8e00b6e57f Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Fri, 13 Jul 2018 21:55:29 +0530 Subject: [PATCH 14/16] Handle Navigation policy from crosswalk-tizen Before making navigations and creating new windows, WRT should authorise based on its policy(WARP) and determine whether navigation should be allowed or not Change-Id: I9816958da6d9900a8436aba8e246e377ab327fc9 Signed-off-by: surya.kumar7 --- atom/browser/api/atom_api_web_contents.cc | 4 +++ atom/browser/atom_browser_client.cc | 7 +++++ atom/browser/atom_browser_client.h | 1 + tizen/browser/tizen_browser_parts.cc | 44 +++++++++++++++++++++++++++++++ tizen/browser/tizen_browser_parts.h | 1 + 5 files changed, 57 insertions(+) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 43b1940..4365e2e 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1036,6 +1036,10 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) { return; } + if (!atom::Browser::Get()->ShouldAllowNavigation(url.spec())) { + return; + } + content::NavigationController::LoadURLParams params(url); GURL http_referrer; diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index 9408fcf..6fefad7 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -324,6 +324,9 @@ bool AtomBrowserClient::CanCreateWindow( bool* no_javascript_access) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + if (!atom::Browser::Get()->ShouldAllowNavigation(target_url.spec())) + return false; + if (IsRendererSandboxed(render_process_id)) { *no_javascript_access = false; return true; @@ -345,6 +348,10 @@ bool AtomBrowserClient::CanCreateWindow( return false; } +bool AtomBrowserClient::ShouldAllowOpenURL(content::SiteInstance* site_instance, const GURL& url) { + return atom::Browser::Get()->ShouldAllowNavigation(url.spec()); +} + void AtomBrowserClient::GetAdditionalAllowedSchemesForFileSystem( std::vector* additional_schemes) { auto schemes_list = api::GetStandardSchemes(); diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index a794fba..4d6d3df 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -100,6 +100,7 @@ class AtomBrowserClient : public brightray::BrowserClient, bool* no_javascript_access) override; void GetAdditionalAllowedSchemesForFileSystem( std::vector* schemes) override; + bool ShouldAllowOpenURL(content::SiteInstance* site_instance, const GURL& url) override; // brightray::BrowserClient: brightray::BrowserMainParts* OverrideCreateBrowserMainParts( diff --git a/tizen/browser/tizen_browser_parts.cc b/tizen/browser/tizen_browser_parts.cc index 10dd2f6..326e5cd 100644 --- a/tizen/browser/tizen_browser_parts.cc +++ b/tizen/browser/tizen_browser_parts.cc @@ -16,6 +16,7 @@ #include "atom/common/api/api_messages.h" #include "base/logging.h" +#include "common/string_utils.h" #include "tizen/browser/tizen_browser_parts.h" namespace tizen { @@ -25,6 +26,28 @@ namespace { const char* kDefaultCSPRule = "default-src *; script-src 'self'; style-src 'self'; object-src 'none';"; +static bool ProcessWellKnownScheme(const std::string& url) { + if (common::utils::StartsWith(url, "file:") || + common::utils::StartsWith(url, "app:") || + common::utils::StartsWith(url, "data:") || + common::utils::StartsWith(url, "http:") || + common::utils::StartsWith(url, "https:") || + common::utils::StartsWith(url, "widget:") || + common::utils::StartsWith(url, "about:") || + common::utils::StartsWith(url, "blob:")) { + return false; + } + + std::unique_ptr request( + common::AppControl::MakeAppcontrolFromURL(url)); + if (request.get() == NULL || !request->LaunchRequest()) { + LOG(ERROR) << "Fail to send appcontrol request: " << url; + } + + // Should return true, to stop the WebEngine progress step about this URL + return true; +} + } // namespace TizenBrowserParts::TizenBrowserParts() @@ -87,4 +110,25 @@ void TizenBrowserParts::Resume(content::RenderViewHost* rvh) { rvh->Send(new WrtViewMsg_ResumeScheduledTasks(rvh->GetRoutingID())); } +bool TizenBrowserParts::ShouldAllowNavigation(const std::string &url) { + // scheme handling + // except(file , http, https, app) pass to appcontrol and return false + if (ProcessWellKnownScheme(url)) { + return false; + } + + // send launch request for blocked URL to guarrenty backward-compatibility. + if (resource_manager_->AllowNavigation(url)) { + return true; + } else { + LOG(ERROR) << "URL is blocked. send launch request for URL : " << url; + std::unique_ptr request( + common::AppControl::MakeAppcontrolFromURL(url)); + if (request.get() == NULL || !request->LaunchRequest()) { + LOG(ERROR) << "Fail to send appcontrol request: " << url; + } + return false; + } } + +} // namespace tizen diff --git a/tizen/browser/tizen_browser_parts.h b/tizen/browser/tizen_browser_parts.h index a280f2f..09d6934 100644 --- a/tizen/browser/tizen_browser_parts.h +++ b/tizen/browser/tizen_browser_parts.h @@ -35,6 +35,7 @@ class TizenBrowserParts { void Suspend(content::RenderViewHost* rvh); void Resume(content::RenderViewHost* rvh); void GetCSP(std::string &csp_rule, std::string &csp_report_rule); + bool ShouldAllowNavigation(const std::string &url); void Initialize(); protected: -- 2.7.4 From e4822027e3fe7953899547fdd64cbb2e6a76d8c3 Mon Sep 17 00:00:00 2001 From: Venugopal S M Date: Fri, 13 Jul 2018 15:16:34 +0530 Subject: [PATCH 15/16] Enable video hole for TV Chromium on TV uses video hole feature for video playback. This way rendering overhead is reduced. This commit enables video hole feature. Change-Id: Ib293e22ac44663e78020a670d0da79232dbdee45 Signed-off-by: Venugopal S M --- atom/common/api/api_messages.h | 4 ++++ atom/renderer/atom_render_view_observer.cc | 11 +++++++++++ atom/renderer/atom_render_view_observer.h | 4 ++++ efl/build/system.gyp | 21 +++++++++++++++++++++ packaging/electron-efl.spec | 1 + tizen/browser/tizen_browser_parts.cc | 27 ++++++++++++++++++++++++++- tizen/browser/tizen_browser_parts.h | 8 ++++++-- tizen/common.gypi | 1 + wrt.gyp | 2 ++ 9 files changed, 76 insertions(+), 3 deletions(-) diff --git a/atom/common/api/api_messages.h b/atom/common/api/api_messages.h index 8335a4e..befa474 100644 --- a/atom/common/api/api_messages.h +++ b/atom/common/api/api_messages.h @@ -76,4 +76,8 @@ IPC_MESSAGE_ROUTED1(WrtViewMsg_SetLongPolling, IPC_MESSAGE_ROUTED0(WrtViewMsg_SuspendScheduledTask) IPC_MESSAGE_ROUTED0(WrtViewMsg_ResumeScheduledTasks) +#if defined(TIZEN_VIDEO_HOLE) +IPC_MESSAGE_ROUTED1(WrtViewMsg_EnableVideoHole, + bool) +#endif diff --git a/atom/renderer/atom_render_view_observer.cc b/atom/renderer/atom_render_view_observer.cc index 3870e61..d0ae784 100644 --- a/atom/renderer/atom_render_view_observer.cc +++ b/atom/renderer/atom_render_view_observer.cc @@ -141,6 +141,9 @@ bool AtomRenderViewObserver::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(WrtViewMsg_SetLongPolling, OnSetLongPolling) IPC_MESSAGE_HANDLER(WrtViewMsg_SuspendScheduledTask, OnSuspendScheduledTasks) IPC_MESSAGE_HANDLER(WrtViewMsg_ResumeScheduledTasks, OnResumeScheduledTasks) +#if defined(TIZEN_VIDEO_HOLE) + IPC_MESSAGE_HANDLER(WrtViewMsg_EnableVideoHole, OnEnableVideoHole) +#endif IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() @@ -217,4 +220,12 @@ void AtomRenderViewObserver::OnSetLongPolling(unsigned long timeout) { view->setLongPollingGlobalTimeout(timeout); } +#if defined(TIZEN_VIDEO_HOLE) +void AtomRenderViewObserver::OnEnableVideoHole(bool is_enabled) { + blink::WebView* view = render_view()->GetWebView(); + if (view) + view->setVideoHoleForRender(is_enabled); +} +#endif + } // namespace atom diff --git a/atom/renderer/atom_render_view_observer.h b/atom/renderer/atom_render_view_observer.h index 00cfb3b..0d89cbf 100644 --- a/atom/renderer/atom_render_view_observer.h +++ b/atom/renderer/atom_render_view_observer.h @@ -44,6 +44,10 @@ class AtomRenderViewObserver : public content::RenderViewObserver { void SetContentSecurityPolicy(blink::WebLocalFrame* frame); void OnSetLongPolling(unsigned long); +#if defined(TIZEN_VIDEO_HOLE) + void OnEnableVideoHole(bool is_enabled); +#endif + AtomRendererClient* renderer_client_; // Whether the document object has been created. diff --git a/efl/build/system.gyp b/efl/build/system.gyp index 32c429f..c15c218 100644 --- a/efl/build/system.gyp +++ b/efl/build/system.gyp @@ -218,5 +218,26 @@ }], ], }, # capi-appfw-application + { + 'target_name': 'capi-media-player', + 'type': 'none', + 'conditions': [ + ['tizen_product_tv==1', { + 'direct_dependent_settings': { + 'cflags': [ + '(atom::WindowList::GetLastWindow()) + ->evas_object(); + + // arg1 -> Evas object, + // arg2 -> 0 : WINDOWLESS_MODE_NORMAL, + // 1 : WINDOWLESS_MODE_FULL_SCREEN + media::MediaPlayerEfl::SetSharedVideoWindowHandle(window_obj, 0); + + // For TV video hole is enabled by default. + render_view_host->Send( + new WrtViewMsg_EnableVideoHole(render_view_host->GetRoutingID(), true)); +} +#endif + void TizenBrowserParts::SetLongPollingTimeout(content::RenderViewHost* rvh) { auto setting = app_data_->setting_info(); if (setting.get() != NULL && @@ -94,6 +116,9 @@ void TizenBrowserParts::SetLongPollingTimeout(content::RenderViewHost* rvh) { void TizenBrowserParts::RenderViewCreated(content::RenderViewHost* render_view_host) { SetLongPollingTimeout(render_view_host); +#if defined(TIZEN_VIDEO_HOLE) + EnableVideoHole(render_view_host); +#endif } void TizenBrowserParts::Suspend(content::RenderViewHost* rvh) { diff --git a/tizen/browser/tizen_browser_parts.h b/tizen/browser/tizen_browser_parts.h index 09d6934..3ef4c97 100644 --- a/tizen/browser/tizen_browser_parts.h +++ b/tizen/browser/tizen_browser_parts.h @@ -20,8 +20,8 @@ #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" +#include "tizen/common/resource_manager.h" namespace tizen { @@ -34,7 +34,7 @@ class TizenBrowserParts { void RenderViewCreated(content::RenderViewHost* render_view_host); void Suspend(content::RenderViewHost* rvh); void Resume(content::RenderViewHost* rvh); - void GetCSP(std::string &csp_rule, std::string &csp_report_rule); + void GetCSP(std::string& csp_rule, std::string& csp_report_rule); bool ShouldAllowNavigation(const std::string &url); void Initialize(); @@ -44,6 +44,10 @@ class TizenBrowserParts { virtual ~TizenBrowserParts() {} private: +#if defined(TIZEN_VIDEO_HOLE) + void EnableVideoHole(content::RenderViewHost* render_view_host); +#endif + void SetLongPollingTimeout(content::RenderViewHost* render_view_host); common::ApplicationData* app_data_; diff --git a/tizen/common.gypi b/tizen/common.gypi index 5ec020d..ec9cc58 100644 --- a/tizen/common.gypi +++ b/tizen/common.gypi @@ -33,6 +33,7 @@ 'target_defaults': { 'defines': [ 'OS_TIZEN_TV_PRODUCT', + 'TIZEN_VIDEO_HOLE', ], }, }], # tizen_product_tv==1 diff --git a/wrt.gyp b/wrt.gyp index 2410d1c..5941ad9 100644 --- a/wrt.gyp +++ b/wrt.gyp @@ -212,6 +212,8 @@ }], ['tizen_product_tv==1', { 'dependencies': [ + # `media_player_efl.h` internally includes `player.h`. + '<(DEPTH)/efl/build/system.gyp:capi-media-player', '<(DEPTH)/efl/build/system.gyp:vd-win-util', ], }], -- 2.7.4 From e61917a8bd5143003372e5a237cdb1a8a5e7d556 Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Wed, 18 Jul 2018 19:17:06 +0530 Subject: [PATCH 16/16] Register "chrome-extension://" as a recognized scheme in WARP Extensions use "chrome-extension://" scheme which is not supported by WARP and was forwarding the requests to the platform. Extended support to the new scheme Change-Id: I245b3384dec5666122a1acef3e59d939f7de70b0 Signed-off-by: surya.kumar7 --- tizen/browser/tizen_browser_parts.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tizen/browser/tizen_browser_parts.cc b/tizen/browser/tizen_browser_parts.cc index 13ceaf7..41bf8d5 100644 --- a/tizen/browser/tizen_browser_parts.cc +++ b/tizen/browser/tizen_browser_parts.cc @@ -39,7 +39,8 @@ static bool ProcessWellKnownScheme(const std::string& url) { common::utils::StartsWith(url, "https:") || common::utils::StartsWith(url, "widget:") || common::utils::StartsWith(url, "about:") || - common::utils::StartsWith(url, "blob:")) { + common::utils::StartsWith(url, "blob:") || + common::utils::StartsWith(url, "chrome-extension:")) { return false; } @@ -137,7 +138,7 @@ void TizenBrowserParts::Resume(content::RenderViewHost* rvh) { bool TizenBrowserParts::ShouldAllowNavigation(const std::string &url) { // scheme handling - // except(file , http, https, app) pass to appcontrol and return false + // except(file , http, https, app, chrome-extension) pass to appcontrol and return false if (ProcessWellKnownScheme(url)) { return false; } -- 2.7.4