XFA - Remove namespace from nodes under xfa:data node
- in real life some xfa contains xml like <xfa:data><xfa:Foo><xfa:Bar>...</xfa:data> since there are no Foo or Bar in the xfa namespace the JS representation are empty and that leads to errors. - so the idea is to make all nodes under xfa:data namespace agnostic which means that ns are removed from nodes in the parser but only xfa:data descendants.
This commit is contained in:
parent
6c9b6bc599
commit
5555114bb3
@ -18,6 +18,7 @@ import {
|
|||||||
$cleanup,
|
$cleanup,
|
||||||
$finalize,
|
$finalize,
|
||||||
$ids,
|
$ids,
|
||||||
|
$isNsAgnostic,
|
||||||
$nsAttributes,
|
$nsAttributes,
|
||||||
$onChild,
|
$onChild,
|
||||||
$resolvePrototypes,
|
$resolvePrototypes,
|
||||||
@ -67,6 +68,7 @@ class Empty extends XFAObject {
|
|||||||
class Builder {
|
class Builder {
|
||||||
constructor() {
|
constructor() {
|
||||||
this._namespaceStack = [];
|
this._namespaceStack = [];
|
||||||
|
this._nsAgnosticLevel = 0;
|
||||||
|
|
||||||
// Each prefix has its own stack
|
// Each prefix has its own stack
|
||||||
this._namespacePrefixes = new Map();
|
this._namespacePrefixes = new Map();
|
||||||
@ -118,18 +120,27 @@ class Builder {
|
|||||||
(namespaceToUse && namespaceToUse[$buildXFAObject](name, attributes)) ||
|
(namespaceToUse && namespaceToUse[$buildXFAObject](name, attributes)) ||
|
||||||
new Empty();
|
new Empty();
|
||||||
|
|
||||||
|
if (node[$isNsAgnostic]()) {
|
||||||
|
this._nsAgnosticLevel++;
|
||||||
|
}
|
||||||
|
|
||||||
// In case the node has some namespace things,
|
// In case the node has some namespace things,
|
||||||
// we must pop the different stacks.
|
// we must pop the different stacks.
|
||||||
if (hasNamespaceDef || prefixes) {
|
if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) {
|
||||||
node[$cleanup] = {
|
node[$cleanup] = {
|
||||||
hasNamespace: hasNamespaceDef,
|
hasNamespace: hasNamespaceDef,
|
||||||
prefixes,
|
prefixes,
|
||||||
|
nsAgnostic: node[$isNsAgnostic](),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isNsAgnostic() {
|
||||||
|
return this._nsAgnosticLevel > 0;
|
||||||
|
}
|
||||||
|
|
||||||
_searchNamespace(nsName) {
|
_searchNamespace(nsName) {
|
||||||
let ns = this._namespaces.get(nsName);
|
let ns = this._namespaces.get(nsName);
|
||||||
if (ns) {
|
if (ns) {
|
||||||
@ -178,7 +189,7 @@ class Builder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
clean(data) {
|
clean(data) {
|
||||||
const { hasNamespace, prefixes } = data;
|
const { hasNamespace, prefixes, nsAgnostic } = data;
|
||||||
if (hasNamespace) {
|
if (hasNamespace) {
|
||||||
this._currentNamespace = this._namespaceStack.pop();
|
this._currentNamespace = this._namespaceStack.pop();
|
||||||
}
|
}
|
||||||
@ -187,6 +198,9 @@ class Builder {
|
|||||||
this._namespacePrefixes.get(prefix).pop();
|
this._namespacePrefixes.get(prefix).pop();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (nsAgnostic) {
|
||||||
|
this._nsAgnosticLevel--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
$appendChild,
|
$appendChild,
|
||||||
|
$isNsAgnostic,
|
||||||
$namespaceId,
|
$namespaceId,
|
||||||
$nodeName,
|
$nodeName,
|
||||||
$onChild,
|
$onChild,
|
||||||
@ -29,6 +30,10 @@ class Data extends XmlObject {
|
|||||||
constructor(attributes) {
|
constructor(attributes) {
|
||||||
super(DATASETS_NS_ID, "data", attributes);
|
super(DATASETS_NS_ID, "data", attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[$isNsAgnostic]() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Datasets extends XFAObject {
|
class Datasets extends XFAObject {
|
||||||
|
@ -118,12 +118,12 @@ class XFAParser extends XMLParserBase {
|
|||||||
return [namespace, prefixes, attributeObj];
|
return [namespace, prefixes, attributeObj];
|
||||||
}
|
}
|
||||||
|
|
||||||
_getNameAndPrefix(name) {
|
_getNameAndPrefix(name, nsAgnostic) {
|
||||||
const i = name.indexOf(":");
|
const i = name.indexOf(":");
|
||||||
if (i === -1) {
|
if (i === -1) {
|
||||||
return [name, null];
|
return [name, null];
|
||||||
}
|
}
|
||||||
return [name.substring(i + 1), name.substring(0, i)];
|
return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)];
|
||||||
}
|
}
|
||||||
|
|
||||||
onBeginElement(tagName, attributes, isEmpty) {
|
onBeginElement(tagName, attributes, isEmpty) {
|
||||||
@ -131,7 +131,10 @@ class XFAParser extends XMLParserBase {
|
|||||||
attributes,
|
attributes,
|
||||||
tagName
|
tagName
|
||||||
);
|
);
|
||||||
const [name, nsPrefix] = this._getNameAndPrefix(tagName);
|
const [name, nsPrefix] = this._getNameAndPrefix(
|
||||||
|
tagName,
|
||||||
|
this._builder.isNsAgnostic()
|
||||||
|
);
|
||||||
const node = this._builder.build({
|
const node = this._builder.build({
|
||||||
nsPrefix,
|
nsPrefix,
|
||||||
name,
|
name,
|
||||||
|
@ -60,6 +60,7 @@ const $isCDATAXml = Symbol();
|
|||||||
const $isBindable = Symbol();
|
const $isBindable = Symbol();
|
||||||
const $isDataValue = Symbol();
|
const $isDataValue = Symbol();
|
||||||
const $isDescendent = Symbol();
|
const $isDescendent = Symbol();
|
||||||
|
const $isNsAgnostic = Symbol();
|
||||||
const $isSplittable = Symbol();
|
const $isSplittable = Symbol();
|
||||||
const $isThereMoreWidth = Symbol();
|
const $isThereMoreWidth = Symbol();
|
||||||
const $isTransparent = Symbol();
|
const $isTransparent = Symbol();
|
||||||
@ -160,6 +161,10 @@ class XFAObject {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[$isNsAgnostic]() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
[$acceptWhitespace]() {
|
[$acceptWhitespace]() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1087,6 +1092,7 @@ export {
|
|||||||
$isCDATAXml,
|
$isCDATAXml,
|
||||||
$isDataValue,
|
$isDataValue,
|
||||||
$isDescendent,
|
$isDescendent,
|
||||||
|
$isNsAgnostic,
|
||||||
$isSplittable,
|
$isSplittable,
|
||||||
$isThereMoreWidth,
|
$isThereMoreWidth,
|
||||||
$isTransparent,
|
$isTransparent,
|
||||||
|
1
test/pdfs/xfa_bug1721600.pdf.link
Normal file
1
test/pdfs/xfa_bug1721600.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
https://bugzilla.mozilla.org/attachment.cgi?id=9232367
|
@ -952,6 +952,15 @@
|
|||||||
"enableXfa": true,
|
"enableXfa": true,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "xfa_bug1721600",
|
||||||
|
"file": "pdfs/xfa_bug1721600.pdf",
|
||||||
|
"md5": "5f514f476169eeb7254da380a8db495a",
|
||||||
|
"link": true,
|
||||||
|
"rounds": 1,
|
||||||
|
"lastPage": 1,
|
||||||
|
"enableXfa": true,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "xfa_bug1720182",
|
{ "id": "xfa_bug1720182",
|
||||||
"file": "pdfs/xfa_bug1720182.pdf",
|
"file": "pdfs/xfa_bug1720182.pdf",
|
||||||
"md5": "1351f816f0509fe750ca61ef2bd40872",
|
"md5": "1351f816f0509fe750ca61ef2bd40872",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user