|
1 <!DOCTYPE HTML> |
|
2 <html class="reftest-wait"> |
|
3 <head> |
|
4 <script> |
|
5 var unusedScreenX; |
|
6 function XSync() { |
|
7 unusedScreenX = window.screenX; |
|
8 } |
|
9 |
|
10 function finish() { |
|
11 document.documentElement.removeAttribute("class"); |
|
12 } |
|
13 |
|
14 function cleanup() { |
|
15 try { |
|
16 document.getElementById("plugin").crash(); |
|
17 } catch (dontcare) { |
|
18 } |
|
19 window.setTimeout(finish, 100); |
|
20 } |
|
21 |
|
22 function scrollOfDeath() { |
|
23 // Add a listener for the MozAfterPaint after the scrollTo below. |
|
24 // If we don't crash during the scroll, we'll get the |
|
25 // MozAfterPaint. |
|
26 window.addEventListener("MozAfterPaint", cleanup, false); |
|
27 window.scrollTo(0, 50); |
|
28 } |
|
29 |
|
30 // |
|
31 // The sequence of events we expect is |
|
32 // |
|
33 // load (including initial paints of plugin that are cached) |
|
34 // destroy X resources |
|
35 // [X server has time to observe resource destruction] |
|
36 // scrollTo |
|
37 // [repaint using cached plugin surface: BOOM if buggy] |
|
38 // MozAfterPaint |
|
39 // cleanup |
|
40 // |
|
41 // However, this test is fundamentally nondeterministic. There are |
|
42 // two main "failure" modes |
|
43 // (1) X server doesn't have time to observer resource destruction |
|
44 // before paint-after-scroll |
|
45 // (2) plugin's crash notification arrives before |
|
46 // paint-after-scroll |
|
47 // Both result in spurious passes. |
|
48 // |
|
49 // This test is anal about cleanup because it must be pretty sure that |
|
50 // the plugin subprocess is gone before starting the next test. We |
|
51 // double-check that the plugin is gone by the time we're done by |
|
52 // trying to crash it again, after we expect it to have crashed already. |
|
53 // |
|
54 function runTest() { |
|
55 // Have the plugin throw away its X resources, one of which is |
|
56 // probably a drawable to which we hold a reference |
|
57 document.getElementById("plugin").destroySharedGfxStuff(); |
|
58 |
|
59 // Do something that's (hopefully) equivalent to an XSync() to allow |
|
60 // the resource destruction to propagate to the server |
|
61 XSync(); |
|
62 |
|
63 // Set up a scroll to happen soon |
|
64 window.setTimeout(scrollOfDeath, 100); |
|
65 } |
|
66 |
|
67 window.addEventListener("MozReftestInvalidate", runTest, false); |
|
68 </script> |
|
69 </head> |
|
70 |
|
71 <body style="width: 400px; height: 10000px;"> |
|
72 <embed id="plugin" type="application/x-test" |
|
73 style="position:absolute; |
|
74 top:100px; left:50px; width:200px; height:200px;"> |
|
75 </embed> |
|
76 </body> |
|
77 </html> |