| {{header}} | |
| {{object 1 0}} << | |
| /Type /Catalog | |
| /Pages 2 0 R | |
| /OpenAction 10 0 R | |
| >> | |
| endobj | |
| {{object 2 0}} << | |
| /Type /Pages | |
| /Count 1 | |
| /Kids [ | |
| 3 0 R | |
| ] | |
| >> | |
| endobj | |
| % Page number 0. | |
| {{object 3 0}} << | |
| /Type /Page | |
| /Parent 2 0 R | |
| /Resources << | |
| /Font <</F1 15 0 R>> | |
| >> | |
| /Contents [21 0 R] | |
| /MediaBox [0 0 612 792] | |
| >> | |
| % OpenAction action | |
| {{object 10 0}} << | |
| /Type /Action | |
| /S /JavaScript | |
| /JS 11 0 R | |
| >> | |
| endobj | |
| % JS program to exexute | |
| {{object 11 0}} << | |
| {{streamlen}} | |
| >> | |
| stream | |
| // The "global" object stores data in a C-like manner, and | |
| // can theoretically persist them between sessions (though | |
| // pdfium deliberately excludes that functionality). | |
| var some_object = { "colors": [ "red", "green", "blue"] }; | |
| var props_to_test = [ | |
| // Cover both bool values. | |
| { "name": "true_var", "value": true }, | |
| { "name": "false_var", "value": false }, | |
| // Include both zero and a number with some fractional digits. | |
| { "name": "zero_var", "value": 0 }, | |
| { "name": "number_var", "value": -3.918 }, | |
| // TODO(tsepez): unicode doesn't seem to survive. | |
| { "name": "string_var", "value": "This is a string" }, | |
| // Try a complex object. | |
| { "name": "object_var", "value": some_object }, | |
| // Test null and undefined. | |
| { "name": "null_var", "value": null }, | |
| { "name": "undefined_var", "value": undefined } | |
| ]; | |
| function setup_global() { | |
| for (var i = 0; i < props_to_test.length; ++i) { | |
| var prop = props_to_test[i]; | |
| try { | |
| global[prop.name] = prop.value; | |
| } catch (e) { | |
| app.alert("For " + prop.name + ": Setup: ERROR: " + e.toString()); | |
| } | |
| } | |
| } | |
| function delete_global() { | |
| for (var i = 0; i < props_to_test.length; ++i) { | |
| var prop = props_to_test[i]; | |
| try { | |
| delete global[prop.name]; | |
| } catch (e) { | |
| app.alert("For " + prop.name + ": Delete: ERROR: " + e.toString()); | |
| } | |
| } | |
| } | |
| function persist_global(should_persist) { | |
| for (var i = 0; i < props_to_test.length; ++i) { | |
| var prop = props_to_test[i]; | |
| try { | |
| global.setPersistent(prop.name, should_persist); | |
| } catch (e) { | |
| app.alert("For " + prop.name + | |
| ": Set Persistent: ERROR: " + e.toString()); | |
| } | |
| } | |
| } | |
| function dump_global(msg) { | |
| app.alert("************ " + msg + " ************"); | |
| app.alert("Enumerable Globals:"); | |
| for (var name in global) { | |
| try { | |
| app.alert(" " + name + " = " + global[name] + | |
| ", own property = " + global.hasOwnProperty(name)); | |
| } catch (e) { | |
| app.alert("For " + name + ": Dump: ERROR: " + e.toString()); | |
| } | |
| } | |
| app.alert("Expected Globals:"); | |
| for (var i = 0; i < props_to_test.length; ++i) { | |
| var prop = props_to_test[i]; | |
| try { | |
| var actual = global[prop.name]; | |
| app.alert(" " + prop.name + " = " + actual); | |
| if (actual != null && typeof actual == "object") { | |
| app.alert(" " + actual.colors[0]); | |
| app.alert(" " + actual.colors[1]); | |
| app.alert(" " + actual.colors[2]); | |
| } | |
| } catch (e) { | |
| app.alert("For " + prop.name + | |
| ": Dump Expected: ERROR: " + e.toString()); | |
| } | |
| } | |
| } | |
| dump_global("Initial State"); | |
| // Check that they all exist. | |
| setup_global(); | |
| dump_global("After Setup"); | |
| // Test deletion. | |
| delete_global(); | |
| dump_global("After Deletion"); | |
| // setPersistent() should be a no-op for pdfium. | |
| setup_global(); | |
| persist_global(false); | |
| dump_global("After Setup and Persist false"); | |
| // Test setting deleted variables as persistent. | |
| delete_global(); | |
| persist_global(true); | |
| dump_global("After Delete and Persist"); | |
| // Exit with variables marked as persistent to test whatever path | |
| // may exist to persist them (should be igonored on pdfium). | |
| setup_global(); | |
| persist_global(true); | |
| dump_global("After Setup and Persist true"); | |
| endstream | |
| endobj | |
| {{xref}} | |
| {{trailer}} | |
| {{startxref}} | |
| %%EOF |