1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-20 23:28:06 +02:00

Let non-viewable Popup Annotations inherit the parent's Annotation Flags if the parent is viewable

Fixes http://www.pdf-archive.com/2013/09/30/file2/file2.pdf.

Note how it's not possible to show the various Popup Annotations in the above document.
To fix that, this patch lets the Popup inherit the flags of the parent, in the special case where the parent is `viewable` *and* the Popup is not.
In general, I don't think that a Popup must have the same flags set as the parent. However, it seems very strange to have a `viewable` parent annotation, and then not being able to view the Popup.

Annoyingly the PDF specification doesn't, as far as I can find, mention anything about how this case should be handled, but this patch seem consistent with the actual behaviour in Adobe Reader.
This commit is contained in:
Jonas Jenwald 2016-05-24 17:35:45 +02:00
parent 47b929be26
commit 98fe094d18
5 changed files with 91 additions and 30 deletions

View file

@ -99,6 +99,7 @@
!pr4922.pdf
!pr6531_1.pdf
!pr6531_2.pdf
!pr7352.pdf
!bug900822.pdf
!issue918.pdf
!issue1905.pdf

BIN
test/pdfs/pr7352.pdf Normal file

Binary file not shown.

View file

@ -1838,6 +1838,14 @@
"type": "eq",
"annotations": true
},
{ "id": "pr7352",
"file": "pdfs/pr7352.pdf",
"md5": "336abca4b313cb215b0569883f1f683d",
"link": false,
"rounds": 1,
"type": "eq",
"annotations": true
},
{ "id": "issue1002",
"file": "pdfs/issue1002.pdf",
"md5": "af62d6cd95079322d4af18edd960d15c",

View file

@ -15,6 +15,17 @@ describe('Annotation layer', function() {
}
};
var annotationFactory;
beforeAll(function (done) {
annotationFactory = new AnnotationFactory();
done();
});
afterAll(function () {
annotationFactory = null;
});
describe('Annotation', function() {
it('should set and get flags', function() {
var dict = new Dict();
@ -185,17 +196,6 @@ describe('Annotation layer', function() {
});
describe('LinkAnnotation', function() {
var annotationFactory;
beforeAll(function (done) {
annotationFactory = new AnnotationFactory();
done();
});
afterAll(function () {
annotationFactory = null;
});
it('should correctly parse a URI action', function() {
var actionDict = new Dict();
actionDict.set('Type', Name.get('Action'));
@ -358,4 +358,32 @@ describe('Annotation layer', function() {
expect(annotation.file.content).toEqual(stringToBytes('Test attachment'));
});
});
describe('PopupAnnotation', function() {
it('should inherit the parent flags when the Popup is not viewable, ' +
'but the parent is (PR 7352)', function () {
var parentDict = new Dict();
parentDict.set('Type', Name.get('Annot'));
parentDict.set('Subtype', Name.get('Text'));
parentDict.set('F', 28); // viewable
var popupDict = new Dict();
popupDict.set('Type', Name.get('Annot'));
popupDict.set('Subtype', Name.get('Popup'));
popupDict.set('F', 25); // not viewable
popupDict.set('Parent', parentDict);
var xrefMock = new XrefMock([popupDict]);
var popupRef = new Ref(13, 0);
var popupAnnotation = annotationFactory.create(xrefMock, popupRef);
var data = popupAnnotation.data;
expect(data.annotationType).toEqual(AnnotationType.POPUP);
// Should not modify the `annotationFlags` returned e.g. through the API.
expect(data.annotationFlags).toEqual(25);
// The Popup should inherit the `viewable` property of the parent.
expect(popupAnnotation.viewable).toEqual(true);
});
});
});