aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/editor/range_test.html
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/editor/range_test.html')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/editor/range_test.html912
1 files changed, 0 insertions, 912 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/editor/range_test.html b/contexts/data/lib/closure-library/closure/goog/editor/range_test.html
deleted file mode 100644
index c490a3b..0000000
--- a/contexts/data/lib/closure-library/closure/goog/editor/range_test.html
+++ /dev/null
@@ -1,912 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-Copyright 2008 The Closure Library Authors. All Rights Reserved.
-
-Use of this source code is governed by the Apache License, Version 2.0.
-See the COPYING file for details.
--->
-<!--
-
- @author nicksantos@google.com (Nick Santos)
--->
-<head>
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<title>Closure Unit Tests - goog.editor.range</title>
-<script src="../base.js"></script>
-<script>
- goog.require('goog.dom');
- goog.require('goog.dom.Range');
- goog.require('goog.editor.range');
- goog.require('goog.testing.dom');
- goog.require('goog.testing.jsunit');
-</script>
-</head>
-<body>
-<div id='root'>
-<div id='parentNode'>
- abc
- <div id='def'>def</div>
- ghi
- <div id='jkl'>jkl</div>
- mno
- <div id='pqr'>pqr</div>
- stu
-</div>
-
-<div id='caretRangeTest-1'>
- abc
- <div id='def-1'>def</div>
- ghi
- <div id='jkl-1'>jkl</div>
- mno
- <div id='pqr-1'>pqr</div>
- stu
-</div>
-
-<div id='normalizeTest-with-br'>abc<br/>def</div>
-<div id='normalizeTest-with-div'><div>abc</div></div>
-<div id='normalizeTest-with-empty-text-nodes'></div>
-
-<div id='normalizeTest-2'>
- abc
- <div id='def-2'>def</div>
- ghi
- <div id='jkl-2'>jkl</div>
- mno
- <div id='pqr-2'>pqr</div>
- stu
-</div>
-
-<div id='normalizeTest-3'>
- abc
- <div id='def-3'>def</div>
- ghi
- <div id='jkl-3'>jkl</div>
- mno
- <div id='pqr-3'>pqr</div>
- stu
-</div>
-
-<div id='normalizeTest-4'>
- abc
- <div id='def-4'>def</div>
- ghi
- <div id='jkl-4'>jkl</div>
- mno
- <div id='pqr-4'>pqr</div>
- stu
-</div>
-
-<div id='editableTest' g_editable='true'>
- abc
- <div>def</div>
- ghi
- <div>jkl</div>
- mno
- <div>pqr</div>
- stu
-</div>
-
-</div>
-<script>
-
-var savedHtml;
-var $ = goog.dom.getElement;
-
-function setUp() {
- savedHtml = $('root').innerHTML;
-}
-
-function tearDown() {
- $('root').innerHTML = savedHtml;
-}
-
-function testNoNarrow() {
- var def = $('def');
- var jkl = $('jkl');
- var range = goog.dom.Range.createFromNodes(
- def.firstChild, 1, jkl.firstChild, 2);
-
- range = goog.editor.range.narrow(range, $('parentNode'));
- goog.testing.dom.assertRangeEquals(
- def.firstChild, 1, jkl.firstChild, 2, range);
-}
-
-function testNarrowAtEndEdge() {
- var def = $('def');
- var jkl = $('jkl');
- var range = goog.dom.Range.createFromNodes(
- def.firstChild, 1, jkl.firstChild, 2);
-
- range = goog.editor.range.narrow(range, def);
- goog.testing.dom.assertRangeEquals(
- def.firstChild, 1, def.firstChild, 3, range);
-}
-
-function testNarrowAtStartEdge() {
- var def = $('def');
- var jkl = $('jkl');
- var range = goog.dom.Range.createFromNodes(
- def.firstChild, 1, jkl.firstChild, 2);
-
- range = goog.editor.range.narrow(range, jkl);
-
- goog.testing.dom.assertRangeEquals(
- jkl.firstChild, 0, jkl.firstChild, 2, range);
-}
-
-function testNarrowOutsideElement() {
- var def = $('def');
- var jkl = $('jkl');
- var range = goog.dom.Range.createFromNodes(
- def.firstChild, 1, jkl.firstChild, 2);
-
- range = goog.editor.range.narrow(range, $('pqr'));
- assertNull(range);
-}
-
-function testNoExpand() {
- var div = $('parentNode');
- div.innerHTML = '<div>longword</div>';
- // Select "ongwo" and make sure we don't expand since this is not
- // a full container.
- var textNode = div.firstChild.firstChild;
- var range = goog.dom.Range.createFromNodes(textNode, 1, textNode, 6);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(textNode, 1, textNode, 6, range);
-}
-
-function testSimpleExpand() {
- var div = $('parentNode');
- div.innerHTML = '<div>longword</div>foo';
- // Select "longword" and make sure we do expand to include the div since
- // the full container text is selected.
- var textNode = div.firstChild.firstChild;
- var range = goog.dom.Range.createFromNodes(textNode, 0, textNode, 8);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(div, 0, div, 1, range);
-
- // Select "foo" and make sure we expand out to the parent div.
- var fooNode = div.lastChild;
- range = goog.dom.Range.createFromNodes(fooNode, 0, fooNode, 3);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(div, 1, div, 2, range);
-}
-
-function testDoubleExpand() {
- var div = $('parentNode');
- div.innerHTML = '<div><span>longword</span></div>foo';
- // Select "longword" and make sure we do expand to include the span
- // and the div since both of their full contents are selected.
- var textNode = div.firstChild.firstChild.firstChild;
- var range = goog.dom.Range.createFromNodes(textNode, 0, textNode, 8);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(div, 0, div, 1, range);
-
- // Same visible position, different dom position.
- // Start in text node, end in span.
- range = goog.dom.Range.createFromNodes(textNode, 0, textNode.parentNode, 1);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(div, 0, div, 1, range);
-}
-
-function testMultipleChildrenExpand() {
- var div = $('parentNode');
- div.innerHTML = '<ol><li>one</li><li>two</li><li>three</li></ol>';
- // Select "two" and make sure we expand to the li, but not the ol.
- var li = div.firstChild.childNodes[1];
- var textNode = li.firstChild;
- var range = goog.dom.Range.createFromNodes(textNode, 0, textNode, 3);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(
- li.parentNode, 1, li.parentNode, 2, range);
-
- // Make the same visible selection, only slightly different dom position.
- // Select starting from the text node, but ending in the li.
- range = goog.dom.Range.createFromNodes(textNode, 0, li, 1);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(
- li.parentNode, 1, li.parentNode, 2, range);
-}
-
-function testSimpleDifferentContainersExpand() {
- var div = $('parentNode');
- div.innerHTML = '<ol><li>1</li><li><b>bold</b><i>italic</i></li></ol>';
- // Select all of "bold" and "italic" at the text node level, and
- // make sure we expand to the li.
- var li = div.firstChild.childNodes[1];
- var boldNode = li.childNodes[0];
- var italicNode = li.childNodes[1];
- var range = goog.dom.Range.createFromNodes(boldNode.firstChild, 0,
- italicNode.firstChild, 6);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(
- li.parentNode, 1, li.parentNode, 2, range);
-
- // Make the same visible selection, only slightly different dom position.
- // Select "bold" at the b node level and "italic" at the text node level.
- range = goog.dom.Range.createFromNodes(boldNode, 0,
- italicNode.firstChild, 6);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(
- li.parentNode, 1, li.parentNode, 2, range);
-}
-
-function testSimpleDifferentContainersSmallExpand() {
- var div = $('parentNode');
- div.innerHTML = '<ol><li>1</li><li><b>bold</b><i>italic</i>' +
- '<u>under</u></li></ol>';
- // Select all of "bold" and "italic", but we can't expand to the
- // entire li since we didn't select "under".
- var li = div.firstChild.childNodes[1];
- var boldNode = li.childNodes[0];
- var italicNode = li.childNodes[1];
- var range = goog.dom.Range.createFromNodes(boldNode.firstChild, 0,
- italicNode.firstChild, 6);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(li, 0, li, 2, range);
-
- // Same visible position, different dom position.
- // Select "bold" starting in text node, "italic" at i node.
- range = goog.dom.Range.createFromNodes(boldNode.firstChild, 0,
- italicNode, 1);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(li, 0, li, 2, range);
-}
-
-function testEmbeddedDifferentContainersExpand() {
- var div = $('parentNode');
- div.innerHTML = '<div><b><i>italic</i>after</b><u>under</u></div>foo';
- // Select "italic" "after" "under", should expand all the way to parent.
- var boldNode = div.firstChild.childNodes[0];
- var italicNode = boldNode.childNodes[0];
- var underNode = div.firstChild.childNodes[1];
- var range = goog.dom.Range.createFromNodes(italicNode.firstChild, 0,
- underNode.firstChild, 5);
-
- range = goog.editor.range.expand(range);
- goog.testing.dom.assertRangeEquals(div, 0, div, 1, range);
-}
-
-function testReverseSimpleExpand() {
- var div = $('parentNode');
- div.innerHTML = '<div>longword</div>foo';
- // Select "longword" and make sure we do expand to include the div since
- // the full container text is selected.
- var textNode = div.firstChild.firstChild;
- var range = goog.dom.Range.createFromNodes(textNode, 8, textNode, 0);
-
- range = goog.editor.range.expand(range);
-
- goog.testing.dom.assertRangeEquals(div, 0, div, 1, range);
-}
-
-function testExpandWithStopNode() {
- var div = $('parentNode');
- div.innerHTML = '<div><span>word</span></div>foo';
- // Select "word".
- var span = div.firstChild.firstChild;
- var textNode = span.firstChild;
- var range = goog.dom.Range.createFromNodes(textNode, 0, textNode, 4);
-
- range = goog.editor.range.expand(range);
-
- goog.testing.dom.assertRangeEquals(div, 0, div, 1, range);
-
- // Same selection, but force stop at the span.
- range = goog.dom.Range.createFromNodes(textNode, 0, textNode, 4);
-
- range = goog.editor.range.expand(range, span);
-
- goog.testing.dom.assertRangeEquals(span, 0, span, 1, range);
-}
-
-// Ojan didn't believe this code worked, this was the case he
-// thought was broken. Keeping just as a regression test.
-function testOjanCase() {
- var div = $('parentNode');
- div.innerHTML = '<em><i><b>foo</b>bar</i></em>';
- // Select "foo", at text node level.
- var iNode = div.firstChild.firstChild;
- var textNode = iNode.firstChild.firstChild;
- var range = goog.dom.Range.createFromNodes(textNode, 0, textNode, 3);
-
- range = goog.editor.range.expand(range);
-
- goog.testing.dom.assertRangeEquals(iNode, 0, iNode, 1, range);
-
- // Same selection, at b node level.
- range = goog.dom.Range.createFromNodes(iNode.firstChild, 0,
- iNode.firstChild, 1);
- range = goog.editor.range.expand(range);
-
- goog.testing.dom.assertRangeEquals(iNode, 0, iNode, 1, range);
-}
-
-function testPlaceCursorNextToLeft() {
- var div = $('parentNode');
- div.innerHTML = 'foo<div id="bar">bar</div>baz';
- var node = $('bar');
- var range = goog.editor.range.placeCursorNextTo(node, true);
-
- var expose = goog.testing.dom.exposeNode;
- assertEquals('Selection should be to the left of the node ' +
- expose(node) + ',' + expose(range.getStartNode().nextSibling),
- node, range.getStartNode().nextSibling);
- assertEquals('Selection should be collapsed',
- true, range.isCollapsed());
-}
-
-
-function testPlaceCursorNextToRight() {
- var div = $('parentNode');
- div.innerHTML = 'foo<div id="bar">bar</div>baz';
- var node = $('bar');
- var range = goog.editor.range.placeCursorNextTo(node, false);
-
- assertEquals('Selection should be to the right of the node',
- node, range.getStartNode().previousSibling);
- assertEquals('Selection should be collapsed',
- true, range.isCollapsed());
-}
-
-function testPlaceCursorNextTo_rightOfLineBreak() {
- var div = $('parentNode');
- div.innerHTML = '<div contentEditable="true">hhhh<br />h</div>';
- var children = div.firstChild.childNodes;
- assertEquals(3, children.length);
- var node = children[1];
- var range = goog.editor.range.placeCursorNextTo(node, false);
- assertEquals(node.nextSibling, range.getStartNode());
-}
-
-function testPlaceCursorNextTo_leftOfHr() {
- var div = $('parentNode');
- div.innerHTML = '<hr />aaa';
- var children = div.childNodes;
- assertEquals(2, children.length);
- var node = children[0];
- var range = goog.editor.range.placeCursorNextTo(node, true);
- if (goog.userAgent.IE && goog.userAgent.isVersion('9')) {
- assertEquals(div, range.getStartNode());
- assertEquals(0, range.getStartOffset());
- } else {
- assertEquals(children[0], range.getStartNode());
- assertEquals(0, range.getStartOffset());
- }
-}
-
-function testPlaceCursorNextTo_rightOfHr() {
- var div = $('parentNode');
- div.innerHTML = 'aaa<hr />';
- var children = div.childNodes;
- assertEquals(2, children.length);
- var node = children[1];
- var range = goog.editor.range.placeCursorNextTo(node, false);
- if (goog.userAgent.IE && goog.userAgent.isVersion('9')) {
- assertEquals(div, range.getStartNode());
- assertEquals(1, range.getStartOffset());
- } else {
- assertEquals(children[1], range.getStartNode());
- assertEquals(0, range.getStartOffset());
- }
-}
-
-function testGetDeepEndPoint() {
- var div = $('parentNode');
- var def = $('def');
- var jkl = $('jkl');
-
- assertPointEquals(div.firstChild, 0,
- goog.editor.range.getDeepEndPoint(
- goog.dom.Range.createFromNodeContents(div), true));
- assertPointEquals(div.lastChild, div.lastChild.length,
- goog.editor.range.getDeepEndPoint(
- goog.dom.Range.createFromNodeContents(div), false));
-
- assertPointEquals(def.firstChild, 0,
- goog.editor.range.getDeepEndPoint(
- goog.dom.Range.createCaret(div, 1), true));
- assertPointEquals(def.nextSibling, 0,
- goog.editor.range.getDeepEndPoint(
- goog.dom.Range.createCaret(div, 2), true));
-
-}
-
-function testNormalizeOnNormalizedDom() {
- var defText = $('def').firstChild;
- var jklText = $('jkl').firstChild;
- var range = goog.dom.Range.createFromNodes(defText, 1, jklText, 2);
-
- var newRange = normalizeBody(range);
- goog.testing.dom.assertRangeEquals(defText, 1, jklText, 2, newRange);
-}
-
-function testDeepPointFindingOnNormalizedDom() {
- var def = $('def');
- var jkl = $('jkl');
- var range = goog.dom.Range.createFromNodes(def, 0, jkl, 1);
-
- var newRange = normalizeBody(range);
-
- // Make sure that newRange is measured relative to the text nodes,
- // not the DIV elements.
- goog.testing.dom.assertRangeEquals(
- def.firstChild, 0, jkl.firstChild, 3, newRange);
-}
-
-function testNormalizeOnVeryFragmentedDom() {
- var defText = $('def').firstChild;
- var jklText = $('jkl').firstChild;
- var range = goog.dom.Range.createFromNodes(defText, 1, jklText, 2);
-
- // Fragment the DOM a bunch.
- fragmentText(defText);
- fragmentText(jklText);
-
- var newRange = normalizeBody(range);
-
- // our old text nodes may not be valid anymore. find new ones.
- defText = $('def').firstChild;
- jklText = $('jkl').firstChild;
-
- goog.testing.dom.assertRangeEquals(defText, 1, jklText, 2, newRange);
-}
-
-function testNormalizeOnDivWithEmptyTextNodes() {
- var emptyDiv = $('normalizeTest-with-empty-text-nodes');
-
- // Append empty text nodes to the emptyDiv.
- var tnode1 = goog.dom.createTextNode('');
- var tnode2 = goog.dom.createTextNode('');
- var tnode3 = goog.dom.createTextNode('');
-
- goog.dom.appendChild(emptyDiv, tnode1);
- goog.dom.appendChild(emptyDiv, tnode2);
- goog.dom.appendChild(emptyDiv, tnode3);
-
- var range = goog.dom.Range.createFromNodes(emptyDiv, 1, emptyDiv, 2);
-
- // Cannot use document.body.normalize() as it fails to normalize the div
- // (in IE) if it has nothing but empty text nodes.
- var newRange = goog.editor.range.rangePreservingNormalize(emptyDiv, range);
-
- if (goog.userAgent.GECKO &&
- goog.string.compareVersions(goog.userAgent.VERSION, '1.9') == -1) {
- // In FF2, node.normalize() leaves an empty textNode in the div, unlike
- // other browsers where the div is left with no children.
- goog.testing.dom.assertRangeEquals(
- emptyDiv.firstChild, 0, emptyDiv.firstChild, 0, newRange);
- } else {
- goog.testing.dom.assertRangeEquals(emptyDiv, 0, emptyDiv, 0, newRange);
- }
-}
-
-function testRangeCreatedInVeryFragmentedDom() {
- var def = $('def');
- var defText = def.firstChild;
- var jkl = $('jkl');
- var jklText = jkl.firstChild;
-
- // Fragment the DOM a bunch.
- fragmentText(defText);
- fragmentText(jklText);
-
- // Notice that there are two empty text nodes at the beginning of each
- // fragmented node.
- var range = goog.dom.Range.createFromNodes(def, 3, jkl, 4);
-
- var newRange = normalizeBody(range);
-
- // our old text nodes may not be valid anymore. find new ones.
- defText = $('def').firstChild;
- jklText = $('jkl').firstChild;
- goog.testing.dom.assertRangeEquals(defText, 1, jklText, 2, newRange);
-}
-
-function testNormalizeInFragmentedDomWithPreviousSiblings() {
- var ghiText = $('def').nextSibling;
- var mnoText = $('jkl').nextSibling;
- var range = goog.dom.Range.createFromNodes(ghiText, 1, mnoText, 2);
-
- // Fragment the DOM a bunch.
- fragmentText($('def').previousSibling); // fragment abc
- fragmentText(ghiText);
- fragmentText(mnoText);
-
- var newRange = normalizeBody(range);
-
- // our old text nodes may not be valid anymore. find new ones.
- ghiText = $('def').nextSibling;
- mnoText = $('jkl').nextSibling;
-
- goog.testing.dom.assertRangeEquals(ghiText, 1, mnoText, 2, newRange);
-}
-
-function testRangeCreatedInFragmentedDomWithPreviousSiblings() {
- var def = $('def');
- var ghiText = $('def').nextSibling;
- var jkl = $('jkl');
- var mnoText = $('jkl').nextSibling;
-
- // Fragment the DOM a bunch.
- fragmentText($('def').previousSibling); // fragment abc
- fragmentText(ghiText);
- fragmentText(mnoText);
-
- // Notice that there are two empty text nodes at the beginning of each
- // fragmented node.
- var root = $('parentNode');
- var range = goog.dom.Range.createFromNodes(root, 9, root, 16);
-
- var newRange = normalizeBody(range);
-
- // our old text nodes may not be valid anymore. find new ones.
- ghiText = $('def').nextSibling;
- mnoText = $('jkl').nextSibling;
- goog.testing.dom.assertRangeEquals(ghiText, 1, mnoText, 2, newRange);
-}
-
-/**
- * Branched from the tests for goog.dom.SavedCaretRange.
- */
-function testSavedCaretRange() {
- var def = $('def-1');
- var jkl = $('jkl-1');
-
- var range = goog.dom.Range.createFromNodes(
- def.firstChild, 1, jkl.firstChild, 2);
- range.select();
-
- var saved = goog.editor.range.saveUsingNormalizedCarets(range);
- assertHTMLEquals(
- "d<span id='" + saved.startCaretId_ + "'></span>ef", def.innerHTML);
- assertHTMLEquals(
- "jk<span id='" + saved.endCaretId_ + "'></span>l", jkl.innerHTML);
-
- clearSelectionAndRestoreSaved(saved);
-
- var selection = goog.dom.Range.createFromWindow(window);
- def = $('def-1');
- jkl = $('jkl-1');
- assertHTMLEquals('def', def.innerHTML);
- assertHTMLEquals('jkl', jkl.innerHTML);
-
- // Check that everything was normalized ok.
- assertEquals(1, def.childNodes.length);
- assertEquals(1, jkl.childNodes.length);
- goog.testing.dom.assertRangeEquals(
- def.firstChild, 1, jkl.firstChild, 2, selection);
-}
-
-function testRangePreservingNormalize() {
- var parent = $('normalizeTest-4');
- var def = $('def-4');
- var jkl = $('jkl-4');
- fragmentText(def.firstChild);
- fragmentText(jkl.firstChild);
-
- var range = goog.dom.Range.createFromNodes(def, 3, jkl, 4);
- var oldRangeDescription = goog.testing.dom.exposeRange(range);
- range = goog.editor.range.rangePreservingNormalize(parent, range);
-
- // Check that everything was normalized ok.
- assertEquals("def should have 1 child; range is " +
- goog.testing.dom.exposeRange(range) +
- ", range was " + oldRangeDescription,
- 1, def.childNodes.length);
- assertEquals("jkl should have 1 child; range is " +
- goog.testing.dom.exposeRange(range) +
- ", range was " + oldRangeDescription,
- 1, jkl.childNodes.length);
- goog.testing.dom.assertRangeEquals(def.firstChild, 1, jkl.firstChild, 2,
- range);
-}
-
-function testRangePreservingNormalizeWhereEndNodePreviousSiblingIsSplit() {
- var parent = $('normalizeTest-with-br');
- var br = parent.childNodes[1];
- fragmentText(parent.firstChild);
-
- var range = goog.dom.Range.createFromNodes(parent, 3, br, 0);
- range = goog.editor.range.rangePreservingNormalize(parent, range);
-
- // Code used to throw an error here.
-
- assertEquals('parent should have 3 children', 3, parent.childNodes.length);
- goog.testing.dom.assertRangeEquals(parent.firstChild, 1, parent, 1, range);
-}
-
-function testRangePreservingNormalizeWhereStartNodePreviousSiblingIsSplit() {
- var parent = $('normalizeTest-with-br');
- var br = parent.childNodes[1];
- fragmentText(parent.firstChild);
- fragmentText(parent.lastChild);
-
- var range = goog.dom.Range.createFromNodes(br, 0, parent, 9);
- range = goog.editor.range.rangePreservingNormalize(parent, range);
-
- // Code used to throw an error here.
-
- assertEquals('parent should have 3 children', 3, parent.childNodes.length);
- goog.testing.dom.assertRangeEquals(parent, 1, parent.lastChild, 1, range);
-}
-
-function testSelectionPreservingNormalize1() {
- var parent = $('normalizeTest-2');
- var def = $('def-2');
- var jkl = $('jkl-2');
- fragmentText(def.firstChild);
- fragmentText(jkl.firstChild);
-
- goog.dom.Range.createFromNodes(def, 3, jkl, 4).select();
- var oldRangeDescription = goog.testing.dom.exposeRange(
- goog.dom.Range.createFromWindow(window));
- goog.editor.range.selectionPreservingNormalize(parent);
-
- // Check that everything was normalized ok.
- var range = goog.dom.Range.createFromWindow(window);
-
- assertEquals("def should have 1 child; range is " +
- goog.testing.dom.exposeRange(range) +
- ", range was " + oldRangeDescription,
- 1, def.childNodes.length);
- assertEquals("jkl should have 1 child; range is " +
- goog.testing.dom.exposeRange(range) +
- ", range was " + oldRangeDescription,
- 1, jkl.childNodes.length);
- goog.testing.dom.assertRangeEquals(def.firstChild, 1, jkl.firstChild, 2,
- range);
-}
-
-/**
- * Make sure that selectionPreservingNormalize doesn't explode with no
- * selection in the document.
- */
-function testSelectionPreservingNormalize2() {
- var parent = $('normalizeTest-3');
- var def = $('def-3');
- var jkl = $('jkl-3');
- def.firstChild.splitText(1);
- jkl.firstChild.splitText(2);
-
- goog.dom.Range.clearSelection(window);
- goog.editor.range.selectionPreservingNormalize(parent);
-
- // Check that everything was normalized ok.
- assertEquals(1, def.childNodes.length);
- assertEquals(1, jkl.childNodes.length);
- assertFalse(goog.dom.Range.hasSelection(window));
-}
-
-function testSelectionPreservingNormalizeAfterPlaceCursorNextTo() {
- var parent = $('normalizeTest-with-div');
- goog.editor.range.placeCursorNextTo(parent.firstChild);
- goog.editor.range.selectionPreservingNormalize(parent);
-
- // Code used to throw an exception here.
-}
-
-
-/** Normalize the body and return the normalized range. */
-function normalizeBody(range) {
- var rangeFactory = goog.editor.range.normalize(range);
- document.body.normalize();
- return rangeFactory();
-}
-
-/** Break a text node up into lots of little fragments. */
-function fragmentText(text) {
- // NOTE(nicksantos): For some reason, splitText makes IE deeply
- // unhappy to the point where normalize and other normal DOM operations
- // start failing. It's a useful test for Firefox though, because different
- // versions of FireFox handle empty text nodes differently.
- // See goog.editor.BrowserFeature.
- if (goog.userAgent.IE) {
- manualSplitText(text, 2);
- manualSplitText(text, 1);
- manualSplitText(text, 0);
- manualSplitText(text, 0);
- } else {
- text.splitText(2);
- text.splitText(1);
-
- text.splitText(0);
- text.splitText(0);
- }
-}
-
-/**
- * Clear the selection by re-parsing the DOM. Then restore the saved
- * selection.
- * @param {goog.dom.SavedRange} saved The saved range.
- */
-function clearSelectionAndRestoreSaved(saved) {
- goog.dom.Range.clearSelection(window);
- assertFalse(goog.dom.Range.hasSelection(window));
- saved.restore();
- assertTrue(goog.dom.Range.hasSelection(window));
-}
-
-function manualSplitText(node, pos) {
- var newNodeString = node.nodeValue.substr(pos);
- node.nodeValue = node.nodeValue.substr(0, pos);
- goog.dom.insertSiblingAfter(document.createTextNode(newNodeString), node);
-}
-
-function testSelectNodeStartSimple() {
- var div = $('parentNode');
- div.innerHTML = '<p>Cursor should go in here</p>';
-
- goog.editor.range.selectNodeStart(div);
- var range = goog.dom.Range.createFromWindow(window);
- // Gotta love browsers and their inconsistencies with selection
- // representations. What we are trying to achieve is that when we type
- // the text will go into the P node. In Gecko, the selection is at the start
- // of the text node, as you'd expect, but in pre-530 Webkit, it has been
- // normalized to the visible position of P:0.
- if (goog.userAgent.GECKO || goog.userAgent.IE ||
- (goog.userAgent.WEBKIT && goog.userAgent.isVersion('530'))) {
- goog.testing.dom.assertRangeEquals(div.firstChild.firstChild, 0,
- div.firstChild.firstChild, 0, range);
- } else {
- goog.testing.dom.assertRangeEquals(div.firstChild, 0,
- div.firstChild, 0, range);
- }
-}
-
-function testSelectNodeStartBr() {
- var div = $('parentNode')
- div.innerHTML = '<p><br>Cursor should go in here</p>';
-
- goog.editor.range.selectNodeStart(div);
- var range = goog.dom.Range.createFromWindow(window);
- // We have to skip the BR since Gecko can't render a cursor at a BR.
- goog.testing.dom.assertRangeEquals(div.firstChild, 0,
- div.firstChild, 0, range);
-}
-
-function testIsEditable() {
- var containerElement = document.getElementById('editableTest');
- // Find editable container element's index.
- var containerIndex = 0;
- var currentSibling = containerElement;
- while (currentSibling = currentSibling.previousSibling) {
- containerIndex++;
- }
-
- var editableContainer = goog.dom.Range.createFromNodes(
- containerElement.parentNode, containerIndex,
- containerElement.parentNode, containerIndex + 1);
- assertFalse('Range containing container element not considered editable',
- goog.editor.range.isEditable(editableContainer));
-
- var allEditableChildren = goog.dom.Range.createFromNodes(
- containerElement, 0, containerElement, containerElement.childNodes.length);
- assertTrue('Range of all of container element children considered editable',
- goog.editor.range.isEditable(allEditableChildren));
-
- var someEditableChildren = goog.dom.Range.createFromNodes(
- containerElement, 2, containerElement, 6);
- assertTrue('Range of some container element children considered editable',
- goog.editor.range.isEditable(someEditableChildren));
-
-
- var mixedEditableNonEditable = goog.dom.Range.createFromNodes(
- containerElement.previousSibling, 0, containerElement, 2);
- assertFalse('Range overlapping some content not considered editable',
- goog.editor.range.isEditable(mixedEditableNonEditable));
-}
-
-function testIntersectsTag() {
- var root = $('root');
- root.innerHTML =
- '<b>Bold</b><p><span><code>x</code></span></p><p>y</p><i>Italic</i>';
-
- // Select the whole thing.
- var range = goog.dom.Range.createFromNodeContents(root);
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.DIV));
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.B));
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.I));
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.CODE));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.U));
-
- // Just select italic.
- range = goog.dom.Range.createFromNodes(root, 3, root, 4);
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.DIV));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.B));
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.I));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.CODE));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.U));
-
- // Select "ld x y".
- range = goog.dom.Range.createFromNodes(root.firstChild.firstChild, 2,
- root.childNodes[2], 1);
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.DIV));
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.B));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.I));
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.CODE));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.U));
-
- // Select ol.
- range = goog.dom.Range.createFromNodes(root.firstChild.firstChild, 1,
- root.firstChild.firstChild, 3);
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.DIV));
- assertTrue(goog.editor.range.intersectsTag(range, goog.dom.TagName.B));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.I));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.CODE));
- assertFalse(goog.editor.range.intersectsTag(range, goog.dom.TagName.U));
-}
-
-function testNormalizeNode() {
- var div = goog.dom.createDom('DIV', null, 'a', 'b', 'c');
- assertEquals(3, div.childNodes.length);
- goog.editor.range.normalizeNode(div);
- assertEquals(1, div.childNodes.length);
- assertEquals('abc', div.firstChild.nodeValue);
-
- div = goog.dom.createDom('DIV', null,
- goog.dom.createDom('SPAN', null, '1', '2'),
- goog.dom.createTextNode(''),
- goog.dom.createDom('BR'),
- 'b',
- 'c');
- assertEquals(5, div.childNodes.length);
- assertEquals(2, div.firstChild.childNodes.length);
- goog.editor.range.normalizeNode(div);
- if (goog.userAgent.GECKO && !goog.userAgent.isVersion(1.9) ||
- goog.userAgent.WEBKIT && !goog.userAgent.isVersion(526)) {
- // Old Gecko and Webkit versions don't delete the empty node.
- assertEquals(4, div.childNodes.length);
- } else {
- assertEquals(3, div.childNodes.length);
- }
- assertEquals(1, div.firstChild.childNodes.length);
- assertEquals('12', div.firstChild.firstChild.nodeValue);
- assertEquals('bc', div.lastChild.nodeValue);
- assertEquals('BR', div.lastChild.previousSibling.tagName);
-}
-
-function testDeepestPoint() {
- var parent = $('parentNode');
- var def = $('def');
-
- assertEquals(def, parent.childNodes[1]);
-
- var deepestPoint = goog.editor.range.Point.createDeepestPoint;
-
- var defStartLeft = deepestPoint(parent, 1, true);
- assertPointEquals(def.previousSibling, def.previousSibling.nodeValue.length,
- defStartLeft);
-
- var defStartRight = deepestPoint(parent, 1, false);
- assertPointEquals(def.firstChild, 0, defStartRight);
-
- var defEndLeft = deepestPoint(parent, 2, true);
- assertPointEquals(def.firstChild, def.firstChild.nodeValue.length,
- defEndLeft);
-
- var defEndRight = deepestPoint(parent, 2, false);
- assertPointEquals(def.nextSibling, 0, defEndRight);
-}
-
-function assertPointEquals(node, offset, actualPoint) {
- assertEquals('Point has wrong node', node, actualPoint.node);
- assertEquals('Point has wrong offset', offset, actualPoint.offset);
-}
-
-</script>
-</body>
-</html>