Crash closing window containing Flash plug-in
[WebKit-https.git] / LayoutTests / plugins / iframe-shims.html
1 <html><head>
2 <script>
3     var expectedClicks = [];
4     var clicks = [];
5
6     var height = 100;
7     var width = 100;
8     var items = 0;
9
10     function makePluginElement()
11     {
12         var f = document.createElement('embed');
13         f.setAttribute('id', 'swf_embed_' + items);
14         f.setAttribute('width', width + '');
15         f.setAttribute('height', height + '');
16         f.setAttribute('wmode', 'window');
17         f.setAttribute('loop', 'false');
18         f.setAttribute('src', 'resources/simple_blank.swf');
19         f.setAttribute('type', 'application/x-shockwave-flash');
20         return f;
21     }
22
23     function makeIframeDiv()
24     {
25         var i = document.createElement('iframe');
26         i.style.position = 'absolute';
27         i.style.top = '10px';
28         i.style.left = '30px';
29         i.style.width = '80px';
30         i.style.height = '80px';
31         i.setAttribute('frameborder', '0');
32         i.setAttribute('src', 'javascript:void(0);');
33         return i;
34     }
35
36     function makeOverlayDiv(color, caseId)
37     {
38         var o = document.createElement('div');
39         o.style.position = 'absolute';
40         o.style.top = '10px';
41         o.style.left = '30px';
42         o.style.width = '80px';
43         o.style.height = '80px';
44         o.style.backgroundColor = color;
45         o.style.overflow = 'hidden';
46         o.innerHTML = '<input type="button" id="button' + caseId + '" ' +
47             'onclick="doClick(' + caseId +
48             ');" value="clickme" style="position: absolute; top: 10; left: 10; width: 60px; height: 60px;"/>';
49         return o;
50     }
51     
52     function appendOverlay(overlayDivZIframe, overlayDivZOverlay, overlayInsideDiv, expectClickable, caseId)
53     {
54         var id = makeIframeDiv();
55         var root = document.getElementById(caseId);
56         if (overlayDivZIframe)
57             id.style.zIndex = overlayDivZIframe;
58
59         var od = makeOverlayDiv(expectClickable ? 'green' : 'red', caseId);
60         od.style.position = 'absolute';
61         if (overlayDivZOverlay)
62             od.style.zIndex = overlayDivZOverlay;
63
64         if (overlayInsideDiv) {
65             var parentdiv = document.createElement('div');
66             if (overlayDivZOverlay)
67                 parentdiv.style.zIndex = overlayDivZOverlay;
68
69             parentdiv.style.position = 'absolute';
70             parentdiv.style.top = '0px';
71             parentdiv.style.left = '0px';
72             parentdiv.appendChild(id);
73             parentdiv.appendChild(od);
74             root.appendChild(parentdiv);
75         } else {
76             root.appendChild(id);
77             root.appendChild(od);
78         }
79     };
80
81     function addCase(x, y, tags)
82     {
83         var caseId = items;
84         items++;
85
86         var expectClickable = tags.expect && tags.expect.indexOf('UNDER') == -1;
87         expectedClicks[caseId] = expectClickable;
88
89         var container = document.getElementById('container');
90         var root = document.createElement('div');
91         root.style.position = 'absolute';
92         root.style.left = x * (width + 40) + 'px';
93         root.style.top = y * (height + 20) + 'px';
94         root.id = caseId;
95         container.appendChild(root);
96
97         var pluginDivZ;
98         var overlayDivZIframe;
99         var overlayDivZOverlay;
100         if (tags.pluginLowerz) {
101             pluginDivZ = 100;
102             overlayDivZIframe = 200;
103             overlayDivZOverlay = 201;
104         } else if (tags.pluginHigherz) {
105             pluginDivZ = 200;
106             overlayDivZIframe = 100;
107             overlayDivZOverlay = 101;
108         } else if (tags.pluginEqualz) {
109             pluginDivZ = 100;
110             overlayDivZIframe = 100;
111             overlayDivZOverlay = 100;
112         }
113
114         var appendPlugin = function()
115         {
116             var pd = makePluginElement();
117             if (tags.pluginInsideDiv || pluginDivZ) {
118                 var parentdiv = document.createElement('div');
119                 parentdiv.appendChild(pd)
120                 if (!tags.pluginNorelative)
121                     parentdiv.style.position = 'relative';
122
123                 if (pluginDivZ)
124                     parentdiv.style.zIndex = pluginDivZ;
125
126                 root.appendChild(parentdiv);
127             } else {
128                 if (!tags.pluginNorelative)
129                     pd.style.position = 'relative';
130
131                 root.appendChild(pd);
132             }
133         };
134
135         if (tags.overlayEarlier) {
136             appendOverlay(overlayDivZIframe, overlayDivZOverlay, tags.overlayInsideDiv, expectClickable, caseId);
137             appendPlugin();
138         } else {
139             appendPlugin();
140             if (tags.overlayOnTimeout) {
141                 setTimeout('appendOverlay('+overlayDivZIframe+', '+overlayDivZOverlay +', ' + tags.overlayInsideDiv + ', ' + expectClickable + ', ' + caseId + ')', 0);
142             } else {
143                 appendOverlay(overlayDivZIframe, overlayDivZOverlay, tags.overlayInsideDiv, expectClickable, caseId);
144             }
145         }
146      }
147
148     function doClick(id)
149     {
150         clicks[id] = true;
151
152         // Check success/failure.
153         var output = document.getElementById("output");
154         var waitingForMoreClicks = false;
155         var k;
156         for (k in expectedClicks) {
157             if (expectedClicks[k] && !clicks[k])
158                 waitingForMoreClicks = true;
159             else if (!expectedClicks[k] && clicks[k]) {
160                 output.innerHTML = 'FAILURE';
161                 return;
162             }
163         }
164
165         if (!waitingForMoreClicks) {
166             output.innerHTML = 'SUCCESS';
167             return;
168         }
169     }
170
171     function init() {
172         addCase(0, 0, {expect:'overlay OVER'});
173         addCase(1, 0, {'overlayEarlier':1, 'overlayInsideDiv': 1, 'pluginInsideDiv':1, expect:'overlay UNDER'});
174         addCase(2, 0, {'pluginLowerz':1, expect:'overlay OVER'});
175         addCase(3, 0, {'pluginHigherz':1, expect:'overlay UNDER'});
176         addCase(0, 1, {'overlayInsideDiv':1, expect:'overlay OVER'});
177         addCase(1, 1, {'pluginLowerz':1, 'overlayInsideDiv':1, expect:'overlay OVER'});
178         addCase(2, 1, {'pluginHigherz':1, 'overlayInsideDiv':1, expect:'overlay UNDER'});
179         addCase(0, 2, {'pluginEqualz':1, 'overlayInsideDiv':1, expect:'overlay OVER'});
180         addCase(1, 2, {'pluginEqualz':1, 'overlayInsideDiv':1, 'overlayEarlier':1, expect:'overlay UNDER'});
181         addCase(2, 2, {'overlayEarlier':1, expect:'overlay UNDER'});
182         addCase(3, 2, {'overlayEarlier':1, 'pluginNorelative':1, expect:'overlay OVER'});
183         addCase(0, 3, {'pluginNorelative':1, expect:'overlay OVER'});
184         addCase(1, 3, {'overlayEarlier':1, 'pluginNorelative':1, 'pluginInsideDiv':1, expect:'overlay OVER'});
185         addCase(2, 3, {'pluginNorelative':1, 'pluginInsideDiv':1, expect:'overlay OVER'});
186         addCase(3, 3, {'pluginLowerz':1, 'overlayOnTimeout':1, expect:'overlay OVER'});
187
188         runTest();
189     }
190
191     // Automation: try to click on each button.
192     var nextIdToClick = 0;
193
194     function runTest() {
195         if (window.layoutTestController && window.eventSender) {
196             layoutTestController.waitUntilDone();
197             layoutTestController.dumpAsText();
198             setTimeout(doNextClick, 0);
199         }
200     }
201
202     function moveMouseOver(elemName) {
203         var elem = document.getElementById(elemName);
204         var x = elem.offsetLeft + elem.scrollWidth / 2;
205         var y = elem.offsetTop + elem.scrollHeight / 2;
206         var offsetParent = elem.offsetParent;
207         while (offsetParent) {
208             x += offsetParent.offsetLeft;
209             y += offsetParent.offsetTop;
210             offsetParent = offsetParent.offsetParent;
211         }
212         eventSender.mouseMoveTo(x, y);
213     }
214
215     function doNextClick() {
216         eventSender.mouseUp();
217         if (nextIdToClick < expectedClicks.length) {
218             moveMouseOver('button' + nextIdToClick);
219             eventSender.mouseDown();
220             nextIdToClick++;
221             setTimeout(doNextClick, 0);
222         } else {
223             setTimeout(function() {
224                 layoutTestController.notifyDone();
225             }, 0);
226         }
227     }
228
229 </script>
230 </head>
231 <body onload="init()">
232
233     <p>Test that iframe shims can be used to overlay HTML above a
234     windowed plugin. The red squares should be hidden by the blue
235     flash plugins, and the green squares should appear over the
236     plugins. To test interactively, click over the buttons on the
237     squares. You should not be able to reach the red squares'
238     buttons.</p>
239
240     <p>Prints "SUCCESS" on success, "FAILURE" on failure.</p>
241     <div id=output>NONE</div>
242     <div id="container" style="position: relative;"></div>
243
244 </body>
245 </html>