1*3ac0a46fSAndroid Build Coastguard Worker{{header}} 2*3ac0a46fSAndroid Build Coastguard Worker{{object 1 0}} << 3*3ac0a46fSAndroid Build Coastguard Worker /Type /Catalog 4*3ac0a46fSAndroid Build Coastguard Worker /Pages 2 0 R 5*3ac0a46fSAndroid Build Coastguard Worker /OpenAction 10 0 R 6*3ac0a46fSAndroid Build Coastguard Worker>> 7*3ac0a46fSAndroid Build Coastguard Workerendobj 8*3ac0a46fSAndroid Build Coastguard Worker{{object 2 0}} << 9*3ac0a46fSAndroid Build Coastguard Worker /Type /Pages 10*3ac0a46fSAndroid Build Coastguard Worker /Count 1 11*3ac0a46fSAndroid Build Coastguard Worker /Kids [ 12*3ac0a46fSAndroid Build Coastguard Worker 3 0 R 13*3ac0a46fSAndroid Build Coastguard Worker ] 14*3ac0a46fSAndroid Build Coastguard Worker>> 15*3ac0a46fSAndroid Build Coastguard Workerendobj 16*3ac0a46fSAndroid Build Coastguard Worker% Page number 0. 17*3ac0a46fSAndroid Build Coastguard Worker{{object 3 0}} << 18*3ac0a46fSAndroid Build Coastguard Worker /Type /Page 19*3ac0a46fSAndroid Build Coastguard Worker /Parent 2 0 R 20*3ac0a46fSAndroid Build Coastguard Worker /Resources << 21*3ac0a46fSAndroid Build Coastguard Worker /Font <</F1 15 0 R>> 22*3ac0a46fSAndroid Build Coastguard Worker >> 23*3ac0a46fSAndroid Build Coastguard Worker /Contents [21 0 R] 24*3ac0a46fSAndroid Build Coastguard Worker /MediaBox [0 0 612 792] 25*3ac0a46fSAndroid Build Coastguard Worker>> 26*3ac0a46fSAndroid Build Coastguard Workerendobj 27*3ac0a46fSAndroid Build Coastguard Worker% OpenAction action 28*3ac0a46fSAndroid Build Coastguard Worker{{object 10 0}} << 29*3ac0a46fSAndroid Build Coastguard Worker /Type /Action 30*3ac0a46fSAndroid Build Coastguard Worker /S /JavaScript 31*3ac0a46fSAndroid Build Coastguard Worker /JS 11 0 R 32*3ac0a46fSAndroid Build Coastguard Worker>> 33*3ac0a46fSAndroid Build Coastguard Workerendobj 34*3ac0a46fSAndroid Build Coastguard Worker% JS program to execute 35*3ac0a46fSAndroid Build Coastguard Worker{{object 11 0}} << 36*3ac0a46fSAndroid Build Coastguard Worker {{streamlen}} 37*3ac0a46fSAndroid Build Coastguard Worker>> 38*3ac0a46fSAndroid Build Coastguard Workerstream 39*3ac0a46fSAndroid Build Coastguard Worker// The "global" object stores data in a C-like manner, and 40*3ac0a46fSAndroid Build Coastguard Worker// can theoretically persist them between sessions (though 41*3ac0a46fSAndroid Build Coastguard Worker// pdfium deliberately excludes that functionality). 42*3ac0a46fSAndroid Build Coastguard Worker 43*3ac0a46fSAndroid Build Coastguard Workervar some_object = { "colors": [ "red", "green", "blue"] }; 44*3ac0a46fSAndroid Build Coastguard Worker 45*3ac0a46fSAndroid Build Coastguard Workervar props_to_test = [ 46*3ac0a46fSAndroid Build Coastguard Worker // Cover both bool values. 47*3ac0a46fSAndroid Build Coastguard Worker { "name": "true_var", "value": true }, 48*3ac0a46fSAndroid Build Coastguard Worker { "name": "false_var", "value": false }, 49*3ac0a46fSAndroid Build Coastguard Worker 50*3ac0a46fSAndroid Build Coastguard Worker // Include both zero and a number with some fractional digits. 51*3ac0a46fSAndroid Build Coastguard Worker { "name": "zero_var", "value": 0 }, 52*3ac0a46fSAndroid Build Coastguard Worker { "name": "number_var", "value": -3.918 }, 53*3ac0a46fSAndroid Build Coastguard Worker 54*3ac0a46fSAndroid Build Coastguard Worker // TODO(tsepez): unicode doesn't seem to survive. 55*3ac0a46fSAndroid Build Coastguard Worker { "name": "string_var", "value": "This is a string" }, 56*3ac0a46fSAndroid Build Coastguard Worker 57*3ac0a46fSAndroid Build Coastguard Worker // Try a complex object. 58*3ac0a46fSAndroid Build Coastguard Worker { "name": "object_var", "value": some_object }, 59*3ac0a46fSAndroid Build Coastguard Worker 60*3ac0a46fSAndroid Build Coastguard Worker // Test null and undefined. 61*3ac0a46fSAndroid Build Coastguard Worker { "name": "null_var", "value": null }, 62*3ac0a46fSAndroid Build Coastguard Worker { "name": "undefined_var", "value": undefined }, 63*3ac0a46fSAndroid Build Coastguard Worker 64*3ac0a46fSAndroid Build Coastguard Worker // Test to show unicode currently handled. 65*3ac0a46fSAndroid Build Coastguard Worker { "name": "unicode_var", "value": "\u4025\u4026_string" }, 66*3ac0a46fSAndroid Build Coastguard Worker { "name": "\u4025\u4026_var", "value": "string" }, 67*3ac0a46fSAndroid Build Coastguard Worker]; 68*3ac0a46fSAndroid Build Coastguard Worker 69*3ac0a46fSAndroid Build Coastguard Workerfunction setup_global() { 70*3ac0a46fSAndroid Build Coastguard Worker for (var i = 0; i < props_to_test.length; ++i) { 71*3ac0a46fSAndroid Build Coastguard Worker var prop = props_to_test[i]; 72*3ac0a46fSAndroid Build Coastguard Worker try { 73*3ac0a46fSAndroid Build Coastguard Worker global[prop.name] = prop.value; 74*3ac0a46fSAndroid Build Coastguard Worker } catch (e) { 75*3ac0a46fSAndroid Build Coastguard Worker app.alert("For " + prop.name + ": Setup: ERROR: " + e.toString()); 76*3ac0a46fSAndroid Build Coastguard Worker } 77*3ac0a46fSAndroid Build Coastguard Worker } 78*3ac0a46fSAndroid Build Coastguard Worker} 79*3ac0a46fSAndroid Build Coastguard Worker 80*3ac0a46fSAndroid Build Coastguard Workerfunction delete_global() { 81*3ac0a46fSAndroid Build Coastguard Worker for (var i = 0; i < props_to_test.length; ++i) { 82*3ac0a46fSAndroid Build Coastguard Worker var prop = props_to_test[i]; 83*3ac0a46fSAndroid Build Coastguard Worker try { 84*3ac0a46fSAndroid Build Coastguard Worker delete global[prop.name]; 85*3ac0a46fSAndroid Build Coastguard Worker } catch (e) { 86*3ac0a46fSAndroid Build Coastguard Worker app.alert("For " + prop.name + ": Delete: ERROR: " + e.toString()); 87*3ac0a46fSAndroid Build Coastguard Worker } 88*3ac0a46fSAndroid Build Coastguard Worker } 89*3ac0a46fSAndroid Build Coastguard Worker} 90*3ac0a46fSAndroid Build Coastguard Worker 91*3ac0a46fSAndroid Build Coastguard Workerfunction persist_global(should_persist) { 92*3ac0a46fSAndroid Build Coastguard Worker for (var i = 0; i < props_to_test.length; ++i) { 93*3ac0a46fSAndroid Build Coastguard Worker var prop = props_to_test[i]; 94*3ac0a46fSAndroid Build Coastguard Worker try { 95*3ac0a46fSAndroid Build Coastguard Worker global.setPersistent(prop.name, should_persist); 96*3ac0a46fSAndroid Build Coastguard Worker } catch (e) { 97*3ac0a46fSAndroid Build Coastguard Worker app.alert("For " + prop.name + 98*3ac0a46fSAndroid Build Coastguard Worker ": Set Persistent: ERROR: " + e.toString()); 99*3ac0a46fSAndroid Build Coastguard Worker } 100*3ac0a46fSAndroid Build Coastguard Worker } 101*3ac0a46fSAndroid Build Coastguard Worker} 102*3ac0a46fSAndroid Build Coastguard Worker 103*3ac0a46fSAndroid Build Coastguard Workerfunction dump_global(msg) { 104*3ac0a46fSAndroid Build Coastguard Worker app.alert("************ " + msg + " ************"); 105*3ac0a46fSAndroid Build Coastguard Worker app.alert("Enumerable Globals:"); 106*3ac0a46fSAndroid Build Coastguard Worker for (var name in global) { 107*3ac0a46fSAndroid Build Coastguard Worker try { 108*3ac0a46fSAndroid Build Coastguard Worker app.alert(" " + name + " = " + global[name] + 109*3ac0a46fSAndroid Build Coastguard Worker ", own property = " + global.hasOwnProperty(name)); 110*3ac0a46fSAndroid Build Coastguard Worker } catch (e) { 111*3ac0a46fSAndroid Build Coastguard Worker app.alert("For " + name + ": Dump: ERROR: " + e.toString()); 112*3ac0a46fSAndroid Build Coastguard Worker } 113*3ac0a46fSAndroid Build Coastguard Worker } 114*3ac0a46fSAndroid Build Coastguard Worker app.alert("Expected Globals:"); 115*3ac0a46fSAndroid Build Coastguard Worker for (var i = 0; i < props_to_test.length; ++i) { 116*3ac0a46fSAndroid Build Coastguard Worker var prop = props_to_test[i]; 117*3ac0a46fSAndroid Build Coastguard Worker try { 118*3ac0a46fSAndroid Build Coastguard Worker var actual = global[prop.name]; 119*3ac0a46fSAndroid Build Coastguard Worker app.alert(" " + prop.name + " = " + actual); 120*3ac0a46fSAndroid Build Coastguard Worker if (actual != null && typeof actual == "object") { 121*3ac0a46fSAndroid Build Coastguard Worker app.alert(" " + actual.colors[0]); 122*3ac0a46fSAndroid Build Coastguard Worker app.alert(" " + actual.colors[1]); 123*3ac0a46fSAndroid Build Coastguard Worker app.alert(" " + actual.colors[2]); 124*3ac0a46fSAndroid Build Coastguard Worker } 125*3ac0a46fSAndroid Build Coastguard Worker } catch (e) { 126*3ac0a46fSAndroid Build Coastguard Worker app.alert("For " + prop.name + 127*3ac0a46fSAndroid Build Coastguard Worker ": Dump Expected: ERROR: " + e.toString()); 128*3ac0a46fSAndroid Build Coastguard Worker } 129*3ac0a46fSAndroid Build Coastguard Worker } 130*3ac0a46fSAndroid Build Coastguard Worker} 131*3ac0a46fSAndroid Build Coastguard Worker 132*3ac0a46fSAndroid Build Coastguard Workerdump_global("Initial State"); 133*3ac0a46fSAndroid Build Coastguard Worker 134*3ac0a46fSAndroid Build Coastguard Worker// Check that they all exist. 135*3ac0a46fSAndroid Build Coastguard Workersetup_global(); 136*3ac0a46fSAndroid Build Coastguard Workerdump_global("After Setup"); 137*3ac0a46fSAndroid Build Coastguard Worker 138*3ac0a46fSAndroid Build Coastguard Worker// Test deletion. 139*3ac0a46fSAndroid Build Coastguard Workerdelete_global(); 140*3ac0a46fSAndroid Build Coastguard Workerdump_global("After Deletion"); 141*3ac0a46fSAndroid Build Coastguard Worker 142*3ac0a46fSAndroid Build Coastguard Worker// setPersistent() should be a no-op for pdfium. 143*3ac0a46fSAndroid Build Coastguard Workersetup_global(); 144*3ac0a46fSAndroid Build Coastguard Workerpersist_global(false); 145*3ac0a46fSAndroid Build Coastguard Workerdump_global("After Setup and Persist false"); 146*3ac0a46fSAndroid Build Coastguard Worker 147*3ac0a46fSAndroid Build Coastguard Worker// Test setting deleted variables as persistent. 148*3ac0a46fSAndroid Build Coastguard Workerdelete_global(); 149*3ac0a46fSAndroid Build Coastguard Workerpersist_global(true); 150*3ac0a46fSAndroid Build Coastguard Workerdump_global("After Delete and Persist"); 151*3ac0a46fSAndroid Build Coastguard Worker 152*3ac0a46fSAndroid Build Coastguard Worker// Exit with variables marked as persistent to test whatever path 153*3ac0a46fSAndroid Build Coastguard Worker// may exist to persist them (should be igonored on pdfium). 154*3ac0a46fSAndroid Build Coastguard Workersetup_global(); 155*3ac0a46fSAndroid Build Coastguard Workerpersist_global(true); 156*3ac0a46fSAndroid Build Coastguard Workerdump_global("After Setup and Persist true"); 157*3ac0a46fSAndroid Build Coastguard Worker 158*3ac0a46fSAndroid Build Coastguard Workerendstream 159*3ac0a46fSAndroid Build Coastguard Workerendobj 160*3ac0a46fSAndroid Build Coastguard Worker{{xref}} 161*3ac0a46fSAndroid Build Coastguard Worker{{trailer}} 162*3ac0a46fSAndroid Build Coastguard Worker{{startxref}} 163*3ac0a46fSAndroid Build Coastguard Worker%%EOF 164