{{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];
    global[prop.name] = prop.value;
  }
}

function delete_global() {
  for (var i = 0; i < props_to_test.length; ++i) {
    var prop = props_to_test[i];
    delete global[prop.name];
  }
}

function persist_global(should_persist) {
  for (var i = 0; i < props_to_test.length; ++i) {
    var prop = props_to_test[i];
    global.setPersistent(prop.name, should_persist);
  }
}

function dump_global(msg) {
  app.alert("************ " + msg + " ************");
  app.alert("Enumerable Globals:");
  for (var name in global) {
    app.alert("  " + name + " = " + global[name] +
              ", own property = " + global.hasOwnProperty(name));
  }
  app.alert("Expected Globals:");
  for (var i = 0; i < props_to_test.length; ++i) {
    var prop = props_to_test[i];
    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]);
    }
  }
}

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
