summaryrefslogtreecommitdiffstats
path: root/dom/plugins/test/mochitest/test_crashing2.html
blob: be61f3d501233ca628024212169c77e1951fc648 (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
<head>
  <title>Plugin crashing</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript" src="plugin-utils.js"></script>

<body onload="mainLoaded()">
  <iframe id="iframe1" src="about:blank" width="600" height="600"></iframe>

  <script class="testbody" type="application/javascript">
  SimpleTest.waitForExplicitFinish();
  setTestPluginEnabledState(SpecialPowers.Ci.nsIPluginTag.STATE_ENABLED);

  var iframe = document.getElementById('iframe1');

  function mainLoaded() {
    SimpleTest.expectChildProcessCrash();

    var p = iframe.contentDocument.createElement('embed');
    p.setAttribute('id', 'plugin1');
    p.setAttribute('type', 'application/x-test');
    p.setAttribute('width', '400');
    p.setAttribute('height', '400');
    p.setAttribute('drawmode', 'solid');
    p.setAttribute('color', 'FF00FFFF');
    p.setAttribute('newCrash', 'true');
    iframe.contentDocument.body.appendChild(p);

    // The plugin will now crash when it is instantiated, but
    // that happens asynchronously. HACK: this should use an
    // event instead of nested pending runnables, but I don't
    // know of any DOM event that's fired when a plugin is
    // instantiated.
    SimpleTest.executeSoon(function() {
      SimpleTest.executeSoon(function() {
        ok(p.setColor === undefined,
           "Plugin should have crashed on creation");

        window.frameLoaded = reloaded1;
        iframe.contentWindow.location.replace('crashing_subpage.html');
      })
    });
  }

  function reloaded1() {
    var p = iframe.contentDocument.getElementById('plugin1');
    try {
      p.setColor('FF00FF00');
      ok(true, "Reloading after crash-on-new worked");
    }
    catch (e) {
      ok(false, "Reloading after crash-on-new didn't give us a usable plugin");
    }
    p.crashOnDestroy();
    // the child crash should happen here
    p.parentNode.removeChild(p);

    window.frameLoaded = reloaded2;
    SimpleTest.executeSoon(function() {
      iframe.contentWindow.location.reload();
    });
  }

  function reloaded2() {
    var p = iframe.contentDocument.getElementById('plugin1');
    try {
      p.setColor('FF00FF00');
      ok(true, "Reloading after crash-on-destroy worked");
    }
    catch (e) {
      ok(false, "Reloading after crash-on-destroy didn't give us a usable plugin");
    }
    SimpleTest.finish();
  }
  </script>