diff --git a/atom/browser/osr/osr_render_widget_host_view.cc b/atom/browser/osr/osr_render_widget_host_view.cc index 45482039a3..38b6034ea4 100644 --- a/atom/browser/osr/osr_render_widget_host_view.cc +++ b/atom/browser/osr/osr_render_widget_host_view.cc @@ -254,7 +254,8 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView( content::RenderWidgetHost* host, OffScreenRenderWidgetHostView* parent_host_view, NativeWindow* native_window) - : render_widget_host_(content::RenderWidgetHostImpl::From(host)), + : content::RenderWidgetHostViewBase(host), + render_widget_host_(content::RenderWidgetHostImpl::From(host)), parent_host_view_(parent_host_view), native_window_(native_window), transparent_(transparent), @@ -264,7 +265,7 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView( size_(native_window->GetSize()), painting_(painting), is_showing_(!render_widget_host_->is_hidden()), - mouse_wheel_phase_handler_(render_widget_host_, this), + mouse_wheel_phase_handler_(this), weak_ptr_factory_(this) { DCHECK(render_widget_host_); bool is_guest_view_hack = parent_host_view_ != nullptr; @@ -283,7 +284,13 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView( #if defined(OS_MACOSX) last_frame_root_background_color_ = SK_ColorTRANSPARENT; CreatePlatformWidget(is_guest_view_hack); -#else +#endif + + bool opaque = SkColorGetA(background_color()) == SK_AlphaOPAQUE; + GetRootLayer()->SetFillsBoundsOpaquely(opaque); + GetRootLayer()->SetColor(background_color()); + +#if !defined(OS_MACOSX) // On macOS the ui::Compositor is created/owned by the platform view. content::ImageTransportFactory* factory = content::ImageTransportFactory::GetInstance(); @@ -397,10 +404,6 @@ void OffScreenRenderWidgetHostView::SetBounds(const gfx::Rect& new_bounds) { SetSize(new_bounds.size()); } -gfx::Vector2dF OffScreenRenderWidgetHostView::GetLastScrollOffset() const { - return last_scroll_offset_; -} - gfx::NativeView OffScreenRenderWidgetHostView::GetNativeView() const { return gfx::NativeView(); } @@ -497,6 +500,22 @@ bool OffScreenRenderWidgetHostView::LockMouse() { void OffScreenRenderWidgetHostView::UnlockMouse() {} +void OffScreenRenderWidgetHostView::TakeFallbackContentFrom( + content::RenderWidgetHostView* view) { + DCHECK(!static_cast(view) + ->IsRenderWidgetHostViewChildFrame()); + DCHECK(!static_cast(view) + ->IsRenderWidgetHostViewGuest()); + OffScreenRenderWidgetHostView* view_osr = + static_cast(view); + SetBackgroundColor(view_osr->background_color()); + if (GetDelegatedFrameHost() && view_osr->GetDelegatedFrameHost()) { + GetDelegatedFrameHost()->TakeFallbackContentFrom( + view_osr->GetDelegatedFrameHost()); + } + host()->GetContentRenderingTimeoutFrom(view_osr->host()); +} + void OffScreenRenderWidgetHostView::DidCreateNewRendererCompositorFrameSink( viz::mojom::CompositorFrameSinkClient* renderer_compositor_frame_sink) { renderer_compositor_frame_sink_ = renderer_compositor_frame_sink; @@ -672,11 +691,6 @@ gfx::Rect OffScreenRenderWidgetHostView::GetBoundsInRootWindow() { return gfx::Rect(size_); } -content::RenderWidgetHostImpl* -OffScreenRenderWidgetHostView::GetRenderWidgetHostImpl() const { - return render_widget_host_; -} - viz::SurfaceId OffScreenRenderWidgetHostView::GetCurrentSurfaceId() const { return GetDelegatedFrameHost() ? GetDelegatedFrameHost()->GetCurrentSurfaceId() @@ -1116,7 +1130,7 @@ void OffScreenRenderWidgetHostView::SendMouseWheelEvent( blink::WebMouseWheelEvent mouse_wheel_event(event); - mouse_wheel_phase_handler_.SendWheelEndIfNeeded(); + mouse_wheel_phase_handler_.SendWheelEndForTouchpadScrollingIfNeeded(); mouse_wheel_phase_handler_.AddPhaseIfNeededAndScheduleEndEvent( mouse_wheel_event, false); @@ -1291,7 +1305,7 @@ void OffScreenRenderWidgetHostView::ResizeRootLayer(bool force) { local_surface_id_); #if defined(OS_MACOSX) - bool resized = browser_compositor_->UpdateNSViewAndDisplay(); + bool resized = UpdateNSViewAndDisplay(); #else bool resized = true; GetDelegatedFrameHost()->WasResized(local_surface_id_, size, diff --git a/atom/browser/osr/osr_render_widget_host_view.h b/atom/browser/osr/osr_render_widget_host_view.h index f901a86b12..79ddc102d9 100644 --- a/atom/browser/osr/osr_render_widget_host_view.h +++ b/atom/browser/osr/osr_render_widget_host_view.h @@ -89,7 +89,6 @@ class OffScreenRenderWidgetHostView void InitAsChild(gfx::NativeView) override; void SetSize(const gfx::Size&) override; void SetBounds(const gfx::Rect&) override; - gfx::Vector2dF GetLastScrollOffset(void) const override; gfx::NativeView GetNativeView(void) const override; gfx::NativeViewAccessible GetNativeViewAccessible(void) override; ui::TextInputClient* GetTextInputClient() override; @@ -106,6 +105,7 @@ class OffScreenRenderWidgetHostView SkColor background_color() const override; bool LockMouse(void) override; void UnlockMouse(void) override; + void TakeFallbackContentFrom(content::RenderWidgetHostView* view) override; void SetNeedsBeginFrames(bool needs_begin_frames) override; void SetWantsAnimateOnlyBeginFrames() override; #if defined(OS_MACOSX) @@ -116,6 +116,7 @@ class OffScreenRenderWidgetHostView bool IsSpeaking() const override; bool ShouldContinueToPauseForFrame() override; void StopSpeaking() override; + bool UpdateNSViewAndDisplay(); #endif // defined(OS_MACOSX) // content::RenderWidgetHostViewBase: @@ -149,7 +150,6 @@ class OffScreenRenderWidgetHostView content::RenderWidgetHostViewGuest*) override; gfx::Vector2d GetOffsetFromRootSurface() override; gfx::Rect GetBoundsInRootWindow(void) override; - content::RenderWidgetHostImpl* GetRenderWidgetHostImpl() const override; viz::SurfaceId GetCurrentSurfaceId() const override; void ImeCompositionRangeChanged(const gfx::Range&, const std::vector&) override; diff --git a/atom/browser/osr/osr_render_widget_host_view_mac.mm b/atom/browser/osr/osr_render_widget_host_view_mac.mm index 8af4ce6ec2..6bd0b7966a 100644 --- a/atom/browser/osr/osr_render_widget_host_view_mac.mm +++ b/atom/browser/osr/osr_render_widget_host_view_mac.mm @@ -10,6 +10,14 @@ #include "content/common/view_messages.h" #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" +namespace { + +display::Display GetDisplay() { + return display::Screen::GetScreen()->GetDisplayNearestView(nullptr); +} + +} // namespace + namespace atom { class MacHelper : public content::BrowserCompositorMacClient, @@ -33,7 +41,7 @@ class MacHelper : public content::BrowserCompositorMacClient, return view_->last_frame_root_background_color(); } - void BrowserCompositorMacOnBeginFrame() override {} + void BrowserCompositorMacOnBeginFrame(base::TimeTicks frame_time) override {} void OnFrameTokenChanged(uint32_t frame_token) override { view_->render_widget_host()->DidProcessFrame(frame_token); @@ -81,6 +89,11 @@ bool OffScreenRenderWidgetHostView::IsSpeaking() const { void OffScreenRenderWidgetHostView::StopSpeaking() {} +bool OffScreenRenderWidgetHostView::UpdateNSViewAndDisplay() { + return browser_compositor_->UpdateNSViewAndDisplay( + GetRootLayer()->bounds().size(), GetDisplay()); +} + bool OffScreenRenderWidgetHostView::ShouldContinueToPauseForFrame() { return browser_compositor_->ShouldContinueToPauseForFrame(); } @@ -90,7 +103,7 @@ void OffScreenRenderWidgetHostView::CreatePlatformWidget( mac_helper_ = new MacHelper(this); browser_compositor_.reset(new content::BrowserCompositorMac( mac_helper_, mac_helper_, render_widget_host_->is_hidden(), true, - AllocateFrameSinkId(is_guest_view_hack))); + GetDisplay(), AllocateFrameSinkId(is_guest_view_hack))); } void OffScreenRenderWidgetHostView::DestroyPlatformWidget() {