From cf324d404922b01f19e5fd675874fb4aad7ef593 Mon Sep 17 00:00:00 2001 From: MurakamiShinyu Date: Tue, 2 Mar 2021 18:53:27 +0900 Subject: [PATCH] fix(core): Hang-up with footnote or page float on pseudo elements Fixes #703 --- packages/core/src/vivliostyle/ops.ts | 4 +++- packages/core/src/vivliostyle/vtree.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/core/src/vivliostyle/ops.ts b/packages/core/src/vivliostyle/ops.ts index 39693b895..8f8aea25e 100644 --- a/packages/core/src/vivliostyle/ops.ts +++ b/packages/core/src/vivliostyle/ops.ts @@ -687,6 +687,7 @@ export class StyleInstance const pageFloatLayoutContext = column.pageFloatLayoutContext; const deferredFloats = pageFloatLayoutContext.getDeferredPageFloatContinuations(); + // Fix for issue #681 // Prevent deferred page floats from appearing in the preceding pages, // e.g., during re-layout the TOC page with target-counter() referencing // later sections containing page floats. @@ -694,7 +695,8 @@ export class StyleInstance deferredFloats.length && deferredFloats[0].float.floatReference === "page" ) { - const deferredFloatNode = deferredFloats[0].nodePosition.steps[0].node; + const deferredFloatNode = + deferredFloats[0].float.nodePosition.steps[0].node; const deferredFloatOffset = deferredFloatNode && this.xmldoc.getNodeOffset(deferredFloatNode, 0, false); diff --git a/packages/core/src/vivliostyle/vtree.ts b/packages/core/src/vivliostyle/vtree.ts index 7d6e22f30..62ef44ff6 100644 --- a/packages/core/src/vivliostyle/vtree.ts +++ b/packages/core/src/vivliostyle/vtree.ts @@ -30,6 +30,7 @@ import * as GeometryUtil from "./geometry-util"; import * as TaskUtil from "./task-util"; import { assert } from "./asserts"; import { PageFloats, Selectors, Vtree, XmlDoc } from "./types"; +import { PseudoelementStyler } from "./pseudo-element"; export const delayedProps = { transform: true, @@ -756,6 +757,17 @@ export class NodeContext implements Vtree.NodeContext { toNodePosition(): NodePosition { let nc: NodeContext = this; const steps = []; + + // Fix for issue #703 + if ( + nc.shadowType === Vtree.ShadowType.ROOTLESS && + (nc.floatReference !== PageFloats.FloatReference.INLINE || + nc.floatSide === "footnote") && + nc.shadowContext.styler instanceof PseudoelementStyler + ) { + nc = nc.parent; + } + do { // We need fully "peeled" path, so don't record first-XXX pseudoelement // containers