dom/ipc/tests/test_child_docshell.html

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 <!DOCTYPE HTML>
     2 <html>
     3 <!--
     4 -->
     5 <head>
     6   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
     7   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     8 </head>
     9 <body>
    11 <script type="application/javascript;version=1.7">
    12 "use strict";
    14 SimpleTest.waitForExplicitFinish();
    15 SpecialPowers.addPermission("browser", true, document);
    16 SpecialPowers.pushPrefEnv({'set':[
    17   ["dom.mozBrowserFramesEnabled", true],
    18   ["dom.ipc.tabs.disabled", false]
    19 ]}, function () {
    21   var iframe =  document.createElementNS('http://www.w3.org/1999/xhtml', 'iframe');
    22   iframe.setAttribute("remote", "true");
    23   SpecialPowers.wrap(iframe).mozbrowser = true;
    24   document.documentElement.appendChild(iframe);
    26   var mm = SpecialPowers.getBrowserFrameMessageManager(iframe);
    27   mm.addMessageListener("chromeEventHandler", function (msg) {
    28     msg = SpecialPowers.wrap(msg);
    29     var result = msg.json;
    30     is(result.processType, SpecialPowers.Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT,
    31        "The frame script is running in a real distinct child process");
    32     ok(result.hasCorrectInterface,
    33        "docshell.chromeEventHandler has nsIDOMEventTarget interface");
    34   });
    37   mm.addMessageListener("DOMWindowCreatedReceived", function (msg) {
    38     msg = SpecialPowers.wrap(msg);
    39     ok(true, "the chrome event handler looks functional");
    40     var result = msg.json;
    41     ok(result.stableChromeEventHandler, "docShell.chromeEventHandler is stable");
    42     ok(result.iframeHasNewDocShell, "iframe spawns a new docShell");
    43     ok(result.iframeHasSameChromeEventHandler, "but iframe has the same chrome event handler");
    44     SimpleTest.finish();
    45   });
    46   // Inject a frame script in the child process:
    47   mm.loadFrameScript('data:,new ' + function ContentScriptScope() {
    48     var processType = Components.classes["@mozilla.org/xre/runtime;1"]
    49                                 .getService(Components.interfaces.nsIXULRuntime)
    50                                 .processType;
    51     var chromeEventHandler = docShell.chromeEventHandler;
    52     sendAsyncMessage("chromeEventHandler", {
    53       processType: Services.appinfo.processType,
    54       hasCorrectInterface: chromeEventHandler instanceof Components.interfaces.nsIDOMEventTarget
    55     });
    57     /*
    58       Ensure that this chromeEventHandler actually works,
    59       by creating a new window and listening for its DOMWindowCreated event
    60     */
    61     chromeEventHandler.addEventListener("DOMWindowCreated", function listener(evt) {
    62       if (evt.target == content.document) {
    63         return;
    64       }
    65       chromeEventHandler.removeEventListener("DOMWindowCreated", listener);
    66       let new_win = evt.target.defaultView;
    67       let new_docShell = new_win.QueryInterface(Ci.nsIInterfaceRequestor)
    68                                 .getInterface(Ci.nsIWebNavigation)
    69                                 .QueryInterface(Ci.nsIDocShell);
    70       sendAsyncMessage("DOMWindowCreatedReceived", {
    71         stableChromeEventHandler: chromeEventHandler === docShell.chromeEventHandler,
    72         iframeHasNewDocShell: new_docShell !== docShell,
    73         iframeHasSameChromeEventHandler: new_docShell.chromeEventHandler === chromeEventHandler
    74       });
    75     });
    77     let i = content.document.createElement("iframe");
    78     i.setAttribute("src", "data:text/html,foo");
    79     content.document.documentElement.appendChild(i);
    80   }, false);
    81 });
    83 </script>
    84 </body>
    85 </html>

mercurial