Merge pull request #13501 from calixteman/13500

XFA - CDATA can be xml so parse it when required
This commit is contained in:
calixteman 2021-06-07 11:27:49 +02:00 committed by GitHub
commit 8b4acb4e36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 0 deletions

View File

@ -16,7 +16,9 @@
import {
$acceptWhitespace,
$clean,
$content,
$finalize,
$isCDATAXml,
$nsAttributes,
$onChild,
$onText,
@ -150,6 +152,13 @@ class XFAParser extends XMLParserBase {
onEndElement(name) {
const node = this._current;
if (node[$isCDATAXml]() && typeof node[$content] === "string") {
const parser = new XFAParser();
const root = parser.parse(node[$content]);
node[$content] = null;
node[$onChild](root);
}
node[$finalize]();
this._current = this._stack.pop();
if (this._current[$onChild](node)) {

View File

@ -29,6 +29,7 @@ import {
$hasItem,
$hasSettableValue,
$ids,
$isCDATAXml,
$isTransparent,
$namespaceId,
$nodeName,
@ -1746,6 +1747,10 @@ class ExData extends ContentObject {
this.usehref = attributes.usehref || "";
}
[$isCDATAXml]() {
return this.contentType === "text/html";
}
[$onChild](child) {
if (
this.contentType === "text/html" &&

View File

@ -51,6 +51,7 @@ const $hasSettableValue = Symbol();
const $ids = Symbol();
const $indexOf = Symbol();
const $insertAt = Symbol();
const $isCDATAXml = Symbol();
const $isDataValue = Symbol();
const $isDescendent = Symbol();
const $isTransparent = Symbol();
@ -148,6 +149,10 @@ class XFAObject {
return false;
}
[$isCDATAXml]() {
return false;
}
[$setId](ids) {
if (this.id && this[$namespaceId] === NamespaceIds.template.id) {
ids.set(this.id, this);
@ -970,6 +975,7 @@ export {
$ids,
$indexOf,
$insertAt,
$isCDATAXml,
$isDataValue,
$isDescendent,
$isTransparent,

View File

@ -256,6 +256,38 @@ describe("XFAParser", function () {
expect(root[$dump]()).toEqual(expected);
});
it("should parse a xfa document and parse CDATA when needed", function () {
const xml = `
<?xml version="1.0"?>
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
<template xmlns="http://www.xfa.org/schema/xfa-template/3.3">
<subform>
<field>
<extras>
<exData contentType="text/html" name="foo">
<![CDATA[<body xmlns="http://www.w3.org/1999/xhtml">
<span>hello</span></body>]]>
</exData>
</extra>
</field>
</subform>
</template>
</xdp:xdp>
`;
const root = new XFAParser().parse(xml);
const exdata = searchNode(root, root, "foo")[0];
const body = exdata[$dump]().$content[$dump]();
const expected = {
$name: "body",
attributes: {},
children: [
{ $content: "hello", $name: "span", attributes: {}, children: [] },
],
};
expect(body).toEqual(expected);
});
it("should parse a xfa document and apply some prototypes", function () {
const xml = `
<?xml version="1.0"?>