2015-01-07 16:55:10 +00:00
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
< html >
< head >
2017-05-19 23:37:59 +00:00
< script src = "../resources/js-test.js" > < / script >
2015-01-07 16:55:10 +00:00
< / 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");
2017-05-19 23:37:59 +00:00
finishJSTest();
2015-01-07 16:55:10 +00:00
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();
}
2017-05-19 23:37:59 +00:00
jsTestIsAsync = true;
2015-01-07 16:55:10 +00:00
< / script >
< / body >
< / html >