| {{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 <</F1 15 0 R>> | |
| >> | |
| /MediaBox [0 0 612 792] | |
| /Contents 8 0 R | |
| >> | |
| endobj | |
| % Page number 1. | |
| {{object 4 0}} << | |
| /Type /Page | |
| /Parent 2 0 R | |
| /Resources << | |
| /Font <</F1 15 0 R>> | |
| >> | |
| /MediaBox [0 0 612 792] | |
| >> | |
| endobj | |
| % Page number 2. | |
| {{object 5 0}} << | |
| /Type /Page | |
| /Parent 2 0 R | |
| /Resources << | |
| /Font <</F1 15 0 R>> | |
| >> | |
| /MediaBox [0 0 612 792] | |
| >> | |
| endobj | |
| % Page number 3. | |
| {{object 6 0}} << | |
| /Type /Page | |
| /Parent 2 0 R | |
| /Resources << | |
| /Font <</F1 15 0 R>> | |
| >> | |
| /MediaBox [0 0 612 792] | |
| >> | |
| endobj | |
| % 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 execute | |
| {{object 11 0}} << | |
| {{streamlen}} | |
| >> | |
| stream | |
| {{include expect.js}} | |
| // "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. | |
| expect('this.calculateNow()', undefined) | |
| } | |
| 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. | |
| expectError('this.getPageNthWordQuads()'); | |
| } | |
| 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()', undefined); | |
| expect('this.mailDoc(false, "user@example.com", "cc@example.com", ' + | |
| '"bcc@example.com", "Lottery Winner", "You won the lottery!")', | |
| undefined); | |
| expect('this.mailDoc({})', undefined); | |
| expect('this.mailDoc({"bUI": false, "cTo": "user@example.com", ' + | |
| '"cCc": "cc@example.com", "cBcc": "bcc@example.com", ' + | |
| '"cSubject": "LotteryWinner", "cMsg": "You won the lottery!", ' + | |
| '"bogus": "yes"})', | |
| undefined); | |
| } | |
| function testMailForm() { | |
| // Method is present. | |
| expect('typeof this.mailForm', 'function'); | |
| // TODO(tsepez): test with no permissions. | |
| // Success cases. | |
| expect('this.mailForm()', undefined); | |
| expect('this.mailForm(false, "user@example.com", "cc@example.com", ' + | |
| '"bcc@example.com", "Lottery Winner", "You won the lottery!")', | |
| undefined); | |
| expect('this.mailForm({})', undefined); | |
| expect('this.mailForm({"bUI": false, "cTo": "user@example.com", ' + | |
| '"cCc": "cc@example.com", "cBcc": "bcc@example.com", ' + | |
| '"cSubject": "LotteryWinner", "cMsg": "You won the lottery!", ' + | |
| '"bogus": "yes"})', | |
| undefined); | |
| } | |
| function testPrint() { | |
| // Method is present. | |
| expect('typeof this.print', 'function'); | |
| // Successful only when invoked by a user gesture. | |
| expectError('this.print()', undefined); | |
| } | |
| 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()'); | |
| // Successful only when invoked by a user gesture. | |
| expectError('this.submitForm("myform", true, true, ["name", "age"])'); | |
| } | |
| 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.getAnnots3D'); | |
| 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 |