diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index d9b47d0555..9418162840 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1418,6 +1418,15 @@ int WebContents::GetFrameRate() const { return osr_rwhv ? osr_rwhv->GetFrameRate() : 0; } +void WebContents::Invalidate() { + if (!IsOffScreen()) + return; + + auto* osr_rwhv = static_cast( + web_contents()->GetRenderWidgetHostView()); + if (osr_rwhv) + osr_rwhv->Invalidate(); +} v8::Local WebContents::GetWebPreferences(v8::Isolate* isolate) { WebContentsPreferences* web_preferences = @@ -1527,6 +1536,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate, .SetMethod("isPainting", &WebContents::IsPainting) .SetMethod("setFrameRate", &WebContents::SetFrameRate) .SetMethod("getFrameRate", &WebContents::GetFrameRate) + .SetMethod("invalidate", &WebContents::Invalidate) .SetMethod("getType", &WebContents::GetType) .SetMethod("getWebPreferences", &WebContents::GetWebPreferences) .SetMethod("getOwnerBrowserWindow", &WebContents::GetOwnerBrowserWindow) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index aa78ec9ae8..a6b3fd3fd7 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -164,6 +164,7 @@ class WebContents : public mate::TrackableObject, bool IsPainting() const; void SetFrameRate(int frame_rate); int GetFrameRate() const; + void Invalidate(); // Callback triggered on permission response. void OnEnterFullscreenModeForTab(content::WebContents* source, diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 8dbed6d33d..1e71a39795 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -205,6 +205,10 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) { void NativeWindow::SetSize(const gfx::Size& size, bool animate) { SetBounds(gfx::Rect(GetPosition(), size), animate); + + const auto view = web_contents()->GetRenderWidgetHostView(); + if (view) + view->SetSize(size); } gfx::Size NativeWindow::GetSize() { diff --git a/atom/browser/osr/osr_output_device.cc b/atom/browser/osr/osr_output_device.cc index dd80613633..6245271792 100644 --- a/atom/browser/osr/osr_output_device.cc +++ b/atom/browser/osr/osr_output_device.cc @@ -24,6 +24,8 @@ void OffScreenOutputDevice::Resize( const gfx::Size& pixel_size, float scale_factor) { scale_factor_ = scale_factor; + printf("OffScreenOutputDevice::Resize\n"); + if (viewport_pixel_size_ == pixel_size) return; viewport_pixel_size_ = pixel_size; diff --git a/atom/browser/osr/osr_render_widget_host_view.cc b/atom/browser/osr/osr_render_widget_host_view.cc index 606aba3ddd..bddb604878 100644 --- a/atom/browser/osr/osr_render_widget_host_view.cc +++ b/atom/browser/osr/osr_render_widget_host_view.cc @@ -439,11 +439,7 @@ content::RenderWidgetHost* OffScreenRenderWidgetHostView::GetRenderWidgetHost() void OffScreenRenderWidgetHostView::SetSize(const gfx::Size& size) { size_ = size; - const gfx::Size& size_in_pixels = - gfx::ConvertSizeToPixel(scale_factor_, size); - - GetRootLayer()->SetBounds(gfx::Rect(size)); - GetCompositor()->SetScaleAndSize(scale_factor_, size_in_pixels); + ResizeRootLayer(); } void OffScreenRenderWidgetHostView::SetBounds(const gfx::Rect& new_bounds) { @@ -892,6 +888,17 @@ void OffScreenRenderWidgetHostView::SetupFrameRate(bool force) { } } +void OffScreenRenderWidgetHostView::Invalidate() { + const gfx::Rect& bounds_in_pixels = GetViewBounds(); + + printf("Invalidate\n"); + 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); + } +} + void OffScreenRenderWidgetHostView::ResizeRootLayer() { SetupFrameRate(false); diff --git a/atom/browser/osr/osr_render_widget_host_view.h b/atom/browser/osr/osr_render_widget_host_view.h index c6641ec06a..4ca2685603 100644 --- a/atom/browser/osr/osr_render_widget_host_view.h +++ b/atom/browser/osr/osr_render_widget_host_view.h @@ -193,6 +193,8 @@ class OffScreenRenderWidgetHostView ui::Layer* GetRootLayer() const; content::DelegatedFrameHost* GetDelegatedFrameHost() const; + void Invalidate(); + content::RenderWidgetHostImpl* render_widget_host() const { return render_widget_host_; } NativeWindow* window() const { return native_window_; }