test_envChain_event_handler.html (5773B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=1782450 5 --> 6 <head> 7 <meta charset="utf-8"> 8 <title>Test for Bug 1782450</title> 9 <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> 10 <link rel="stylesheet" type="text/css" href="chrome://global/skin"/> 11 <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/> 12 <script type="application/javascript"> 13 "use strict"; 14 15 SimpleTest.waitForExplicitFinish(); 16 17 // Verify the environment chain for DOM event handlers described in 18 // js/src/vm/EnvironmentObject.h. 19 20 let count = 0; 21 function check(envs, hasEval) { 22 is(envs.length, hasEval ? 8 : 6); 23 24 let i = 0, env; 25 26 if (hasEval) { 27 env = envs[i]; i++; 28 is(env.type, "BlockLexicalEnvironmentObject"); 29 is(env.qualified, false); 30 is(env.unqualified, false); 31 is(env.lexical, true, "lexical must live in the function lexical env"); 32 is(env.prop, false); 33 is(env.form_prop, false); 34 is(env.document_prop, false); 35 is(env.button_prop, false); 36 37 env = envs[i]; i++; 38 is(env.type, "CallObject"); 39 is(env.qualified, true, "qualified var live in the function call object"); 40 is(env.unqualified, false); 41 is(env.lexical, false); 42 is(env.prop, false); 43 is(env.form_prop, false); 44 is(env.document_prop, false); 45 is(env.button_prop, false); 46 } else { 47 // qualified var and lexical live in function's frame. 48 } 49 50 env = envs[i]; i++; 51 is(env.type, "NonSyntacticLexicalEnvironmentObject"); 52 is(env.qualified, false); 53 is(env.unqualified, false); 54 is(env.lexical, false); 55 is(env.prop, false); 56 is(env.form_prop, false); 57 is(env.document_prop, false); 58 is(env.button_prop, false); 59 60 env = envs[i]; i++; 61 is(env.type, "WithEnvironmentObject"); 62 is(env.qualified, false); 63 is(env.unqualified, false); 64 is(env.lexical, false); 65 is(env.prop, true, "this property must live in the with env for button"); 66 is(env.form_prop, false); 67 is(env.document_prop, false); 68 is(env.button_prop, true, "button property must live in the with env for button"); 69 70 env = envs[i]; i++; 71 is(env.type, "WithEnvironmentObject"); 72 is(env.qualified, false); 73 is(env.unqualified, false); 74 is(env.lexical, false); 75 is(env.prop, false); 76 is(env.form_prop, true, "form property must live in the with env for form"); 77 is(env.document_prop, false); 78 is(env.button_prop, false); 79 80 env = envs[i]; i++; 81 is(env.type, "WithEnvironmentObject"); 82 is(env.qualified, false); 83 is(env.unqualified, false); 84 is(env.lexical, false); 85 is(env.prop, false); 86 is(env.form_prop, false); 87 is(env.document_prop, true, "document property must live in the with env for document"); 88 is(env.button_prop, false); 89 90 env = envs[i]; i++; 91 is(env.type, "GlobalLexicalEnvironmentObject"); 92 is(env.qualified, false); 93 is(env.unqualified, false); 94 is(env.lexical, false); 95 is(env.prop, false); 96 is(env.form_prop, false); 97 is(env.document_prop, false); 98 is(env.button_prop, false); 99 100 env = envs[i]; i++; 101 is(env.type, "*global*"); 102 is(env.qualified, false); 103 is(env.unqualified, true, "unqualified name must live in the global"); 104 is(env.lexical, false); 105 is(env.prop, false); 106 is(env.form_prop, false); 107 is(env.document_prop, false); 108 is(env.button_prop, false); 109 110 count++; 111 if (count == 2) { 112 SimpleTest.finish(); 113 } 114 } 115 </script> 116 </head> 117 <body> 118 <form id="form"> 119 <button id="button_optimized" onclick="event.preventDefault(); var qualified = 10; unqualified = 20; let lexical = 30; this.prop = 40; const funcs = Cu.getJSTestingFunctions(); const envs = []; let env = funcs.getInnerMostEnvironmentObject(); while (env) { envs.push({ type: funcs.getEnvironmentObjectType(env) || '*global*', qualified: !!Object.getOwnPropertyDescriptor(env, 'qualified'), unqualified: !!Object.getOwnPropertyDescriptor(env, 'unqualified'), lexical: !!Object.getOwnPropertyDescriptor(env, 'lexical'), prop: !!Object.getOwnPropertyDescriptor(env, 'prop'), document_prop: !!Object.getOwnPropertyDescriptor(env, 'document_prop'), form_prop: !!Object.getOwnPropertyDescriptor(env, 'form_prop'), button_prop: !!Object.getOwnPropertyDescriptor(env, 'button_prop'), }); env = funcs.getEnclosingEnvironmentObject(env); } check(envs, false); return false;">Click Me!</button> 120 <!-- Put direct eval to de-optimize function scope --> 121 <button id="button_unoptimized" onclick="event.preventDefault(); eval(''); var qualified = 10; unqualified = 20; let lexical = 30; this.prop = 40; const funcs = Cu.getJSTestingFunctions(); const envs = []; let env = funcs.getInnerMostEnvironmentObject(); while (env) { envs.push({ type: funcs.getEnvironmentObjectType(env) || '*global*', qualified: !!Object.getOwnPropertyDescriptor(env, 'qualified'), unqualified: !!Object.getOwnPropertyDescriptor(env, 'unqualified'), lexical: !!Object.getOwnPropertyDescriptor(env, 'lexical'), prop: !!Object.getOwnPropertyDescriptor(env, 'prop'), document_prop: !!Object.getOwnPropertyDescriptor(env, 'document_prop'), form_prop: !!Object.getOwnPropertyDescriptor(env, 'form_prop'), button_prop: !!Object.getOwnPropertyDescriptor(env, 'button_prop'), }); env = funcs.getEnclosingEnvironmentObject(env); } check(envs, true);">Click Me!</button> 122 </form> 123 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1782450">Mozilla Bug 1782450</a> 124 <script type="application/javascript"> 125 "use strict"; 126 document.document_prop = 50; 127 const form = document.getElementById("form"); 128 form.form_prop = 50; 129 const button_unoptimized = document.getElementById("button_unoptimized"); 130 button_unoptimized.button_prop = 60; 131 button_unoptimized.click(); 132 const button_optimized = document.getElementById("button_optimized"); 133 button_optimized.button_prop = 60; 134 button_optimized.click(); 135 </script> 136 </body> 137 </html>