diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 84773aff1cb4..ba648e5ad32b 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1660,6 +1660,18 @@ void WebContents::Invalidate() { } } +gfx::Size WebContents::GetSizeForNewRenderView( + content::WebContents* wc) const { + if (IsOffScreen() && wc == web_contents()) { + auto relay = NativeWindowRelay::FromWebContents(web_contents()); + if (relay) { + return relay->window->GetSize(); + } + } + + return gfx::Size(); +} + void WebContents::SetZoomLevel(double level) { zoom_controller_->SetZoomLevel(level); } diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 9c6ffa4f8fd1..ce35da994763 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -185,6 +185,7 @@ class WebContents : public mate::TrackableObject, void SetFrameRate(int frame_rate); int GetFrameRate() const; void Invalidate(); + gfx::Size GetSizeForNewRenderView(content::WebContents*) const override; // Methods for zoom handling. void SetZoomLevel(double level); diff --git a/atom/browser/osr/osr_render_widget_host_view.cc b/atom/browser/osr/osr_render_widget_host_view.cc index 77002358154f..605b42ec1d13 100644 --- a/atom/browser/osr/osr_render_widget_host_view.cc +++ b/atom/browser/osr/osr_render_widget_host_view.cc @@ -858,6 +858,8 @@ std::unique_ptr DCHECK(!copy_frame_generator_); DCHECK(!software_output_device_); + ResizeRootLayer(); + software_output_device_ = new OffScreenOutputDevice( transparent_, base::Bind(&OffScreenRenderWidgetHostView::OnPaint, @@ -1127,8 +1129,8 @@ void OffScreenRenderWidgetHostView::InvalidateBounds(const gfx::Rect& bounds) { void OffScreenRenderWidgetHostView::ResizeRootLayer() { SetupFrameRate(false); - const float orgScaleFactor = scale_factor_; - const bool scaleFactorDidChange = (orgScaleFactor != scale_factor_); + const float compositorScaleFactor = GetCompositor()->device_scale_factor(); + const bool scaleFactorDidChange = (compositorScaleFactor != scale_factor_); gfx::Size size; if (!IsPopupWidget()) diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index be8dc30e2545..fb37cfd2980d 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -2338,6 +2338,8 @@ describe('BrowserWindow module', function () { beforeEach(function () { if (w != null) w.destroy() w = new BrowserWindow({ + width: 100, + height: 100, show: false, webPreferences: { backgroundThrottling: false, @@ -2346,9 +2348,12 @@ describe('BrowserWindow module', function () { }) }) - it('creates offscreen window', function (done) { - w.webContents.once('paint', function (event, rect, data, size) { + it('creates offscreen window with correct size', function (done) { + w.webContents.once('paint', function (event, rect, data) { assert.notEqual(data.length, 0) + let size = data.getSize() + assertWithinDelta(size.width, 100, 2, 'width') + assertWithinDelta(size.height, 100, 2, 'height') done() }) w.loadURL('file://' + fixtures + '/api/offscreen-rendering.html') @@ -2369,7 +2374,7 @@ describe('BrowserWindow module', function () { describe('window.webContents.isPainting()', function () { it('returns whether is currently painting', function (done) { - w.webContents.once('paint', function (event, rect, data, size) { + w.webContents.once('paint', function (event, rect, data) { assert.equal(w.webContents.isPainting(), true) done() }) @@ -2393,7 +2398,7 @@ describe('BrowserWindow module', function () { w.webContents.on('dom-ready', function () { w.webContents.stopPainting() w.webContents.startPainting() - w.webContents.once('paint', function (event, rect, data, size) { + w.webContents.once('paint', function (event, rect, data) { assert.equal(w.webContents.isPainting(), true) done() }) @@ -2404,7 +2409,7 @@ describe('BrowserWindow module', function () { describe('window.webContents.getFrameRate()', function () { it('has default frame rate', function (done) { - w.webContents.once('paint', function (event, rect, data, size) { + w.webContents.once('paint', function (event, rect, data) { assert.equal(w.webContents.getFrameRate(), 60) done() }) @@ -2416,7 +2421,7 @@ describe('BrowserWindow module', function () { it('sets custom frame rate', function (done) { w.webContents.on('dom-ready', function () { w.webContents.setFrameRate(30) - w.webContents.once('paint', function (event, rect, data, size) { + w.webContents.once('paint', function (event, rect, data) { assert.equal(w.webContents.getFrameRate(), 30) done() })