diff --git a/src/core/layout/qgslayoutmultiframe.cpp b/src/core/layout/qgslayoutmultiframe.cpp index 300821c2ca1..3fdb5124fa2 100644 --- a/src/core/layout/qgslayoutmultiframe.cpp +++ b/src/core/layout/qgslayoutmultiframe.cpp @@ -148,7 +148,7 @@ void QgsLayoutMultiFrame::recalculateFrameSizes() } //at end of frames but there is still content left. Add other pages if ResizeMode == - if ( currentItem && mResizeMode != UseExistingFrames ) + if ( mLayout->pageCollection()->pageCount() > 0 && currentItem && mResizeMode != UseExistingFrames ) { while ( ( mResizeMode == RepeatOnEveryPage ) || currentY < totalHeight ) { diff --git a/tests/src/core/testqgslayoutmultiframe.cpp b/tests/src/core/testqgslayoutmultiframe.cpp index 348c1fbe7db..c417193720d 100644 --- a/tests/src/core/testqgslayoutmultiframe.cpp +++ b/tests/src/core/testqgslayoutmultiframe.cpp @@ -50,6 +50,7 @@ class TestQgsLayoutMultiFrame : public QObject void registry(); void deleteFrame(); void writeReadXml(); + void noPageNoCrash(); private: QgsLayout *mLayout = nullptr; @@ -620,5 +621,35 @@ void TestQgsLayoutMultiFrame::writeReadXml() QCOMPARE( html2->frames(), QList< QgsLayoutFrame * >() << frame2 ); } +void TestQgsLayoutMultiFrame::noPageNoCrash() +{ + QgsProject p; + + // create layout, no pages + QgsLayout c( &p ); + // add an multiframe + QgsLayoutItemHtml *html = new QgsLayoutItemHtml( &c ); + c.addMultiFrame( html ); + html->setContentMode( QgsLayoutItemHtml::ManualHtml ); + html->setHtml( QStringLiteral( "
hi
" ) ); + QgsLayoutFrame *frame = new QgsLayoutFrame( &c, html ); + frame->attemptSetSceneRect( QRectF( 1, 1, 10, 1 ) ); + c.addLayoutItem( frame ); + html->addFrame( frame ); + + html->setResizeMode( QgsLayoutMultiFrame::UseExistingFrames ); + html->recalculateFrameSizes(); + QCOMPARE( html->frameCount(), 1 ); + html->setResizeMode( QgsLayoutMultiFrame::ExtendToNextPage ); + html->recalculateFrameSizes(); + QCOMPARE( html->frameCount(), 1 ); + html->setResizeMode( QgsLayoutMultiFrame::RepeatOnEveryPage ); + html->recalculateFrameSizes(); + QCOMPARE( html->frameCount(), 1 ); + html->setResizeMode( QgsLayoutMultiFrame::RepeatUntilFinished ); + html->recalculateFrameSizes(); + QCOMPARE( html->frameCount(), 1 ); +} + QGSTEST_MAIN( TestQgsLayoutMultiFrame ) #include "testqgslayoutmultiframe.moc"