OLD | NEW |
---|---|
1 <!DOCTYPE html> | |
1 <html> | 2 <html> |
3 <head> | |
4 <script src="../../resources/testharness.js"></script> | |
5 <script src="../../resources/testharnessreport.js"></script> | |
6 </head> | |
7 <body> | |
8 <iframe id="subframe" src="about:blank"></iframe> | |
2 <script> | 9 <script> |
3 if (window.testRunner) { | |
4 testRunner.dumpAsText(); | |
5 testRunner.waitUntilDone(); | |
6 } | |
7 | 10 |
8 function log(strings) { | 11 var testNavigatorOnLoad = async_test("Accessing a navigator object that just got removed does not crash.") |
9 var node = document.getElementById('result'); | 12 var testNavigatorLater = async_test("Accessing a navigator object that got remov ed some time before does not crash.") |
10 for (var i in strings) { | 13 |
11 node.innerHTML += strings[i] + '<br>'; | 14 // Reference to the removed navigator object. |
15 var oldNav = null; | |
16 | |
17 function gc() { | |
18 if (window.GCController) { | |
19 GCController.collect(); | |
20 } else { | |
21 for (var i = 0; i < 10000; i++) { | |
22 var s = new String("abc"); | |
23 } | |
12 } | 24 } |
13 } | 25 } |
14 | 26 |
15 function gc() | 27 function test() { |
16 { | 28 // Keep a reference of the navigator and remove the frame. |
17 if (window.GCController) { | 29 oldNav = window.frames[0].navigator; |
18 GCController.collect(); | 30 var frame = document.getElementById("subframe"); |
19 } else { | 31 frame.parentNode.removeChild(frame); |
20 for (var i = 0; i < 10000; i++) { | |
21 var s = new String("abc"); | |
22 } | |
23 } | |
24 } | |
25 | 32 |
26 var old_nav; | |
27 | |
28 function test() { | |
29 // remember the old navigator | |
30 old_nav = window.frames[0].navigator; | |
31 // detach the old navigator | |
32 var p = document.getElementById("subframe"); | |
33 p.parentNode.removeChild(p); | |
34 if (window.GCController) | 33 if (window.GCController) |
35 window.GCController.collect(); | 34 window.GCController.collect(); |
36 | 35 |
37 // Check once immediately | 36 // Check once immediately. |
38 check_navigator(); | 37 testNavigatorOnLoad.step(function() { |
38 check_navigator(); | |
39 }); | |
40 testNavigatorOnLoad.done(); | |
39 | 41 |
40 gc(); | 42 gc(); |
41 | 43 |
42 // Check one more time later, when the frame is likely to be destroyed. | 44 // Check one more time later, when the frame is likely to be destroyed. |
43 setTimeout(check_navigator_and_done, 200); | 45 setTimeout(function() { |
44 } | 46 testNavigatorLater.step(function() { |
45 | 47 check_navigator(); |
46 function check_navigator_and_done() { | 48 }); |
47 check_navigator(); | 49 testNavigatorLater.done(); |
48 if (window.testRunner) | 50 }, 200); |
eseidel
2014/06/02 18:23:16
Bleh! setTimeout tests = flaky tests. :(
mlamouri (slow - plz ping)
2014/06/02 18:36:09
I entirely agree but I prefer to not change the be
| |
49 testRunner.notifyDone(); | |
50 } | 51 } |
51 | 52 |
52 function check_navigator() { | 53 function check_navigator() { |
53 var strings = [ ]; | 54 for (p in oldNav) { |
54 for (p in old_nav) { | 55 if (typeof oldNav[p] == 'function') { |
55 if (p == 'geolocation' || p == 'webkitGetUserMedia') // Don't include Geoloc ation or the Media Stream API functions until most platforms have support. | |
56 continue; | |
57 | |
58 if (typeof old_nav[p] == 'function') { | |
59 try { | 56 try { |
60 var v = old_nav[p](); | 57 var v = oldNav[p](); |
61 // no crash, it is ok | 58 assert_true(true, "navigator."+p+"() is OK"); |
62 strings.push("navigator."+p+"() is OK"); | |
63 } catch(err) { | 59 } catch(err) { |
64 // navigator.registerXXX will throw on invalid input. | 60 // Some function call will asserts, the assert shouldn't make the test f ail. |
65 strings.push("navigator."+p+"() threw err "+err); | 61 assert_true(true, "navigator."+p+"() threw err "+err); |
66 } | 62 } |
67 } else { | 63 } else { |
68 var v = old_nav[p]; | 64 var v = oldNav[p]; |
69 // no crash, it is ok. | 65 assert_true(true, "navigator."+p+" is OK"); |
70 strings.push("navigator."+p+" is OK"); | |
71 } | 66 } |
72 } | 67 } |
73 strings.sort(); | |
74 log(strings); | |
75 } | 68 } |
76 | 69 |
70 window.addEventListener('load', test); | |
71 | |
77 </script> | 72 </script> |
78 <body onload="test()"> | 73 |
79 This tests that the navigator object of a deleted frame is disconnected | |
80 properly. Accessing fields or methods shouldn't crash the browser. | |
81 <br> | |
82 <iframe id="subframe" src="about:blank"></iframe> | |
83 <button onclick="check_navigator()">Check Navigator</button><br> | |
84 <div id="result"></div> | |
85 </body> | 74 </body> |
86 </html> | 75 </html> |
OLD | NEW |