Skip to content

Commit

Permalink
Merge pull request #12503 from calixteman/no_quad
Browse files Browse the repository at this point in the history
Invalidate an annotation with no quadPoints (when it's required)
  • Loading branch information
timvandermeij authored Oct 22, 2020
2 parents 4258586 + d2ef878 commit 8cf2749
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 19 deletions.
46 changes: 35 additions & 11 deletions src/core/annotation.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,11 @@ function getQuadPoints(dict, rect) {
// The region is described as a number of quadrilaterals.
// Each quadrilateral must consist of eight coordinates.
const quadPoints = dict.getArray("QuadPoints");
if (!Array.isArray(quadPoints) || quadPoints.length % 8 > 0) {
if (
!Array.isArray(quadPoints) ||
quadPoints.length === 0 ||
quadPoints.length % 8 > 0
) {
return null;
}

Expand Down Expand Up @@ -312,6 +316,9 @@ class Annotation {
* @type {boolean}
*/
get viewable() {
if (this.data.quadPoints === null) {
return false;
}
if (this.flags === 0) {
return true;
}
Expand All @@ -322,6 +329,9 @@ class Annotation {
* @type {boolean}
*/
get printable() {
if (this.data.quadPoints === null) {
return false;
}
if (this.flags === 0) {
return false;
}
Expand Down Expand Up @@ -2222,10 +2232,11 @@ class HighlightAnnotation extends MarkupAnnotation {
super(parameters);

this.data.annotationType = AnnotationType.HIGHLIGHT;

const quadPoints = getQuadPoints(parameters.dict, null);
const quadPoints = (this.data.quadPoints = getQuadPoints(
parameters.dict,
null
));
if (quadPoints) {
this.data.quadPoints = quadPoints;
if (!this.appearance) {
// Default color is yellow in Acrobat Reader
const fillColor = this.color
Expand All @@ -2245,6 +2256,8 @@ class HighlightAnnotation extends MarkupAnnotation {
},
});
}
} else {
this.data.hasPopup = false;
}
}
}
Expand All @@ -2254,10 +2267,11 @@ class UnderlineAnnotation extends MarkupAnnotation {
super(parameters);

this.data.annotationType = AnnotationType.UNDERLINE;

const quadPoints = getQuadPoints(parameters.dict, null);
const quadPoints = (this.data.quadPoints = getQuadPoints(
parameters.dict,
null
));
if (quadPoints) {
this.data.quadPoints = quadPoints;
if (!this.appearance) {
// Default color is black
const strokeColor = this.color
Expand All @@ -2275,6 +2289,8 @@ class UnderlineAnnotation extends MarkupAnnotation {
},
});
}
} else {
this.data.hasPopup = false;
}
}
}
Expand All @@ -2285,9 +2301,11 @@ class SquigglyAnnotation extends MarkupAnnotation {

this.data.annotationType = AnnotationType.SQUIGGLY;

const quadPoints = getQuadPoints(parameters.dict, null);
const quadPoints = (this.data.quadPoints = getQuadPoints(
parameters.dict,
null
));
if (quadPoints) {
this.data.quadPoints = quadPoints;
if (!this.appearance) {
// Default color is black
const strokeColor = this.color
Expand All @@ -2314,6 +2332,8 @@ class SquigglyAnnotation extends MarkupAnnotation {
},
});
}
} else {
this.data.hasPopup = false;
}
}
}
Expand All @@ -2324,9 +2344,11 @@ class StrikeOutAnnotation extends MarkupAnnotation {

this.data.annotationType = AnnotationType.STRIKEOUT;

const quadPoints = getQuadPoints(parameters.dict, null);
const quadPoints = (this.data.quadPoints = getQuadPoints(
parameters.dict,
null
));
if (quadPoints) {
this.data.quadPoints = quadPoints;
if (!this.appearance) {
// Default color is black
const strokeColor = this.color
Expand All @@ -2350,6 +2372,8 @@ class StrikeOutAnnotation extends MarkupAnnotation {
},
});
}
} else {
this.data.hasPopup = false;
}
}
}
Expand Down
38 changes: 30 additions & 8 deletions test/unit/annotation_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3367,7 +3367,7 @@ describe("annotation", function () {
});

describe("HightlightAnnotation", function () {
it("should not set quadpoints if not defined", function (done) {
it("should set quadpoints to null if not defined", function (done) {
const highlightDict = new Dict();
highlightDict.set("Type", Name.get("Annot"));
highlightDict.set("Subtype", Name.get("Highlight"));
Expand All @@ -3382,7 +3382,7 @@ describe("annotation", function () {
idFactoryMock
).then(({ data }) => {
expect(data.annotationType).toEqual(AnnotationType.HIGHLIGHT);
expect(data.quadPoints).toBeUndefined();
expect(data.quadPoints).toEqual(null);
done();
}, done.fail);
});
Expand Down Expand Up @@ -3415,10 +3415,32 @@ describe("annotation", function () {
done();
}, done.fail);
});

it("should set quadpoints to null when empty", function (done) {
const highlightDict = new Dict();
highlightDict.set("Type", Name.get("Annot"));
highlightDict.set("Subtype", Name.get("Highlight"));
highlightDict.set("Rect", [10, 10, 20, 20]);
highlightDict.set("QuadPoints", []);

const highlightRef = Ref.get(121, 0);
const xref = new XRefMock([{ ref: highlightRef, data: highlightDict }]);

AnnotationFactory.create(
xref,
highlightRef,
pdfManagerMock,
idFactoryMock
).then(({ data }) => {
expect(data.annotationType).toEqual(AnnotationType.HIGHLIGHT);
expect(data.quadPoints).toEqual(null);
done();
}, done.fail);
});
});

describe("UnderlineAnnotation", function () {
it("should not set quadpoints if not defined", function (done) {
it("should set quadpoints to null if not defined", function (done) {
const underlineDict = new Dict();
underlineDict.set("Type", Name.get("Annot"));
underlineDict.set("Subtype", Name.get("Underline"));
Expand All @@ -3433,7 +3455,7 @@ describe("annotation", function () {
idFactoryMock
).then(({ data }) => {
expect(data.annotationType).toEqual(AnnotationType.UNDERLINE);
expect(data.quadPoints).toBeUndefined();
expect(data.quadPoints).toEqual(null);
done();
}, done.fail);
});
Expand Down Expand Up @@ -3469,7 +3491,7 @@ describe("annotation", function () {
});

describe("SquigglyAnnotation", function () {
it("should not set quadpoints if not defined", function (done) {
it("should set quadpoints to null if not defined", function (done) {
const squigglyDict = new Dict();
squigglyDict.set("Type", Name.get("Annot"));
squigglyDict.set("Subtype", Name.get("Squiggly"));
Expand All @@ -3484,7 +3506,7 @@ describe("annotation", function () {
idFactoryMock
).then(({ data }) => {
expect(data.annotationType).toEqual(AnnotationType.SQUIGGLY);
expect(data.quadPoints).toBeUndefined();
expect(data.quadPoints).toEqual(null);
done();
}, done.fail);
});
Expand Down Expand Up @@ -3520,7 +3542,7 @@ describe("annotation", function () {
});

describe("StrikeOutAnnotation", function () {
it("should not set quadpoints if not defined", function (done) {
it("should set quadpoints to null if not defined", function (done) {
const strikeOutDict = new Dict();
strikeOutDict.set("Type", Name.get("Annot"));
strikeOutDict.set("Subtype", Name.get("StrikeOut"));
Expand All @@ -3535,7 +3557,7 @@ describe("annotation", function () {
idFactoryMock
).then(({ data }) => {
expect(data.annotationType).toEqual(AnnotationType.STRIKEOUT);
expect(data.quadPoints).toBeUndefined();
expect(data.quadPoints).toEqual(null);
done();
}, done.fail);
});
Expand Down

0 comments on commit 8cf2749

Please sign in to comment.