[M120][WRTjs][VD] Suspend media tasks without 500ms delay 19/305419/3
authorzhaosy <shiyusy.zhao@samsung.com>
Mon, 22 Jan 2024 07:53:44 +0000 (15:53 +0800)
committerDongHyun Song <dh81.song@samsung.com>
Mon, 5 Feb 2024 04:49:24 +0000 (04:49 +0000)
For webapps, when app is hide, WRT suspend app after 500ms.
But for media, there is resource conflict in this case:
  1.Play H5 video in app A
  2.Play H5 video in app B
  3.Resume app A, media resource conflict

Reason:
  In step3, app B is not suspend, so media resource of app B is not released.
  Then when app A is fail to play video.

So when app is hide, notify media app is suspend without 500ms delay,
then media will release resource right now.

Reference:
https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/304611/

Change-Id: I2aa28df76568d9aee86f5f9cbf68c95e840bb869
Signed-off-by: zhaosy <shiyusy.zhao@samsung.com>
Signed-off-by: DongHyun Song <dh81.song@samsung.com>
(cherry picked from commit ee9a656b5306a78cfc166e5065b82ddd0b1eeb45)

wrt/src/browser/tv/wrt_native_window_tv.cc
wrt/src/browser/tv/wrt_native_window_tv.h
wrt/src/common/wrt.mojom
wrt/src/renderer/wrt_render_frame_observer.cc [changed mode: 0644->0755]
wrt/src/renderer/wrt_render_frame_observer.h

index 9dd46d9..88b3ec5 100644 (file)
@@ -1122,6 +1122,7 @@ void WRTNativeWindowTV::VisibilityChangedAsBackground() {
   std::string app_id = ApplicationData::GetInstance().app_id();
   LOG(ERROR) << app_id << " is hidden from the screen";
 
+  SuspendMedia(true);
   DisableVisibilitySetting();
   if (visibility_state_.empty() && !VideoSplashScreen::IsVSSPlaying())
     WidgetStateProvider::OnStatusChanged("behind");
@@ -1135,6 +1136,7 @@ void WRTNativeWindowTV::VisibilityChangedAsForeground() {
   std::string app_id = ApplicationData::GetInstance().app_id();
   LOG(ERROR) << app_id << " has shown on the screen";
 
+  SuspendMedia(false);
   CreateMouseCursor(top_window_);
 
   EnableVisibilitySetting();
@@ -1598,6 +1600,21 @@ void WRTNativeWindowTV::Suspend() {
   SetScheduledTasks(false);
 }
 
+void WRTNativeWindowTV::SuspendMedia(bool suspend) {
+  auto* wrt_web_contents = WRTWebContents::FromNativeWindow(this);
+  if (!wrt_web_contents) {
+    LOG(ERROR) << "WebContents is not created";
+    return;
+  }
+  auto* render_interface = wrt_web_contents->GetRendererInterface();
+  if (!render_interface) {
+    LOG(ERROR) << "Frame is not created";
+    return;
+  }
+
+  render_interface->SuspendMediaTasks(suspend);
+}
+
 bool WRTNativeWindowTV::IsJavaScriptDialogShowing() {
   auto dialog_manager = GetJavaScriptDialogManager();
   return dialog_manager && dialog_manager->IsShowing();
index be9acfe..9a5ea92 100644 (file)
@@ -118,6 +118,7 @@ class WRTNativeWindowTV : public WRTNativeWindow {
   void SetWindowOpaque();
   void SetZoomLevel(double level);
   void Suspend();
+  void SuspendMedia(bool suspend);
   bool UnRegisterRotateSensorListener();
   void VisibilityChangedAsBackground();
   void VisibilityChangedAsForeground();
index f94f1e4..c12b54b 100755 (executable)
@@ -30,6 +30,7 @@ interface WRTRenderer {
   RequestSelectCollectionInformation()
       => (int32 form_element_count, int32 current_node_index);
   HandleChromeExtensionAction(array<ChromeExtensionAction> actions);
+  SuspendMediaTasks(bool suspend);
 };
 
 interface WRTServiceMessageListener {
old mode 100644 (file)
new mode 100755 (executable)
index f578919..756379f
@@ -341,4 +341,14 @@ void WRTRenderFrameObserver::HandleChromeExtensionAction(
 #endif
 }
 
+void WRTRenderFrameObserver::SuspendMediaTasks(bool suspend) {
+#if BUILDFLAG(IS_TIZEN_TV) && !defined(WRT_JS_BRINGUP)
+  blink::WebView* view = render_frame()->GetWebView();
+  if (view) {
+    LOG(INFO) << "Suspend media tasks, suspend:" << suspend;
+    view->WRTMediaSuspend(suspend);
+  }
+#endif
+}
+
 }  // namespace wrt
index 7702fde..cffb272 100755 (executable)
@@ -57,6 +57,7 @@ class WRTRenderFrameObserver : public electron::ElectronRenderFrameObserver,
       RequestSelectCollectionInformationCallback callback) override;
   void HandleChromeExtensionAction(
       std::vector<mojom::ChromeExtensionActionPtr> actions) override;
+  void SuspendMediaTasks(bool suspend) override;
 
   mojo::AssociatedReceiver<mojom::WRTRenderer> receiver_{this};
   mojo::AssociatedRemote<mojom::WRTBrowser> browser_interface_;