From d5edfea7cbe640ee69f5a21909a253a35fe73e4d Mon Sep 17 00:00:00 2001 From: Andrew Korshunov Date: Sat, 9 Sep 2017 23:46:35 -0500 Subject: [PATCH 1/2] Support CSS "page-break-before" avoid and always for table rows --- .../WebCore/rendering/RenderTableSection.cpp | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/3rdparty/webkit/Source/WebCore/rendering/RenderTableSection.cpp b/src/3rdparty/webkit/Source/WebCore/rendering/RenderTableSection.cpp index 43328c2cc9e..2bb3c74d7ea 100644 --- a/src/3rdparty/webkit/Source/WebCore/rendering/RenderTableSection.cpp +++ b/src/3rdparty/webkit/Source/WebCore/rendering/RenderTableSection.cpp @@ -529,11 +529,49 @@ int RenderTableSection::layoutRows(int toAdd, int headHeight, int footHeight) rowRequiredHeight = cellRequiredHeight; } } + int requiredHeight = max(logicalRowHeights[r], rowRequiredHeight); - if (requiredHeight >= availableHeight && requiredHeight < pageLogicalHeight) { - pageOffset += remainingLogicalHeight + headHeight; - if (requiredHeight > availableHeight) { - m_rowPos[r] += remainingLogicalHeight + headHeight; + bool breakAlways = rowRenderer->style()->pageBreakBefore() == PBALWAYS; + + if (breakAlways || (requiredHeight >= availableHeight && requiredHeight < pageLogicalHeight)) { + if (rowRenderer->style()->pageBreakBefore() == PBAVOID) { + // We can't break a page here. Try to find a row at the same page (except first row) which we can break before. + int rowToBreakBefore = 0; + + for (int r1 = r - 1; r1 > 0; --r1) { + RenderTableRow* row1Renderer = m_grid[r1].rowRenderer; + + if (row1Renderer->style()->pageBreakBefore() != PBAVOID) { + rowToBreakBefore = r1; + break; + } + } + + if (rowToBreakBefore > 0) { + // Check if rows from rowToBreakBefore to r even fit a single page - otherwise it doesn't make sense. + + if (m_rowPos[r] - m_rowPos[rowToBreakBefore] + requiredHeight <= pageLogicalHeight - headHeight - footHeight - vspacing) { + int dy = m_rowPos[r] - m_rowPos[rowToBreakBefore] + remainingLogicalHeight + headHeight; + + // Push all the rows from rowToBreakBefore to r for dy pixels down. + for (int r1 = rowToBreakBefore; r1 <= r; r1++) { + m_rowPos[r1] += dy; + } + + pageOffset += dy; + + remainingLogicalHeight = pageLogicalHeight - layoutState->pageLogicalOffset(m_rowPos[r]) % pageLogicalHeight; + availableHeight = remainingLogicalHeight - footHeight - vspacing; + } + } + } + + if (breakAlways || requiredHeight >= availableHeight) { + pageOffset += remainingLogicalHeight + headHeight; + + if (breakAlways || requiredHeight > availableHeight) { + m_rowPos[r] += remainingLogicalHeight + headHeight; + } } } } From 483070da3b63587286662d99cb30b9393cfdf9f6 Mon Sep 17 00:00:00 2001 From: Andrew Korshunov Date: Wed, 18 Oct 2017 12:57:28 -0500 Subject: [PATCH 2/2] Avoid segfault on pages with ChartJS canvas (from @quique github user) --- .../WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/3rdparty/webkit/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp b/src/3rdparty/webkit/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp index 9e16ad1eba8..8fa96b3dd3f 100644 --- a/src/3rdparty/webkit/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp +++ b/src/3rdparty/webkit/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp @@ -181,7 +181,9 @@ JSValue JSCanvasRenderingContext2D::setLineDash(ExecState* exec) JSValue v = array->get(exec, i); lineDash.append(v.toNumber(exec)); } - context->setLineDash(lineDash, lineDash[0]); + if (length > 0) { + context->setLineDash(lineDash, lineDash[0]); + } return jsUndefined(); }