| {{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}} << |
| >> |
| 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 << |
| /Root 1 0 R |
| >> |
| {{startxref}} |
| %%EOF |