summaryrefslogtreecommitdiffstats
path: root/dom/ipc/tests/test_child_docshell.html
blob: 5855569e863e2860d1d8c93c453acc099676a83f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<!DOCTYPE HTML>
<html>
<!--
-->
<head>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>

<script type="application/javascript;version=1.7">
"use strict";

SimpleTest.waitForExplicitFinish();
SpecialPowers.addPermission("browser", true, document);
SpecialPowers.pushPrefEnv({'set':[
  ["dom.mozBrowserFramesEnabled", true],
  ["network.disable.ipc.security", true],
  ["dom.ipc.tabs.disabled", false]
]}, function () {

  var iframe =  document.createElementNS('http://www.w3.org/1999/xhtml', 'iframe');
  iframe.setAttribute("remote", "true");
  SpecialPowers.wrap(iframe).mozbrowser = true;
  document.documentElement.appendChild(iframe);

  var mm = SpecialPowers.getBrowserFrameMessageManager(iframe);
  mm.addMessageListener("chromeEventHandler", function (msg) {
    msg = SpecialPowers.wrap(msg);
    var result = msg.json;
    is(result.processType, SpecialPowers.Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT,
       "The frame script is running in a real distinct child process");
    ok(result.hasCorrectInterface,
       "docshell.chromeEventHandler has nsIDOMEventTarget interface");
  });


  mm.addMessageListener("DOMWindowCreatedReceived", function (msg) {
    msg = SpecialPowers.wrap(msg);
    ok(true, "the chrome event handler looks functional");
    var result = msg.json;
    ok(result.stableChromeEventHandler, "docShell.chromeEventHandler is stable");
    ok(result.iframeHasNewDocShell, "iframe spawns a new docShell");
    ok(result.iframeHasSameChromeEventHandler, "but iframe has the same chrome event handler");
    SimpleTest.finish();
  });
  // Inject a frame script in the child process:
  mm.loadFrameScript('data:,new ' + function ContentScriptScope() {
    var processType = Components.classes["@mozilla.org/xre/runtime;1"]
                                .getService(Components.interfaces.nsIXULRuntime)
                                .processType;
    var chromeEventHandler = docShell.chromeEventHandler;
    sendAsyncMessage("chromeEventHandler", {
      processType: Services.appinfo.processType,
      hasCorrectInterface: chromeEventHandler instanceof Components.interfaces.nsIDOMEventTarget
    });

    /*
      Ensure that this chromeEventHandler actually works,
      by creating a new window and listening for its DOMWindowCreated event
    */
    chromeEventHandler.addEventListener("DOMWindowCreated", function listener(evt) {
      if (evt.target == content.document) {
        return;
      }
      chromeEventHandler.removeEventListener("DOMWindowCreated", listener);
      let new_win = evt.target.defaultView;
      let new_docShell = new_win.QueryInterface(Ci.nsIInterfaceRequestor)
                                .getInterface(Ci.nsIWebNavigation)
                                .QueryInterface(Ci.nsIDocShell);
      sendAsyncMessage("DOMWindowCreatedReceived", {
        stableChromeEventHandler: chromeEventHandler === docShell.chromeEventHandler,
        iframeHasNewDocShell: new_docShell !== docShell,
        iframeHasSameChromeEventHandler: new_docShell.chromeEventHandler === chromeEventHandler
      });
    });

    let i = content.document.createElement("iframe");
    i.setAttribute("src", "data:text/html,foo");
    content.document.documentElement.appendChild(i);
  }, false);
});

</script>
</body>
</html>