From d20a7e4b0dd1eafd050c58c19b4f5f0f3f9508cc Mon Sep 17 00:00:00 2001 From: Chandan Padhi Date: Fri, 9 Oct 2020 10:11:18 +0530 Subject: [PATCH] [M85 Dev] Fix crashes during page load/navigation and webview shutdown 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 --- content/browser/browser_main_loop.cc | 16 ++++++++++++++++ content/browser/browser_main_loop.h | 12 ++++++++++++ content/browser/compositor/surface_utils.cc | 6 +++++- .../browser/renderer_host/render_widget_host_view_efl.cc | 15 +++++++++++++-- .../browser/renderer_host/render_widget_host_view_efl.h | 8 ++++++++ 5 files changed, 54 insertions(+), 3 deletions(-) diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index 64a5e6c..a82469d 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc @@ -240,6 +240,11 @@ #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(); + frame_sink_manager_ = + std::make_unique(shared_bitmap_manager_.get()); + host_frame_sink_manager_ = std::make_unique(); 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) || diff --git a/content/browser/browser_main_loop.h b/content/browser/browser_main_loop.h index 2016b1f..9cc59d6 100644 --- a/content/browser/browser_main_loop.h +++ b/content/browser/browser_main_loop.h @@ -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 save_file_manager_; std::unique_ptr tracing_controller_; scoped_refptr responsiveness_watcher_; + +#if defined(USE_EFL) + std::unique_ptr shared_bitmap_manager_; + std::unique_ptr frame_sink_manager_; +#endif + #if !defined(OS_ANDROID) std::unique_ptr 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. diff --git a/content/browser/compositor/surface_utils.cc b/content/browser/compositor/surface_utils.cc index e3a2fdd..23c41d0 100644 --- a/content/browser/compositor/surface_utils.cc +++ b/content/browser/compositor/surface_utils.cc @@ -14,6 +14,10 @@ #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) diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc b/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc index c73a052..499ff13 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc +++ b/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc @@ -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()), 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& diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h b/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h index 440d201..aaba4cf 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h +++ b/tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h @@ -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, + 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 evas_event_handler_; + const viz::FrameSinkId frame_sink_id_; + // Stores the current state of the active pointers targeting this // object. ui::MotionEventAura pointer_state_; -- 2.7.4