tor-browser

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

test_executeInGlobal-outerized_this.html (2929B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <!--
      4 https://bugzilla.mozilla.org/show_bug.cgi?id=837060
      5 
      6 When we use Debugger.Object.prototype.executeInGlobal, the 'this' value seen
      7 by the evaluated code should be the WindowProxy, not the inner window
      8 object.
      9 -->
     10 <head>
     11  <meta charset="utf-8">
     12  <title>Mozilla Bug 837060</title>
     13  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
     14  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
     15 </head>
     16 <body>
     17 <pre id="test">
     18 <script>
     19 "use strict";
     20 
     21 const {addDebuggerToGlobal} = ChromeUtils.importESModule("resource://gre/modules/jsdebugger.sys.mjs");
     22 addDebuggerToGlobal(globalThis);
     23 
     24 window.onload = function() {
     25  SimpleTest.waitForExplicitFinish();
     26 
     27  const iframe = document.createElement("iframe");
     28  iframe.src = "data:text/html,<script>var me = 'page 1';<\/script>";
     29  iframe.onload = firstOnLoadHandler;
     30  document.body.appendChild(iframe);
     31 
     32  function firstOnLoadHandler() {
     33    const dbg = new Debugger();
     34    const page1DO = dbg.addDebuggee(iframe.contentWindow);
     35    iframe.src = "data:text/html,<script>var me = 'page 2';<\/script>";
     36    iframe.onload = function() {
     37      const page2DO = dbg.addDebuggee(iframe.contentWindow);
     38      ok(page1DO !== page2DO, "the two pages' globals get distinct D.O's");
     39      ok(page1DO.unsafeDereference() === page2DO.unsafeDereference(),
     40         "unwrapping page1DO and page2DO outerizes both, yielding the same outer window");
     41 
     42      is(page1DO.executeInGlobal("me").return,
     43         "page 1", "page1DO continues to refer to original page");
     44      is(page2DO.executeInGlobal("me").return, "page 2",
     45         "page2DO refers to current page");
     46 
     47      is(page1DO.executeInGlobal("this === window").return, true,
     48         "page 1: Debugger.Object.prototype.executeInGlobal should outerize 'this'");
     49      is(page1DO.executeInGlobalWithBindings("this === window", {x: 2}).return, true,
     50         "page 1: Debugger.Object.prototype.executeInGlobal should outerize 'this'");
     51 
     52      is(page2DO.executeInGlobal("this === window").return, true,
     53         "page 2: Debugger.Object.prototype.executeInGlobal should outerize 'this'");
     54      is(page2DO.executeInGlobalWithBindings("this === window", {x: 2}).return, true,
     55         "page 2: Debugger.Object.prototype.executeInGlobal should outerize 'this'");
     56 
     57      // Debugger doesn't let one use outer windows as globals. You have to innerize.
     58      const outerDO = page1DO.makeDebuggeeValue(page1DO.unsafeDereference());
     59      ok(outerDO !== page1DO,
     60         "outer window gets its own D.O, distinct from page 1's global");
     61      ok(outerDO !== page2DO,
     62         "outer window gets its own D.O, distinct from page 2's global");
     63      SimpleTest.doesThrow(() => outerDO.executeInGlobal("me"),
     64                           "outer window D.Os can't be used as globals");
     65 
     66      SimpleTest.finish();
     67    };
     68  }
     69 };
     70 </script>
     71 </pre>
     72 </body>
     73 </html>