Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XFA - Avoid to have containers not pushed in the html #13721

Merged
merged 1 commit into from
Jul 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 25 additions & 14 deletions src/core/xfa/layout.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,21 @@ import { measureToString } from "./html_utils.js";
* returning.
*/

function createLine(node, children) {
return {
name: "div",
attributes: {
class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"],
},
children,
};
}

function flushHTML(node) {
if (!node[$extra]) {
return null;
}

const attributes = node[$extra].attributes;
const html = {
name: "div",
Expand All @@ -66,18 +77,18 @@ function flushHTML(node) {
if (node[$extra].failingNode) {
const htmlFromFailing = node[$extra].failingNode[$flushHTML]();
if (htmlFromFailing) {
html.children.push(htmlFromFailing);
if (node.layout.endsWith("-tb")) {
html.children.push(createLine(node, [htmlFromFailing]));
} else {
html.children.push(htmlFromFailing);
}
}
}

if (html.children.length === 0) {
return null;
}

node[$extra].children = [];
delete node[$extra].line;
node[$extra].numberInLine = 0;

return html;
}

Expand All @@ -96,13 +107,7 @@ function addHTML(node, html, bbox) {
case "lr-tb":
case "rl-tb":
if (!extra.line || extra.attempt === 1) {
extra.line = {
name: "div",
attributes: {
class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"],
},
children: [],
};
extra.line = createLine(node, []);
extra.children.push(extra.line);
extra.numberInLine = 0;
}
Expand Down Expand Up @@ -281,8 +286,14 @@ function checkDimensions(node, space) {
}

if (node.w !== "") {
// True if width is enough.
return Math.round(w - space.width) <= ERROR;
if (Math.round(w - space.width) <= ERROR) {
return true;
}
if (parent[$extra].numberInLine === 0) {
return space.height > 0;
}

return false;
}

return space.width > 0;
Expand Down
52 changes: 42 additions & 10 deletions src/core/xfa/template.js
Original file line number Diff line number Diff line change
Expand Up @@ -268,10 +268,17 @@ function handleBreak(node) {
function handleOverflow(node, extraNode, space) {
const root = node[$getTemplateRoot]();
const saved = root[$extra].noLayoutFailure;
const savedMethod = extraNode[$getSubformParent];

// Replace $getSubformParent to emulate that extraNode is just
// under node.
extraNode[$getSubformParent] = () => node;

root[$extra].noLayoutFailure = true;
const res = extraNode[$toHTML](space);
node[$addHTML](res.html, res.bbox);
root[$extra].noLayoutFailure = saved;
extraNode[$getSubformParent] = savedMethod;
}

class AppearanceFilter extends StringObject {
Expand Down Expand Up @@ -2236,6 +2243,7 @@ class ExclGroup extends XFAObject {
children,
attributes,
attempt: 0,
line: null,
numberInLine: 0,
availableSpace: {
width: Math.min(this.w || Infinity, availableSpace.width),
Expand Down Expand Up @@ -2298,12 +2306,10 @@ class ExclGroup extends XFAObject {
attributes.xfaName = this.name;
}

const maxRun =
this.layout === "lr-tb" || this.layout === "rl-tb"
? MAX_ATTEMPTS_FOR_LRTB_LAYOUT
: 1;
const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb";
const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;
for (; this[$extra].attempt < maxRun; this[$extra].attempt++) {
if (this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
// If the layout is lr-tb then having attempt equals to
// MAX_ATTEMPTS_FOR_LRTB_LAYOUT-1 means that we're trying to layout
// on the next line so this on is empty.
Expand All @@ -2319,6 +2325,16 @@ class ExclGroup extends XFAObject {
if (result.isBreak()) {
return result;
}
if (
isLrTb &&
this[$extra].attempt === 0 &&
this[$extra].numberInLine === 0 &&
!this[$getTemplateRoot]()[$extra].noLayoutFailure
) {
// See comment in Subform::[$toHTML].
this[$extra].attempt = maxRun;
break;
}
}

if (!isSplittable) {
Expand Down Expand Up @@ -4646,6 +4662,7 @@ class Subform extends XFAObject {

Object.assign(this[$extra], {
children,
line: null,
attributes,
attempt: 0,
numberInLine: 0,
Expand Down Expand Up @@ -4729,12 +4746,10 @@ class Subform extends XFAObject {
}
}

const maxRun =
this.layout === "lr-tb" || this.layout === "rl-tb"
? MAX_ATTEMPTS_FOR_LRTB_LAYOUT
: 1;
const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb";
const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;
for (; this[$extra].attempt < maxRun; this[$extra].attempt++) {
if (this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
// If the layout is lr-tb then having attempt equals to
// MAX_ATTEMPTS_FOR_LRTB_LAYOUT-1 means that we're trying to layout
// on the next line so this on is empty.
Expand All @@ -4750,6 +4765,23 @@ class Subform extends XFAObject {
if (result.isBreak()) {
return result;
}
if (
isLrTb &&
this[$extra].attempt === 0 &&
this[$extra].numberInLine === 0 &&
!root[$extra].noLayoutFailure
) {
// We're failing to put the first element on the line so no
// need to test on the next line.
// The goal is not only to avoid some useless checks but to avoid
// bugs too: if a descendant managed to put a node and failed
// on the next one, going to the next step here will imply to
// visit the descendant again, clear [$extra].children and restart
// on the failing node, consequently the first node just disappears
// because it has never been flushed.
this[$extra].attempt = maxRun;
break;
}
}

if (!isSplittable) {
Expand Down
1 change: 1 addition & 0 deletions test/pdfs/xfa_issue13668.pdf.link
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://web.archive.org/web/20210711170923/https://www.placementsmondiauxsunlife.com/content/dam/sunlife/regional/canada/documents/slgi/4839-I-F.pdf
8 changes: 8 additions & 0 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -1192,6 +1192,14 @@
"enableXfa": true,
"type": "eq"
},
{ "id": "xfa_issue13668",
"file": "pdfs/xfa_issue13668.pdf",
"md5": "8a5ed3c8a58b425b1ec53329334a0f5b",
"link": true,
"rounds": 1,
"enableXfa": true,
"type": "eq"
},
{ "id": "xfa_issue13633",
"file": "pdfs/xfa_issue13633.pdf",
"md5": "e5b0d09285ca6a140eba08d740be0ea0",
Expand Down