| <!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, null); |
| } 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('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 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.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> |