{{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