blob: e301e45fb4e555ae704dbf7c8f8da7faa34ef2d4 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../resources/js-test.js"></script>
</head>
<body id="body">
<div id="content" role="group">
<iframe id="frame" src="resources/frameset.html" onload="frameLoad();" width=500 height=500></iframe>
</div>
<p id="description"></p>
<div id="console"></div>
<script>
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.");
var loadCount = 0;
var markerRange = 0;
var string = 0;
function subFrameLoaded() {
// Step 2: When the sub frame of the iframe loads again this method is called (from that sub-frame)
// Access the old marker range that we kept hanging around and try to access after the frame changes. This should not crash.
var frame = accessibilityController.accessibleElementById("content");
var webArea = frame.childAtIndex(0).childAtIndex(0);
string = webArea.stringForTextMarkerRange(markerRange);
// Now try to access a node in the sub-frame, and then we'll replace the parent frame.
var text = frame.childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0);
// Access a marker range so that we start tracking a node in our cache.
markerRange = text.textMarkerRangeForElement(text);
string = text.stringForTextMarkerRange(markerRange);
shouldBe("string", "'test text'");
// Step 3: Replace the top level iframe src while holding onto a marker range and verify there's no crash
document.getElementById("frame").onload = function() {
document.getElementById("content").removeChild(document.getElementById("frame"));
string = accessibilityController.accessibleElementById("content").stringForTextMarkerRange(markerRange);
debug("TEST PASSED: NO CRASH");
finishJSTest();
gc();
};
document.getElementById("frame").src = "resources/text.html";
gc();
}
function frameLoad() {
// Step 1: When the iframe loads get a marker range that is reference is the sub-frame of the iframe.
var frame = accessibilityController.accessibleElementById("content");
var text = frame.childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0).childAtIndex(0);
// Access a marker range so that we start tracking a node in our cache.
markerRange = text.textMarkerRangeForElement(text);
string = text.stringForTextMarkerRange(markerRange);
shouldBe("string", "'hello'");
gc();
// Load a new frame in this location which should now invalidate the marker range cache (and not lead to a crash).
document.getElementById("frame").contentWindow.frames[0].location = "resources/inform-parent-of-load.html";
gc();
}
jsTestIsAsync = true;
</script>
</body>
</html>