tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>