|
1 <head> |
|
2 <title>Plugin crashing</title> |
|
3 <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> |
|
4 <script type="application/javascript" src="utils.js"></script> |
|
5 |
|
6 <body onload="mainLoaded()"> |
|
7 <iframe id="iframe1" src="about:blank" width="600" height="600"></iframe> |
|
8 |
|
9 <script class="testbody" type="application/javascript"> |
|
10 SimpleTest.waitForExplicitFinish(); |
|
11 setTestPluginEnabledState(SpecialPowers.Ci.nsIPluginTag.STATE_ENABLED); |
|
12 |
|
13 var iframe = document.getElementById('iframe1'); |
|
14 |
|
15 function mainLoaded() { |
|
16 if (!SimpleTest.testPluginIsOOP()) { |
|
17 ok(true, "Skipping this test when test plugin is not OOP."); |
|
18 SimpleTest.finish(); |
|
19 return; |
|
20 } |
|
21 |
|
22 SimpleTest.expectChildProcessCrash(); |
|
23 |
|
24 var p = iframe.contentDocument.createElement('embed'); |
|
25 p.setAttribute('id', 'plugin1'); |
|
26 p.setAttribute('type', 'application/x-test'); |
|
27 p.setAttribute('width', '400'); |
|
28 p.setAttribute('height', '400'); |
|
29 p.setAttribute('drawmode', 'solid'); |
|
30 p.setAttribute('color', 'FF00FFFF'); |
|
31 p.setAttribute('newCrash', 'true'); |
|
32 iframe.contentDocument.body.appendChild(p); |
|
33 |
|
34 // The plugin will now crash when it is instantiated, but |
|
35 // that happens asynchronously. HACK: this should use an |
|
36 // event instead of nested pending runnables, but I don't |
|
37 // know of any DOM event that's fired when a plugin is |
|
38 // instantiated. |
|
39 SimpleTest.executeSoon(function() { |
|
40 SimpleTest.executeSoon(function() { |
|
41 ok(p.setColor === undefined, |
|
42 "Plugin should have crashed on creation"); |
|
43 |
|
44 window.frameLoaded = reloaded1; |
|
45 iframe.contentWindow.location.replace('crashing_subpage.html'); |
|
46 }) |
|
47 }); |
|
48 } |
|
49 |
|
50 function reloaded1() { |
|
51 var p = iframe.contentDocument.getElementById('plugin1'); |
|
52 try { |
|
53 p.setColor('FF00FF00'); |
|
54 ok(true, "Reloading after crash-on-new worked"); |
|
55 } |
|
56 catch (e) { |
|
57 ok(false, "Reloading after crash-on-new didn't give us a usable plugin"); |
|
58 } |
|
59 p.crashOnDestroy(); |
|
60 // the child crash should happen here |
|
61 p.parentNode.removeChild(p); |
|
62 |
|
63 window.frameLoaded = reloaded2; |
|
64 SimpleTest.executeSoon(function() { |
|
65 iframe.contentWindow.location.reload(); |
|
66 }); |
|
67 } |
|
68 |
|
69 function reloaded2() { |
|
70 var p = iframe.contentDocument.getElementById('plugin1'); |
|
71 try { |
|
72 p.setColor('FF00FF00'); |
|
73 ok(true, "Reloading after crash-on-destroy worked"); |
|
74 } |
|
75 catch (e) { |
|
76 ok(false, "Reloading after crash-on-destroy didn't give us a usable plugin"); |
|
77 } |
|
78 SimpleTest.finish(); |
|
79 } |
|
80 </script> |