<!DocType HTML>
<script>
if (window.testRunner)
testRunner.dumpAsText();
var iframe, iframeDoc;
function log(msg)
{
document.getElementById('logger').innerHTML += msg + '\n';
}
var i = 0;
function runTest(test, opt_expectedErrorName)
{
var errorName;
try {
test();
} catch(error) {
errorName = error.name;
} finally {
i++;
var hasExpectedErrorName = opt_expectedErrorName;
if (hasExpectedErrorName && navigator.userAgent.indexOf('Firefox') != -1)
opt_expectedErrorName = 'NS_ERROR_DOM_' + opt_expectedErrorName;
if (!errorName && !opt_expectedErrorName || opt_expectedErrorName == errorName)
log(i + '. PASS');
else
log(i + '. FAIL: expected ' + opt_expectedErrorName + ' got ' + (errorName || 'no error'));
}
}
function elementInCurrentDocument(html)
{
var node = document.createElement('div');
node.innerHTML = html || 'lorem ipsum';
document.body.appendChild(node);
return node;
}
function rangeInIframe()
{
var range = iframeDoc.createRange();
range.setStart(iframeDoc.body, 0);
range.setEnd(iframeDoc.body, 1);
return range;
}
function rangeInCurrentDocument()
{
var range = document.createRange();
range.setStart(document.body, 0);
range.setEnd(document.body, 1);
return range;
}
function run()
{
iframe = document.querySelector('iframe');
iframeDoc = iframe.contentDocument;
runTest(function() {
iframeDoc.body.appendChild(document.createElement('div'));
iframeDoc.body.appendChild(elementInCurrentDocument('appendChild'));
});
runTest(function() {
var dummy = document.createElement('span');
iframeDoc.body.appendChild(dummy);
iframeDoc.body.replaceChild(document.createElement('div'), dummy);
var dummy = document.createElement('span');
iframeDoc.body.appendChild(dummy);
iframeDoc.body.replaceChild(elementInCurrentDocument('replaceChild'), dummy);
});
runTest(function() {
iframeDoc.body.insertBefore(document.createElement('div'), iframeDoc.body.firstChild);
iframeDoc.body.insertBefore(elementInCurrentDocument('insertBefore'), iframeDoc.body.firstChild);
});
runTest(function() {
rangeInIframe().insertNode(document.createElement('div'));
rangeInIframe().insertNode(elementInCurrentDocument('insertNode'));
});
runTest(function() {
rangeInIframe().surroundContents(document.createElement('div'));
rangeInIframe().surroundContents(elementInCurrentDocument('surroundContents'));
});
runTest(function() {
iframeDoc.body.appendChild(document.createElement('div'));
var element = elementInCurrentDocument('insertBefore');
// Make sure we don't crash if the element is moved back to the original document during the insertBefore call.
var mutationHandler = function() {
document.body.removeEventListener('DOMSubtreeModified', mutationHandler, true);
document.body.appendChild(element);
// Access something on the element to see if it's in a valid state.
element.offsetLeft;
};
document.body.addEventListener('DOMSubtreeModified', mutationHandler, true);
try {
iframeDoc.body.insertBefore(element);
} catch (e) {
throw e;
} finally {
// Clear the event handler to avoid affecting the following tests.
}
}, "TypeError");
runTest(function() {
iframeDoc.body.appendChild(document.createElement('div'));
var element = elementInCurrentDocument('appendChild');
// Make sure we don't crash if the element is moved back to the original document during the insertBefore call.
var mutationHandler = function() {
document.body.removeEventListener('DOMSubtreeModified', mutationHandler, true);
document.body.appendChild(element);
// Access something on the element to see if it's in a valid state.
element.offsetLeft;
};
document.body.addEventListener('DOMSubtreeModified', mutationHandler, true);
try {
iframeDoc.body.appendChild(element);
} catch (e) {
throw e;
} finally {
// Clear the event handler to avoid affecting the following tests.
}
});
runTest(function() {
iframeDoc.body.appendChild(document.createElement('div'));
var element = elementInCurrentDocument('replaceChild');
// Make sure we don't crash if the element is moved back to the original
// document during the replaceChild call.
var mutationHandler = function() {
document.body.removeEventListener('DOMSubtreeModified', mutationHandler, true);
document.body.appendChild(element);
// Access something on the element to see if it's in a valid state.
element.offsetLeft;
};
document.body.addEventListener('DOMSubtreeModified', mutationHandler, true);
try {
iframeDoc.body.replaceChild(element, iframeDoc.body.firstChild);
} catch (e) {
throw e;
} finally {
// Clear the event handler to avoid affecting the following tests.
}
});
runTest(function() {
var attribute = document.createAttribute('asdf');
iframeDoc.body.attributes.setNamedItem(attribute);
});
runTest(function() {
var attribute = document.createAttribute('asdf');
document.body.attributes.setNamedItem(attribute);
iframeDoc.body.attributes.setNamedItem(attribute);
}, 'InUseAttributeError');
runTest(function() {
var doctype = document.implementation.createDocumentType(
'html',
'-//W3C//DTD XHTML 1.0 Strict//EN',
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
);
iframeDoc.implementation.createDocument('', 'html', doctype);
});
runTest(function() {
iframeDoc.implementation.createDocument('', 'html', document.doctype);
});
runTest(function() {
rangeInIframe().compareBoundaryPoints(Range.END_TO_END, rangeInCurrentDocument());
}, 'WrongDocumentError');
runTest(function() {
rangeInIframe().comparePoint(elementInCurrentDocument('comparePoint'), 0);
}, 'WrongDocumentError');
runTest(function() {
iframeDoc.appendChild(document.doctype);
console.log(document.doctype);
}, 'TypeError');
// When setting a boundary of the range in a different
// document, the call should succeed and the range should be collapsed.
runTest(function() {
rangeInIframe().setStart(elementInCurrentDocument('setStart'), 0);
});
runTest(function() {
rangeInIframe().setEnd(elementInCurrentDocument('setEnd'), 0);
});
runTest(function() {
rangeInIframe().setStartBefore(elementInCurrentDocument('setStartBefore'), 0);
});
runTest(function() {
rangeInIframe().setStartAfter(elementInCurrentDocument('setStartAfter'), 0);
});
runTest(function() {
rangeInIframe().setEndBefore(elementInCurrentDocument('setEndBefore'), 0);
});
runTest(function() {
rangeInIframe().setEndAfter(elementInCurrentDocument('setEndAfter'), 0);
});
runTest(function() {
rangeInIframe().isPointInRange(elementInCurrentDocument('isPointInRange'), 0);
});
}
</script>
<pre id='logger'></pre>
<iframe onload='run()'></iframe>