Merge pull request #13573 from calixteman/bug1716838

XFA - Fix the way to select page on breaking
This commit is contained in:
calixteman 2021-06-21 15:06:03 +02:00 committed by GitHub
commit da19997781
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 106 additions and 50 deletions

View File

@ -19,6 +19,7 @@ import {
$appendChild, $appendChild,
$childrenToHTML, $childrenToHTML,
$clean, $clean,
$cleanPage,
$content, $content,
$extra, $extra,
$finalize, $finalize,
@ -37,6 +38,7 @@ import {
$isCDATAXml, $isCDATAXml,
$isSplittable, $isSplittable,
$isTransparent, $isTransparent,
$isUsable,
$namespaceId, $namespaceId,
$nodeName, $nodeName,
$onChild, $onChild,
@ -2398,8 +2400,10 @@ class Field extends XFAObject {
const caption = this.caption ? this.caption[$toHTML]().html : null; const caption = this.caption ? this.caption[$toHTML]().html : null;
if (!caption) { if (!caption) {
// Even if no caption this class will help to center the ui. if (ui.attributes.class) {
ui.attributes.class.push("xfaLeft"); // Even if no caption this class will help to center the ui.
ui.attributes.class.push("xfaLeft");
}
return HTMLResult.success(createWrapper(this, html), bbox); return HTMLResult.success(createWrapper(this, html), bbox);
} }
@ -2633,13 +2637,8 @@ class Font extends XFAObject {
// TODO: fontHorizontalScale // TODO: fontHorizontalScale
// TODO: fontVerticalScale // TODO: fontVerticalScale
if (this.kerningMode !== "none") { style.fontKerning = this.kerningMode === "none" ? "none" : "normal";
style.fontKerning = "normal"; style.letterSpacing = measureToString(this.letterSpacing);
}
if (this.letterSpacing) {
style.letterSpacing = measureToString(this.letterSpacing);
}
if (this.lineThrough !== 0) { if (this.lineThrough !== 0) {
style.textDecoration = "line-through"; style.textDecoration = "line-through";
@ -2659,9 +2658,7 @@ class Font extends XFAObject {
// TODO: overlinePeriod // TODO: overlinePeriod
if (this.posture !== "normal") { style.fontStyle = this.posture;
style.fontStyle = this.posture;
}
const fontSize = measureToString(0.99 * this.size); const fontSize = measureToString(0.99 * this.size);
if (fontSize !== "10px") { if (fontSize !== "10px") {
@ -2679,9 +2676,7 @@ class Font extends XFAObject {
// TODO: underlinePeriod // TODO: underlinePeriod
if (this.weight !== "normal") { style.fontWeight = this.weight;
style.fontWeight = this.weight;
}
return style; return style;
} }
@ -3286,24 +3281,39 @@ class PageArea extends XFAObject {
this.subform = new XFAObjectArray(); this.subform = new XFAObjectArray();
} }
[$isUsable]() {
if (!this[$extra]) {
this[$extra] = {
numberOfUse: 0,
};
return true;
}
return (
!this.occur ||
this.occur.max === -1 ||
this[$extra].numberOfUse < this.occur.max
);
}
[$cleanPage]() {
delete this[$extra];
}
[$getNextPage]() { [$getNextPage]() {
if (!this[$extra]) { if (!this[$extra]) {
this[$extra] = { this[$extra] = {
numberOfUse: 1, numberOfUse: 0,
}; };
} }
const parent = this[$getParent](); const parent = this[$getParent]();
if (parent.relation === "orderedOccurrence") { if (parent.relation === "orderedOccurrence") {
if ( if (this[$isUsable]()) {
this.occur &&
(this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max)
) {
this[$extra].numberOfUse += 1; this[$extra].numberOfUse += 1;
return this; return this;
} }
} }
delete this[$extra];
return parent[$getNextPage](); return parent[$getNextPage]();
} }
@ -3313,12 +3323,6 @@ class PageArea extends XFAObject {
[$toHTML]() { [$toHTML]() {
// TODO: incomplete. // TODO: incomplete.
if (!this[$extra]) {
this[$extra] = {
numberOfUse: 1,
};
}
const children = []; const children = [];
this[$extra].children = children; this[$extra].children = children;
@ -3389,43 +3393,57 @@ class PageSet extends XFAObject {
this.pageSet = new XFAObjectArray(); this.pageSet = new XFAObjectArray();
} }
[$cleanPage]() {
for (const page of this.pageArea.children) {
page[$cleanPage]();
}
for (const page of this.pageSet.children) {
page[$cleanPage]();
}
}
[$isUsable]() {
return (
!this.occur ||
this.occur.max === -1 ||
this[$extra].numberOfUse < this.occur.max
);
}
[$getNextPage]() { [$getNextPage]() {
if (!this[$extra]) { if (!this[$extra]) {
this[$extra] = { this[$extra] = {
numberOfUse: 1, numberOfUse: 1,
currentIndex: -1, pageIndex: -1,
pageSetIndex: -1,
}; };
} }
if (this.relation === "orderedOccurrence") { if (this.relation === "orderedOccurrence") {
if (this[$extra].currentIndex + 1 < this.pageArea.children.length) { if (this[$extra].pageIndex + 1 < this.pageArea.children.length) {
this[$extra].currentIndex += 1; this[$extra].pageIndex += 1;
return this.pageArea.children[this[$extra].currentIndex]; const pageArea = this.pageArea.children[this[$extra].pageIndex];
return pageArea[$getNextPage]();
} }
if (this[$extra].currentIndex + 1 < this.pageSet.children.length) { if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) {
this[$extra].currentIndex += 1; this[$extra].pageSetIndex += 1;
return this.pageSet.children[this[$extra].currentIndex]; return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage]();
} }
if ( if (this[$isUsable]()) {
this.occur &&
(this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max)
) {
this[$extra].numberOfUse += 1; this[$extra].numberOfUse += 1;
this[$extra].currentIndex = 0; this[$extra].pageIndex = -1;
if (this.pageArea.children.length > 0) { this[$extra].pageSetIndex = -1;
return this.pageArea.children[0]; return this[$getNextPage]();
}
return this.pageSet.children[0][$getNextPage]();
} }
delete this[$extra];
const parent = this[$getParent](); const parent = this[$getParent]();
if (parent instanceof PageSet) { if (parent instanceof PageSet) {
return parent[$getNextPage](); return parent[$getNextPage]();
} }
this[$cleanPage]();
return this[$getNextPage](); return this[$getNextPage]();
} }
const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber; const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber;
@ -4495,6 +4513,8 @@ class Template extends XFAObject {
}; };
const root = this.subform.children[0]; const root = this.subform.children[0];
root.pageSet[$cleanPage]();
const pageAreas = root.pageSet.pageArea.children; const pageAreas = root.pageSet.pageArea.children;
const mainHtml = { const mainHtml = {
name: "div", name: "div",
@ -4541,10 +4561,15 @@ class Template extends XFAObject {
pageArea = pageAreas[0]; pageArea = pageAreas[0];
} }
pageArea[$extra] = {
numberOfUse: 1,
};
const pageAreaParent = pageArea[$getParent](); const pageAreaParent = pageArea[$getParent]();
pageAreaParent[$extra] = { pageAreaParent[$extra] = {
numberOfUse: 1, numberOfUse: 1,
currentIndex: pageAreaParent.pageArea.children.indexOf(pageArea), pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea),
pageSetIndex: 0,
}; };
let targetPageArea; let targetPageArea;
@ -4645,19 +4670,26 @@ class Template extends XFAObject {
} }
if (node.targetType === "pageArea") { if (node.targetType === "pageArea") {
if (!(target instanceof PageArea)) {
target = null;
}
if (startNew) { if (startNew) {
targetPageArea = target || pageArea;
flush(i); flush(i);
i = Infinity; i = Infinity;
} else if (target === pageArea || !(target instanceof PageArea)) { } else if (target && target !== pageArea) {
// Just ignore the break and do layout again.
i--;
} else {
// We must stop the contentAreas filling and go to the next page.
targetPageArea = target; targetPageArea = target;
flush(i); flush(i);
i = Infinity; i = Infinity;
} else {
i--;
} }
} else if (node.targetType === "contentArea") { } else if (node.targetType === "contentArea") {
if (!(target instanceof ContentArea)) {
target = null;
}
const index = contentAreas.findIndex(e => e === target); const index = contentAreas.findIndex(e => e === target);
if (index !== -1) { if (index !== -1) {
flush(i); flush(i);
@ -4711,6 +4743,13 @@ class Template extends XFAObject {
} }
this[$extra].pageNumber += 1; this[$extra].pageNumber += 1;
if (targetPageArea) {
if (targetPageArea[$isUsable]()) {
targetPageArea[$extra].numberOfUse += 1;
} else {
targetPageArea = null;
}
}
pageArea = targetPageArea || pageArea[$getNextPage](); pageArea = targetPageArea || pageArea[$getNextPage]();
} }
} }

View File

@ -25,6 +25,7 @@ const $addHTML = Symbol();
const $appendChild = Symbol(); const $appendChild = Symbol();
const $childrenToHTML = Symbol(); const $childrenToHTML = Symbol();
const $clean = Symbol(); const $clean = Symbol();
const $cleanPage = Symbol();
const $cleanup = Symbol(); const $cleanup = Symbol();
const $clone = Symbol(); const $clone = Symbol();
const $consumed = Symbol(); const $consumed = Symbol();
@ -59,6 +60,7 @@ const $isDataValue = Symbol();
const $isDescendent = Symbol(); const $isDescendent = Symbol();
const $isSplittable = Symbol(); const $isSplittable = Symbol();
const $isTransparent = Symbol(); const $isTransparent = Symbol();
const $isUsable = Symbol();
const $lastAttribute = Symbol(); const $lastAttribute = Symbol();
const $namespaceId = Symbol("namespaceId"); const $namespaceId = Symbol("namespaceId");
const $nodeName = Symbol("nodeName"); const $nodeName = Symbol("nodeName");
@ -978,6 +980,7 @@ export {
$appendChild, $appendChild,
$childrenToHTML, $childrenToHTML,
$clean, $clean,
$cleanPage,
$cleanup, $cleanup,
$clone, $clone,
$consumed, $consumed,
@ -1012,6 +1015,7 @@ export {
$isDescendent, $isDescendent,
$isSplittable, $isSplittable,
$isTransparent, $isTransparent,
$isUsable,
$namespaceId, $namespaceId,
$nodeName, $nodeName,
$nsAttributes, $nsAttributes,

View File

@ -0,0 +1 @@
https://bugzilla.mozilla.org/attachment.cgi?id=9227473

View File

@ -962,6 +962,14 @@
"enableXfa": true, "enableXfa": true,
"type": "eq" "type": "eq"
}, },
{ "id": "xfa_bug1716838",
"file": "pdfs/xfa_bug1716838.pdf",
"md5": "564ecff67be690b43c2a144ae5967034",
"link": true,
"rounds": 1,
"enableXfa": true,
"type": "eq"
},
{ "id": "xfa_candidate_petitions", { "id": "xfa_candidate_petitions",
"file": "pdfs/xfa_candidate_petitions.pdf", "file": "pdfs/xfa_candidate_petitions.pdf",
"md5": "0db96a00667f8f58f94cf81022e69341", "md5": "0db96a00667f8f58f94cf81022e69341",

View File

@ -118,6 +118,10 @@ describe("XFAFactory", function () {
expect(draw.attributes.style).toEqual({ expect(draw.attributes.style).toEqual({
color: "#0c1722", color: "#0c1722",
fontFamily: '"FooBar"', fontFamily: '"FooBar"',
fontKerning: "none",
letterSpacing: "0px",
fontStyle: "normal",
fontWeight: "normal",
fontSize: "6.93px", fontSize: "6.93px",
margin: "1px 4px 2px 3px", margin: "1px 4px 2px 3px",
verticalAlign: "2px", verticalAlign: "2px",