Skip to content

Commit

Permalink
Merge pull request #13721 from calixteman/layout8
Browse files Browse the repository at this point in the history
XFA - Avoid to have containers not pushed in the html
  • Loading branch information
calixteman committed Jul 13, 2021
2 parents 4d130d0 + dd55e76 commit a17bd13
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 24 deletions.
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

0 comments on commit a17bd13

Please sign in to comment.