Fix PDF rendering with OSR (issue #1689)

This commit is contained in:
Marshall Greenblatt 2016-10-27 11:02:56 -04:00
parent c9e81c082f
commit 5ec98243a9
3 changed files with 46 additions and 11 deletions

View File

@ -23,6 +23,7 @@
#include "components/display_compositor/gl_helper.h"
#include "content/browser/bad_message.h"
#include "content/browser/compositor/image_transport_factory.h"
#include "content/browser/frame_host/render_widget_host_view_guest.h"
#include "content/browser/renderer_host/dip_util.h"
#include "content/browser/renderer_host/render_widget_host_delegate.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
@ -472,6 +473,7 @@ CefRenderWidgetHostViewOSR::CefRenderWidgetHostViewOSR(
#endif
weak_ptr_factory_(this) {
DCHECK(render_widget_host_);
DCHECK(!render_widget_host_->GetView());
render_widget_host_->SetView(this);
// CefBrowserHostImpl might not be created at this time for popups.
@ -1154,13 +1156,7 @@ void CefRenderWidgetHostViewOSR::Invalidate(
return;
}
const gfx::Rect& bounds_in_pixels = gfx::Rect(GetPhysicalBackingSize());
if (software_output_device_) {
software_output_device_->OnPaint(bounds_in_pixels);
} else if (copy_frame_generator_.get()) {
copy_frame_generator_->GenerateCopyFrame(true, bounds_in_pixels);
}
InvalidateInternal(gfx::Rect(GetPhysicalBackingSize()));
}
void CefRenderWidgetHostViewOSR::SendKeyEvent(
@ -1314,6 +1310,14 @@ void CefRenderWidgetHostViewOSR::RemoveGuestHostView(
guest_host_views_.erase(guest_host);
}
void CefRenderWidgetHostViewOSR::RegisterGuestViewFrameSwappedCallback(
content::RenderWidgetHostViewGuest* guest_host_view) {
guest_host_view->RegisterFrameSwappedCallback(base::MakeUnique<base::Closure>(
base::Bind(&CefRenderWidgetHostViewOSR::OnGuestViewFrameSwapped,
weak_ptr_factory_.GetWeakPtr(),
base::Unretained(guest_host_view))));
}
#if !defined(OS_MACOSX)
ui::Compositor* CefRenderWidgetHostViewOSR::GetCompositor() const {
@ -1495,3 +1499,20 @@ void CefRenderWidgetHostViewOSR::OnScrollOffsetChanged() {
}
is_scroll_offset_changed_pending_ = false;
}
void CefRenderWidgetHostViewOSR::OnGuestViewFrameSwapped(
content::RenderWidgetHostViewGuest* guest_host_view) {
InvalidateInternal(
gfx::ConvertRectToPixel(scale_factor_, guest_host_view->GetViewBounds()));
RegisterGuestViewFrameSwappedCallback(guest_host_view);
}
void CefRenderWidgetHostViewOSR::InvalidateInternal(
const gfx::Rect& bounds_in_pixels) {
if (software_output_device_) {
software_output_device_->OnPaint(bounds_in_pixels);
} else if (copy_frame_generator_.get()) {
copy_frame_generator_->GenerateCopyFrame(true, bounds_in_pixels);
}
}

View File

@ -34,6 +34,7 @@
namespace content {
class RenderWidgetHost;
class RenderWidgetHostImpl;
class RenderWidgetHostViewGuest;
class BackingStore;
}
@ -249,6 +250,11 @@ class CefRenderWidgetHostViewOSR
void AddGuestHostView(CefRenderWidgetHostViewOSR* guest_host);
void RemoveGuestHostView(CefRenderWidgetHostViewOSR* guest_host);
// Register a callback that will be executed when |guest_host_view| receives
// OnSwapCompositorFrame. The callback triggers repaint of the embedder view.
void RegisterGuestViewFrameSwappedCallback(
content::RenderWidgetHostViewGuest* guest_host_view);
CefRefPtr<CefBrowserHostImpl> browser_impl() const { return browser_impl_; }
void set_browser_impl(CefRefPtr<CefBrowserHostImpl> browser) {
browser_impl_ = browser;
@ -282,6 +288,11 @@ class CefRenderWidgetHostViewOSR
void OnScrollOffsetChanged();
void OnGuestViewFrameSwapped(
content::RenderWidgetHostViewGuest* guest_host_view);
void InvalidateInternal(const gfx::Rect& bounds_in_pixels);
#if defined(OS_MACOSX)
friend class MacHelper;

View File

@ -139,10 +139,13 @@ content::RenderWidgetHostViewBase* CefWebContentsViewOSR::CreateViewForWidget(
embedder_host_view);
embedder_host_view->AddGuestHostView(platform_widget);
return content::RenderWidgetHostViewGuest::Create(
render_widget_host,
guest_,
platform_widget->GetWeakPtr());
content::RenderWidgetHostViewGuest* guest_host_view =
content::RenderWidgetHostViewGuest::Create(
render_widget_host,
guest_,
platform_widget->GetWeakPtr());
embedder_host_view->RegisterGuestViewFrameSwappedCallback(guest_host_view);
return guest_host_view;
}
view_ = new CefRenderWidgetHostViewOSR(transparent_, render_widget_host,