{{header}} {{object 1 0}} << /Type /Catalog /Pages 2 0 R /OpenAction 10 0 R >> endobj {{object 2 0}} << /Type /Pages /Count 4 /Kids [ 3 0 R 4 0 R 5 0 R 6 0 R ] >> endobj % Page number 0. {{object 3 0}} << /Type /Page /Parent 2 0 R /Resources << /Font <> >> /MediaBox [0 0 612 792] /Contents 8 0 R >> % Page number 1. {{object 4 0}} << /Type /Page /Parent 2 0 R /Resources << /Font <> >> /MediaBox [0 0 612 792] >> % Page number 2. {{object 5 0}} << /Type /Page /Parent 2 0 R /Resources << /Font <> >> /MediaBox [0 0 612 792] >> % Page number 3. {{object 6 0}} << /Type /Page /Parent 2 0 R /Resources << /Font <> >> /MediaBox [0 0 612 792] >> % Contents of the page. {{object 8 0}} << {{streamlen}} >> stream BT 20 50 Td /F1 12 Tf (Hello, world!) Tj 0 50 Td endstream endobj % Info {{object 9 0}} << /Author (Joe Random Author) /Creator (Joe Random Creator) >> endobj % OpenAction action {{object 10 0}} << /Type /Action /S /JavaScript /JS 11 0 R >> endobj % JS program to exexute {{object 11 0}} << {{streamlen}} >> stream function expect(str, expected) { try { var result = eval(str); if (result == expected) { app.alert('PASS: ' + str + ' = ' + result); } else { app.alert('FAIL: ' + str + ' = ' + result + ', expected = ' + expected); } } catch (e) { app.alert('ERROR: ' + e.toString()); } } function expectError(str) { try { var result = eval(str); app.alert('FAIL: ' + str + ' = ' + result + ', expected to throw error'); } catch (e) { app.alert('PASS: ' + str + ' threw error ' + e.toString()); } } // "Unsupported" methods are present in the document object, but not // implemented. They always return |undefined| regardless of arguments. function testUnsupported(str) { expect('typeof ' + str, 'function'); expect(str + '()', undefined); expect(str + '(1, 2, "clams", [1, 2, 3])', undefined); } function testAddIcon() { // Method is present. expect('typeof this.addIcon', 'function'); // Method takes exactly two arguments. expectError('this.addIcon()'); expectError('this.addIcon(1)'); expectError('this.addIcon(1, 2, 3)'); // Second argument must actually be an icon. expectError('this.addIcon("myicon", 3)'); expectError('this.addIcon("myicon", undefined)'); // TODO(tsepez): test success cases. } function testCalculateNow() { // Method is present. expect('typeof this.calculateNow', 'function'); // TODO(tsepez): test with no permissions. // TODO(tsepez): test success cases. } function testGetAnnot() { // Method is present. expect('typeof this.getAnnot', 'function'); // Method needs two arguments. expectError('this.getAnnot()'); expectError('this.getAnnot(0)'); expectError('this.getAnnot(0, "test", 0)'); // TODO(tonikitoo): test success cases. } function testGetAnnots() { // Method is present. expect('typeof this.getAnnots', 'function'); // TODO(tonikitoo): test success cases. } function testGetField() { // Method is present. expect('typeof this.getField', 'function'); // Method needs at least one argument. expectError('this.getField()'); // TODO(tsepez): test success cases. } function testGetIcon() { // Method is present. expect('typeof this.getIcon', 'function'); // Method needs exactly one argument. expectError('this.getIcon()'); expectError('this.getIcon(1, 2)'); // TODO(tsepez): test success cases. } function testGetNthFieldName() { // Method is present. expect('typeof this.getNthFieldName', 'function'); // Method needs at least one argument. expectError('this.getNthFieldName()'); // Argument can not be negative. expectError('this.getNthFieldName(-1)'); // Argument can not be huge. expectError('this.getNthFieldName(400000)'); // TODO(tsepez): add field object so this case works. expectError('this.getNthFieldName(0)'); } function testGetPageNthWord() { // Method is present. expect('typeof this.getPageNthWord', 'function'); // Method accepts any number of parameters. expect('this.getPageNthWord(0, 0, true, "clams", [1, 2])', 'Hello,'); // Arguments can't be negative or out of range. expectError('this.getPageNthWord(-1, 0, true)'); expectError('this.getPageNthWord(6, 0, true)'); // TODO(tsepez): test with no permissions. // TODO(tsepez): test success cases. } function testGetPageNthWordQuads() { // Method is present. expect('typeof this.getPageNthWordQuads', 'function'); // TODO(tsepez): test with no permissions. // TODO(tsepez): test success cases. } function testGetPageNumWords() { // Method is present. expect('typeof this.getPageNumWords', 'function'); // Method accepts any number of parameters. expect('this.getPageNumWords(0, "clams", [1, 2])', 2); // Arguments can't be negative or out of range. expectError('this.getPageNumWords(-1)'); expectError('this.getPageNumWords(6)'); // TODO(tsepez): test with no permissions. // TODO(tsepez): test success cases. } function testGetPrintParams() { // Method is present. expect('typeof this.getPrintParams', 'function'); // Method always returns in error. expectError('this.getPrintParams()'); expectError('this.getPrintParams(42)'); } function testGotoNamedDest() { // Method is present. expect('typeof this.gotoNamedDest', 'function'); // Method needs exactly one argument. expectError('this.gotoNamedDest()'); expectError('this.gotoNamedDest(1, 2)'); // TODO(tsepez): add actual named dest matching this. expectError('this.gotoNamedDest("chicago")'); } function testMailDoc() { // Method is present. expect('typeof this.mailDoc', 'function'); // TODO(tsepez): test with no permissions. // Success cases. expect('this.mailDoc(true)', undefined); expect('this.mailDoc(false, "user@example.com", "cc@example.com", ' + '"bcc@example.com", "Lottery Winner", "You won the lottery!")', undefined); } function testMailForm() { // Method is present. expect('typeof this.mailForm', 'function'); // TODO(tsepez): test with no permissions. // Success cases. expect('this.mailForm(true)', undefined); expect('this.mailForm(false, "user@example.com", "cc@example.com", ' + '"bcc@example.com", "Lottery Winner", "You won the lottery!")', undefined); } function testPrint() { // Method is present. expect('typeof this.print', 'function'); // TODO(tsepez): test success cases. } function testRemoveField() { // Method is present. expect('typeof this.removeField', 'function'); // Method requires at least one argument. expectError('this.removeField()'); // TODO(tsepez): test with no permissions. // TODO(tsepez): test success cases. } function testResetForm() { // Method is present. expect('typeof this.resetForm', 'function'); // TODO(tsepez): test with no permissions. // TODO(tsepez): Add form to document to match these arguments. expect('this.resetForm()', undefined); expect('this.resetForm("myform")', undefined); } function testSubmitForm() { // Method is present. expect('typeof this.submitForm', 'function'); // Method requires at least one argument. expectError('this.submitForm()'); // TODO(tsepez): Add form to document to match these arguments. expect('this.submitForm("myform", true, true, ["name", "age"])', undefined); } try { app.alert('*** Testing Unsupported Methods ***'); testUnsupported('this.addAnnot'); testUnsupported('this.addField'); testUnsupported('this.addLink'); testUnsupported('this.closeDoc'); testUnsupported('this.createDataObject'); testUnsupported('this.deletePages'); testUnsupported('this.exportAsFDF'); testUnsupported('this.exportAsText'); testUnsupported('this.exportAsXFDF'); testUnsupported('this.extractPages'); testUnsupported('this.getAnnot3D'); testUnsupported('this.getLinks'); testUnsupported('this.getOCGs'); testUnsupported('this.getPageBox'); testUnsupported('this.getURL'); testUnsupported('this.importAnFDF'); testUnsupported('this.importAnXFDF'); testUnsupported('this.importTextData'); testUnsupported('this.insertPages'); testUnsupported('this.removeIcon'); testUnsupported('this.replacePages'); testUnsupported('this.saveAs'); testUnsupported('this.syncAnnotScan'); app.alert('*** Testing Supported Methods ***'); testAddIcon(); testCalculateNow(); testGetAnnot(); testGetAnnots(); testGetField(); testGetIcon(); testGetNthFieldName(); testGetPageNthWord(); testGetPageNthWordQuads(); testGetPageNumWords(); testGetPrintParams(); testGotoNamedDest(); testMailDoc(); testMailForm(); testPrint(); testRemoveField(); testResetForm(); testSubmitForm(); } catch (e) { app.alert('FATAL: ' + e.toString()); } endstream endobj {{xref}} trailer << /Root 1 0 R /Info 9 0 R >> {{startxref}} %%EOF