[M85 Dev] Fix crashes during page load/navigation and webview shutdown 54/245454/4
authorChandan Padhi <c.padhi@samsung.com>
Fri, 9 Oct 2020 04:41:18 +0000 (10:11 +0530)
committerBot Blink <blinkbot@samsung.com>
Mon, 12 Oct 2020 09:59:45 +0000 (09:59 +0000)
This commit does the following to fix the crashes.

1. Creates viz::HostFrameSinkManager and viz::FrameSinkManagerImpl
2. Sets up a connection between viz::HostFrameSinkManager and
   viz::FrameSinkManagerImpl without using Mojo
3. Makes RWHVEfl a viz::HostFrameSinkClient and registers its
   viz::FrameSinkId

Reference: https://review.tizen.org/gerrit/232406/

Change-Id: I6c69ea29a151186f71c55b08818c4036db3c0a4d
Signed-off-by: Chandan Padhi <c.padhi@samsung.com>
content/browser/browser_main_loop.cc
content/browser/browser_main_loop.h
content/browser/compositor/surface_utils.cc
tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc
tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h

index 64a5e6c..a82469d 100644 (file)
 #include "mojo/public/cpp/bindings/lib/test_random_mojo_delays.h"
 #endif
 
+#if defined(USE_EFL)
+#include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
+#endif
+
 // One of the linux specific headers defines this as a macro.
 #ifdef DestroyAll
 #undef DestroyAll
@@ -1069,6 +1074,9 @@ void BrowserMainLoop::ShutdownThreadsAndCleanUp() {
 
 #if !defined(OS_ANDROID)
   host_frame_sink_manager_.reset();
+#endif
+
+#if !defined(OS_ANDROID) && !defined(USE_EFL)
   compositing_mode_reporter_impl_.reset();
 #endif
 
@@ -1220,7 +1228,15 @@ int BrowserMainLoop::BrowserThreadsStarted() {
   always_uses_gpu = ShouldStartGpuProcessOnBrowserStartup();
   BrowserGpuChannelHostFactory::Initialize(established_gpu_channel);
 #elif defined(USE_EFL)
+  shared_bitmap_manager_ = std::make_unique<viz::ServerSharedBitmapManager>();
+  frame_sink_manager_ =
+      std::make_unique<viz::FrameSinkManagerImpl>(shared_bitmap_manager_.get());
+  host_frame_sink_manager_ = std::make_unique<viz::HostFrameSinkManager>();
   BrowserGpuChannelHostFactory::Initialize(established_gpu_channel);
+
+  // Directly connect without using Mojo.
+  frame_sink_manager_->SetLocalClient(host_frame_sink_manager_.get());
+  host_frame_sink_manager_->SetLocalManager(frame_sink_manager_.get());
 #else
   established_gpu_channel = true;
   if (parsed_command_line_.HasSwitch(switches::kDisableGpu) ||
index 2016b1f..9cc59d6 100644 (file)
@@ -76,6 +76,10 @@ class NetworkChangeNotifier;
 namespace viz {
 class CompositingModeReporterImpl;
 class HostFrameSinkManager;
+#if defined(USE_EFL)
+class FrameSinkManagerImpl;
+class ServerSharedBitmapManager;
+#endif
 }  // namespace viz
 
 namespace content {
@@ -388,9 +392,17 @@ class CONTENT_EXPORT BrowserMainLoop {
   scoped_refptr<SaveFileManager> save_file_manager_;
   std::unique_ptr<content::TracingControllerImpl> tracing_controller_;
   scoped_refptr<responsiveness::Watcher> responsiveness_watcher_;
+
+#if defined(USE_EFL)
+  std::unique_ptr<viz::ServerSharedBitmapManager> shared_bitmap_manager_;
+  std::unique_ptr<viz::FrameSinkManagerImpl> frame_sink_manager_;
+#endif
+
 #if !defined(OS_ANDROID)
   std::unique_ptr<viz::HostFrameSinkManager> host_frame_sink_manager_;
+#endif
 
+#if !defined(OS_ANDROID) && !defined(USE_EFL)
   // Reports on the compositing mode in the system for clients to submit
   // resources of the right type. This is null if the display compositor
   // is not in this process.
index e3a2fdd..23c41d0 100644 (file)
 #include "ui/compositor/compositor.h"  // nogncheck
 #endif
 
+#if defined(USE_EFL)
+#include "content/browser/browser_main_loop.h"
+#endif
+
 namespace content {
 
 viz::FrameSinkId AllocateFrameSinkId() {
@@ -31,7 +35,7 @@ viz::HostFrameSinkManager* GetHostFrameSinkManager() {
 #if defined(OS_ANDROID)
   return CompositorDependenciesAndroid::Get().host_frame_sink_manager();
 #elif defined(USE_EFL)
-  return nullptr;
+  return BrowserMainLoop::GetInstance()->host_frame_sink_manager();
 #else
   ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
   if (!factory)
index c73a052..499ff13 100644 (file)
@@ -21,6 +21,8 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
+#include "components/viz/host/host_frame_sink_manager.h"
+#include "content/browser/compositor/surface_utils.h"
 #include "content/browser/renderer_host/disambiguation_popup_efl.h"
 #include "content/browser/renderer_host/display_util.h"
 #include "content/browser/renderer_host/edge_effect.h"
@@ -133,6 +135,7 @@ RenderWidgetHostViewEfl::RenderWidgetHostViewEfl(RenderWidgetHost* widget_host,
       device_scale_factor_(1.0f),
       magnifier_(false),
       is_loading_(false),
+      frame_sink_id_(host()->GetFrameSinkId()),
       gesture_recognizer_(std::make_unique<ui::GestureRecognizerImpl>()),
       current_orientation_(0),
       evas_gl_(NULL),
@@ -155,7 +158,7 @@ RenderWidgetHostViewEfl::RenderWidgetHostViewEfl(RenderWidgetHost* widget_host,
   device_scale_factor_ =
       display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor();
 
-  host_->SetView(this);
+  host()->SetView(this);
 
   static bool scale_factor_initialized = false;
   if (!scale_factor_initialized) {
@@ -167,6 +170,9 @@ RenderWidgetHostViewEfl::RenderWidgetHostViewEfl(RenderWidgetHost* widget_host,
   }
 
   gesture_recognizer_->AddGestureEventHelper(this);
+
+  GetHostFrameSinkManager()->RegisterFrameSinkId(
+      frame_sink_id_, this, viz::ReportFirstSurfaceActivation::kNo);
 }
 
 void RenderWidgetHostViewEfl::InitAsChild(gfx::NativeView /* parent_view */) {
@@ -487,6 +493,11 @@ bool RenderWidgetHostViewEfl::OnMessageReceived(const IPC::Message& message) {
   return handled;
 }
 
+void RenderWidgetHostViewEfl::OnFirstSurfaceActivation(
+    const viz::SurfaceInfo& surface_info) {}
+
+void RenderWidgetHostViewEfl::OnFrameTokenChanged(uint32_t frame_token) {}
+
 bool RenderWidgetHostViewEfl::Send(IPC::Message* message) {
   return host_->Send(message);
 }
@@ -583,7 +594,7 @@ void RenderWidgetHostViewEfl::EnsureSurfaceSynchronizedForWebTest() {
 }
 
 const viz::FrameSinkId& RenderWidgetHostViewEfl::GetFrameSinkId() const {
-  return viz::FrameSinkId();
+  return frame_sink_id_;
 }
 
 const viz::LocalSurfaceIdAllocation&
index 440d201..aaba4cf 100644 (file)
@@ -17,6 +17,7 @@
 #include "components/viz/common/frame_sinks/copy_output_result.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "components/viz/common/resources/single_release_callback.h"
+#include "components/viz/host/host_frame_sink_client.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
 #include "content/browser/compositor/evasgl_delegated_frame_host.h"
 #include "content/browser/renderer_host/evas_event_handler.h"
@@ -76,6 +77,7 @@ class CONTENT_EXPORT RenderWidgetHostViewEfl
       public ui::GestureConsumer,
       public ui::GestureEventHelper,
       public base::SupportsWeakPtr<RenderWidgetHostViewEfl>,
+      public viz::HostFrameSinkClient,
       public IPC::Sender {
  public:
   explicit RenderWidgetHostViewEfl(RenderWidgetHost*,
@@ -174,6 +176,10 @@ class CONTENT_EXPORT RenderWidgetHostViewEfl
   void DispatchGestureEvent(GestureConsumer* raw_input_consumer,
                             ui::GestureEvent*) override;
 
+  // viz::HostFrameSinkClient implementation.
+  void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
+  void OnFrameTokenChanged(uint32_t frame_token) override;
+
   // IPC::Sender implementation:
   bool Send(IPC::Message*) override;
 
@@ -324,6 +330,8 @@ class CONTENT_EXPORT RenderWidgetHostViewEfl
 
   scoped_refptr<EvasEventHandler> evas_event_handler_;
 
+  const viz::FrameSinkId frame_sink_id_;
+
   // Stores the current state of the active pointers targeting this
   // object.
   ui::MotionEventAura pointer_state_;