"use strict"; describe.skip("PDF Reader", function () { var win, zp; before(function* () { win = yield loadZoteroPane(); zp = win.ZoteroPane; }); after(function () { win.close(); }); describe('Reader', function () { it('should create/update annotations', async function () { var attachment = await importFileAttachment('test.pdf'); // Existing highlight annotation await Zotero.Annotations.saveFromJSON(attachment, { key: 'AAAAAAAA', type: 'highlight', color: '#ffd400', sortIndex: '00000|003305|00000', position: { pageIndex: 0, rects: [[0, 0, 100, 100]] } }); // Existing note annotation await Zotero.Annotations.saveFromJSON(attachment, { key: 'BBBBBBBB', type: 'note', color: '#ffd400', sortIndex: '00000|003305|00000', position: { pageIndex: 0, rects: [[0, 0, 100, 100]] } }); // Existing image annotation await Zotero.Annotations.saveFromJSON(attachment, { key: 'CCCCCCCC', type: 'image', color: '#ffd400', sortIndex: '00000|003305|00000', comment: 'asdf', position: { pageIndex: 0, rects: [[0, 0, 100, 100]] } }); // Existing ink annotation await Zotero.Annotations.saveFromJSON(attachment, { key: 'DDDDDDDD', type: 'ink', color: '#ffd400', sortIndex: '00000|003305|00000', position: { pageIndex: 0, paths: [[517.759, 760.229]], width: 2, unknownField: 'test' }, }); var reader = await Zotero.Reader.open(attachment.itemID); // TODO: Implement a promise that would be resolved when pdf-reader is completely loaded var n = 0; while ((!reader._iframeWindow || !reader._iframeWindow.wrappedJSObject.PDFViewerApplication.pdfDocument) && n++ < 50) { await Zotero.Promise.delay(100); } await reader._iframeWindow.wrappedJSObject.viewerInstance._viewer._pdfjsPromise; // Create highlight annotation await reader._iframeWindow.wrappedJSObject.viewerInstance._viewer._annotationsStore.addAnnotation( Components.utils.cloneInto({ type: 'highlight', color: '#ffd400', sortIndex: '00000|003305|00000', position: { pageIndex: 0, rects: [[0, 0, 100, 100]] }, text: 'test' }, reader._iframeWindow) ); // Create note annotation await reader._iframeWindow.wrappedJSObject.viewerInstance._viewer._annotationsStore.addAnnotation( Components.utils.cloneInto({ type: 'note', color: '#ffd400', sortIndex: '00000|003305|00000', comment: 'test', position: { pageIndex: 0, rects: [[0, 0, 100, 100]] }, text: 'test' }, reader._iframeWindow) ); // Create image annotation await reader._iframeWindow.wrappedJSObject.viewerInstance._viewer._annotationsStore.addAnnotation( Components.utils.cloneInto({ type: 'image', color: '#ffd400', sortIndex: '00000|003305|00000', comment: 'test', position: { pageIndex: 0, rects: [[0, 0, 100, 100]] } }, reader._iframeWindow) ); // Update 4 items await reader._iframeWindow.wrappedJSObject.viewerInstance._viewer._annotationsStore.updateAnnotations( Components.utils.cloneInto([ { id: 'AAAAAAAA', text: 'test' }, { id: 'BBBBBBBB', color: '#aabbcc' }, { id: 'CCCCCCCC', comment: 'test' }, { id: 'DDDDDDDD', position: { pageIndex: 2 } }, ], reader._iframeWindow) ); // TODO: Try to avoid pdf-reader annotation saving debounce which is now 1000ms await Zotero.Promise.delay(1500); var annotations = attachment.getAnnotations(); // 4 existing + 3 created assert.equal(annotations.length, 7); // Test 4 updated annotations assert.equal(annotations.find(x => x.key === 'AAAAAAAA').annotationText, 'test'); assert.equal(annotations.find(x => x.key === 'BBBBBBBB').annotationColor, '#aabbcc'); assert.equal(annotations.find(x => x.key === 'CCCCCCCC').annotationComment, 'test'); // Test updated position pageIndex, and make sure unknownField is preserved assert.equal(JSON.parse(annotations.find(x => x.key === 'DDDDDDDD').annotationPosition).pageIndex, 2); assert.equal(JSON.parse(annotations.find(x => x.key === 'DDDDDDDD').annotationPosition).unknownField, 'test'); reader.close(); }); }); });