Update device orientation & motion permission native SPI as per latest proposal
[WebKit-https.git] / LayoutTests / accessibility / frame-disconnect-textmarker-cache-crash.html
1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
2 <html>
3 <head>
4 <script src="../resources/js-test.js"></script>
5 </head>
6 <body id="body">
7
8 <div id="content" role="group">
9 <iframe id="frame" src="resources/frameset.html" onload="frameLoad();" width=500 height=500></iframe>
10 </div>
11
12 <p id="description"></p>
13 <div id="console"></div>
14
15 <script>
16
17     description("This tests that when we access a text marker in a frame that is subsequently replaced by a different frame, we don't leave a hanging node in the cache that leads to a crash.");
18
19     var loadCount = 0;
20     var markerRange = 0;
21     var string = 0;
22
23     function subFrameLoaded() {
24
25         // Step 2: When the sub frame of the iframe loads again this method is called (from that sub-frame)
26
27         // Access the old marker range that we kept hanging around and try to access after the frame changes. This should not crash.
28         var frame = accessibilityController.accessibleElementById("content");
29         var webArea = frame.childAtIndex(0).childAtIndex(0);
30         string = webArea.stringForTextMarkerRange(markerRange);
31
32         // Now try to access a node in the sub-frame, and then we'll replace the parent frame.
33         var text = frame.childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0);
34         // Access a marker range so that we start tracking a node in our cache.
35         markerRange = text.textMarkerRangeForElement(text);
36         string = text.stringForTextMarkerRange(markerRange);
37         shouldBe("string", "'test text'");
38
39         // Step 3: Replace the top level iframe src while holding onto a marker range and verify there's no crash
40         document.getElementById("frame").onload = function() {
41             document.getElementById("content").removeChild(document.getElementById("frame"));
42             string = accessibilityController.accessibleElementById("content").stringForTextMarkerRange(markerRange);
43
44             debug("TEST PASSED: NO CRASH");
45
46             finishJSTest();
47             gc();
48         };
49
50         document.getElementById("frame").src = "resources/text.html";
51
52         gc();
53     }
54
55     function frameLoad() {
56
57         // Step 1: When the iframe loads get a marker range that is reference is the sub-frame of the iframe.
58         var frame = accessibilityController.accessibleElementById("content");
59
60         var text = frame.childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0);
61       
62         // Access a marker range so that we start tracking a node in our cache.
63         markerRange = text.textMarkerRangeForElement(text);
64         string = text.stringForTextMarkerRange(markerRange);
65
66         shouldBe("string", "'hello'"); 
67         gc();
68
69         // Load a new frame in this location which should now invalidate the marker range cache (and not lead to a crash).
70         document.getElementById("frame").contentWindow.frames[0].location = "resources/inform-parent-of-load.html";
71
72         gc();
73     }
74
75     jsTestIsAsync = true;
76
77 </script>
78 </body>
79 </html>