module('core.Range'); var checkBookmark = function (bookmark, pre, latter, id) { same(bookmark['start'], pre, '检查start返回值'); same(bookmark['end'], latter, '检查end返回值'); equal(bookmark['id'], id, '检查id'); }; test('init', function () { expect(6); var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); ua.checkResult(range, null, null, null, null, true, 'for init range'); same(range.document, document, 'check current document of range'); }); test('setStart/startEnd 自闭合元素', function () { var range = new baidu.editor.dom.Range(document); var div = te.dom[2]; var img = document.createElement('img'); div.appendChild(img); range.setStart(img, 0); ua.checkResult(range, div, div, 0, 0, true, "endContainer is null"); range.setEnd(img, 0); ua.checkResult(range, div, div, 0, 1, false, "startContainer is not null"); range.startContainer = null; range.setEnd(img, 0); ua.checkResult(range, div, div, 1, 1, true, "startContainer is null"); range.setStart(img, 0); ua.checkResult(range, div, div, 0, 1, false, "endContainer is not null"); }); test('setStart/startEnd--nodeType不为1', function () { var range = new baidu.editor.dom.Range(document); var div = te.dom[2]; var text = document.createTextNode("text"); div.appendChild(text); range.setStart(text, 0); ua.checkResult(range, text, text, 0, 0, true, "endContainer is null"); range.setEnd(text, 1); ua.checkResult(range, text, text, 0, 1, false, "startContainer is not null"); }); test('setStart/setEnd--nodeType为1', function () { var range = new baidu.editor.dom.Range(document); var div = te.dom[2]; range.setStart(div, 0); ua.checkResult(range, div, div, 0, 0, true, "endContainer is null"); range.setEnd(div, 1); ua.checkResult(range, div, div, 0, 1, false, "startContainer is not null"); }); /* * 测的内容比较多,updateCollapse,setEndPoint,setStart,setEnd,collapse * 因为updateCollapse和setEndPoint无法通过Range对象获取, 必须间接调用验证 */ test('setStartAfter,setStartBefore', function () { var div = te.dom[2]; div.innerHTML = ''; var span = div.firstChild; var a = div.lastChild; var range = new baidu.editor.dom.Range(document); range.setStartAfter(a); equal(range.startOffset, 2, 'check startOffset for setStartAfter--boundary testing'); range.setStartAfter(span); equal(range.startOffset, 1, 'check startOffset for setStartAfter'); range.setStartBefore(span); equal(range.startOffset, 0, 'check startOffset for setStartBefore--boundary testing'); range.setStartBefore(a); equal(range.startOffset, 1, 'check startOffset for setStartBefore'); var txtNode = document.createTextNode("text"); div.innerHTML = ""; div.appendChild(txtNode); range.setStartBefore(txtNode); equal(range.startOffset, 0, 'check startOffset in text node'); }); test('setEndAfter,setEndBefore', function () { var div = te.dom[2]; div.innerHTML = ''; var span = div.firstChild; var a = div.lastChild; var range = new baidu.editor.dom.Range(document); range.setEndAfter(a); equal(range.endOffset, 2, 'check startOffset for setEndAfter--boundary testing'); range.setEndAfter(span); equal(range.endOffset, 1, 'check startOffset for setEndAfter'); range.setEndBefore(span); equal(range.endOffset, 0, 'check startOffset for setEndBefore--boundary testing'); range.setEndBefore(a); equal(range.endOffset, 1, 'check startOffset for setEndBefore'); }); /* 校验collapse方法 */ test('collapse', function () { var text = document.createTextNode('TextNode'); te.dom[2].appendChild(text); var range = new baidu.editor.dom.Range(document); range.setStart(text, 1); // ua.checkResult(range.endContainer,range.startContainer,0) ok(range.collapsed, 'check collapse method true--setStart'); equal(range.startContainer, range.endContainer, 'compare startContainer and endContainer--setStart'); range.startContainer = null; range.setEnd(text, 0); equal(range.startContainer, range.endContainer, 'compare startContainer and endContainer--setEnd'); equal(range.startOffset, range.endOffset, 'compare startOffset and endOffset--setEnd'); ok(range.collapsed, 'check collapsed is true--setEnd'); var img = document.createElement("img"); range.insertNode(img).selectNode(img); equal(range.startContainer, range.endContainer, "img startContainer and endContainer is same,but startOffset and endOffset is not same"); }); //TODO 空节点
test('selectNode', function () { var div = te.dom[2]; div.innerHTML = "text!"; div.id = 'div_id'; var range = new baidu.editor.dom.Range(document); range.selectNode(div); var index = ua.getIndex(div); ua.checkResult(range, document.body, document.body, index, index + 1, false, 'check selectNode'); }); test('selectNode--空节点', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); range.selectNode(div); var index = ua.getIndex(div); ua.checkResult(range, document.body, document.body, index, index + 1, false, 'check selectNode'); }); test('selectNode--空文本节点', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); var textNode = document.createTextNode(''); div.appendChild(textNode); range.selectNode(div); var index = ua.getIndex(div); ua.checkResult(range, document.body, document.body, index, index + 1, false, 'check selectNode'); }); test('selectNodeContents', function () { expect(15); var div = te.dom[2]; div.innerHTML = 'p_text
sssss |
td_xxxxu_text |
span_text
div_text2p_textem_text
'; var span_text = document.getElementById('span').firstChild; var p = document.getElementById('p'); range.setStart(span_text, 9).setEnd(p, 0); range.adjustmentBoundary(); ua.checkResult(range, div, div, 2, 3, false, 'startContainer为文本节点'); }); //TODO test('adjustmentBoundary--非文本节点', function () { var range = new baidu.editor.dom.Range(document); var div = te.dom[2]; div.innerHTML = 'div_textspan_text
div_text2p_textem_text
'; var span = document.getElementById('span'); var p = document.getElementById('p'); range.setStart(span, 1).setEnd(p, 0); range.adjustmentBoundary(); ua.checkResult(range, div, div, 2, 3, false, 'startContainer为非文本节点'); }); test('getCommonAncestor--初始startContainer和endContainer相同', function () { var range = new baidu.editor.dom.Range(document); var div = te.dom[2]; div.innerHTML = "div_textspan_text
div_text2"; range.setStart(div, 0).setEnd(div, 1); /*--初始startContainer和endContainer相同*/ var ancestor = range.getCommonAncestor(); same(ancestor, div, '祖先节点为startContainer'); /*文本节点*/ var span = div.getElementsByTagName('span')[0]; range.setStart(span.firstChild, 0).setEnd(span.firstChild, 4); ancestor = range.getCommonAncestor(); same(ancestor, span.firstChild, "文本节点的祖先节点"); /*忽略文本节点*/ ancestor = range.getCommonAncestor(true, true); same(ancestor, span, "文本节点的祖先节点--忽略文本节点"); range.setStart(div, 1).setEnd(div, 2); ancestor = range.getCommonAncestor(true, true); same(ancestor, span.parentNode, "文本节点的祖先节点--includeSelf=true"); range.setStart(div, 1).setEnd(div, 2); ancestor = range.getCommonAncestor(false, true); same(ancestor, div, "文本节点的祖先节点--includeSelf=false"); }); test('getCommonAncestor--初始startContainer和endContainer不同', function () { var range = new baidu.editor.dom.Range(document); var div = te.dom[2]; div.innerHTML = "div_textspan_text
div_text2"; var span = div.getElementsByTagName('span')[0]; range.setStart(div, 0).setEnd(span, 1); /*--初始startContainer和endContainer相同*/ var ancestor = range.getCommonAncestor(); same(ancestor, div, 'startContainer是endContainer的祖先'); range.setStart(div.firstChild, 0).setEnd(span, 1); ancestor = range.getCommonAncestor(); same(ancestor, div, 'startContainer和endContainer是兄弟'); }); test('selectNodeContents', function () { var div = te.dom[2]; div.innerHTML = 'xxxxdiv_text'; var range = new baidu.editor.dom.Range(document); /*选中非文本节点*/ range.selectNodeContents(div); ua.checkResult(range, div, div, 0, 2, false, 'selectNodeContents'); /*选中文本节点*/ range.selectNodeContents(div.lastChild); ua.checkResult(range, div.lastChild, div.lastChild, 0, 8, false, 'selectNodeContents--'); }); test('cloneContents', function () { var div = te.dom[2]; div.innerHTML = 'b_textdiv_text'; // div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var range = new baidu.editor.dom.Range(document); var b = div.firstChild; range.setStart(b, 1).setEnd(div, 1); var frag = range.cloneContents(); /*类型:xxxx||div_text("|"表示切的位置)*/ equal(ua.getHTML(frag), '', ' 只选中一个b标签,插入空文本节点'); /*类型:t|_extdiv|_text("|"表示切的位置)*/ range.setStart(b.firstChild, 1).setEnd(b.nextSibling, 3); frag = range.cloneContents(); equal(ua.getHTML(frag), '_textdiv', '从文本节点中间切'); /*类型:|b_t|extdiv_text("|"表示切的位置)*/ range.setStart(div, 0).setEnd(b.firstChild, 3); frag = range.cloneContents(); equal(ua.getHTML(frag), 'b_t', '选中文本的前半部分'); /*类型:b|_textdiv_text|("|"表示切的位置)*/ range.setStart(b.firstChild, 1).setEnd(div, 2); frag = range.cloneContents(); equal(ua.getHTML(frag), '_textdiv_text', '选中文本的前半部分'); /*类型:xxxx|xxxxc22c|("|"表示切的位置)*/ div.innerHTML = 'xxxxxxxxc22c'; range.setStart(div.firstChild, 1).setEnd(div.lastChild, 1); equals(ua.getHTML(range.cloneContents()), 'xxxxc22c'); }); /*startContainer和endContainer为文本节点,补全后面之类的标签*/ test('cloneContents--补全后面的标签', function () { var div = te.dom[2]; var r = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first').firstChild; var two = document.getElementById('two').firstChild; r.setStart(first, 1).setEnd(two, 2); ua.checkSameHtml(ua.getHTML(r.cloneContents()), 'irst strong strong second em strong.
bar
some textem textmore text
1 | ab |
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var last = document.getElementById('last').firstChild; var two = document.getElementById('two').firstChild; r.setStart(two, 1); r.setEnd(last, 2); ua.checkSameHtml(ua.getHTML(r.cloneContents()), 'bc | |
3 | 4 |
te
'); ua.checkResult(r, two, last, 1, 2, false, 'cloneContents--补全前面的标签'); }); /*startContainer和endContainer为文本节点,为兄弟节点*/ test('cloneContents--切的部分为兄弟节点', function () { var div = te.dom[2]; var r = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first'); r.setStart(first.firstChild, 1).setEnd(first.lastChild, 4); /*strong前面有空格*/ ua.checkSameHtml(ua.getHTML(r.cloneContents()), 'irst strong strong second em str'); ua.checkResult(r, first.firstChild, first.lastChild, 1, 4, false, 'cloneContents--startContainer和endContainer为兄弟节点'); }); test('cloneContents--切同一个文本节点', function () { var div = te.dom[2]; var r = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first').firstChild; r.setStart(first, 1).setEnd(first, 4); equals(ua.getHTML(r.cloneContents()), 'irs'); ua.checkResult(r, first, first, 1, 4, false, 'cloneContents--切同一个文本节点'); }); /*startContainer和endContainer的nodeType=1*/ test('cloneContents--startContainer和endContainer为非文本节点', function () { var div = te.dom[2]; var r = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first'); var last = document.getElementById('last'); r.setStart(first, 0).setEnd(last, 0); ua.checkSameHtml(ua.getHTML(r.cloneContents()), 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabc
'); ua.checkResult(r, first, last, 1, 1, false, 'cloneContents--开始位置有注释'); }); test('cloneContents--完整切掉一个节点', function () { var div = te.dom[2]; var r = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first'); r.setStart(div, 0).setEnd(div, div.childNodes.length - 1); ua.checkSameHtml(ua.getHTML(r.cloneContents()), 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first'); var last = document.getElementById('last'); r.setStart(first, 0).setEnd(last.firstChild, 1); ua.checkSameHtml(ua.getHTML(r.cloneContents()), 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
t
'); ua.checkResult(r, first, last.firstChild, 0, 1, false, 'cloneContents--startContainer的nodeType=1,endContainer为文本节点'); r.setStart(first.firstChild, 1).setEnd(last, 0); ua.checkSameHtml(ua.getHTML(r.cloneContents()), 'irst strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var traverse = document.getElementById('traverse'); r.setStart(div, 0).setEnd(traverse, 1); equals(ua.getHTML(r.cloneContents()), 'first strong strong second em strong.
bar
some text
'); ua.checkResult(r, div, traverse, 0, 1, false, 'cloneContents--startContainer的nodeType=1,endContainer为b'); r.setStart(div, 0).setEnd(traverse, 2); equals(ua.getHTML(r.cloneContents()), 'first strong strong second em strong.
bar
some textem text
'); ua.checkResult(r, div, traverse, 0, 2, false, 'cloneContents--startContainer的nodeType=1,endContainer为em'); }); test('cloneContents--元素闭合', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'p_text
'; // if ( baidu.editor.browser.gecko ) { var text = div.firstChild.firstChild; range.setStart(text, 1).setEnd(text, 1); equals(ua.getHTML(range.cloneContents()), 'null', '元素闭合直接返回null'); ua.checkResult(range, text, text, 1, 1, true, 'cloneContents--startContainer的nodeType=1,endContainer为em'); var p = div.firstChild; range.setStart(p, 1).setEnd(p, 1); equals(ua.getHTML(range.cloneContents()), 'null', '元素闭合直接返回null'); ua.checkResult(range, p, p, 1, 1, true, 'cloneContents--startContainer的nodeType=1,endContainer为em'); }); test('cloneContents--自闭合元素', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'b_texti_textp_text
'; var p_text = div.firstChild.firstChild; range.setStart(p_text, 2).setEnd(p_text, 2); range.deleteContents(); ua.checkResult(range, p_text, p_text, 2, 2, true, '删除空'); equal(ua.getHTML(div), 'p_text
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; div.innerHTML = html; var r = new baidu.editor.dom.Range(document); var two = document.getElementById('two'); var last = document.getElementById('last'); r.setStart(two, 1).setEnd(last, 2); r.deleteContents(); ua.checkSameHtml(ua.getHTML(div), 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; div.innerHTML = html; var r = new baidu.editor.dom.Range(document); r.setStart(div, 0).setEnd(div, 2); r.deleteContents(); ua.checkSameHtml(ua.getHTML(r.startContainer), 'some textem textmore text
1 | abc |
3 | 4 |
textabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; div.innerHTML = html; var r = new baidu.editor.dom.Range(document); var p = div.firstChild; var strong_text = document.getElementById('strong').firstChild; r.setStart(strong_text, 0).setEnd(strong_text, 2); r.deleteContents(); equals(ua.getHTML(r.startContainer), 'rong'); ua.checkSameHtml(ua.getHTML(div), 'first strong rong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; r.setStart(div, 0); r.setEnd(document.getElementById('traverse'), 2); r.deleteContents(); ua.checkSameHtml(ua.getHTML(div), 'more text
1 | abc |
3 | 4 |
textabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; div.innerHTML = html; var r = new baidu.editor.dom.Range(document); var first = document.getElementById('first'); r.setStart(first.firstChild, 1).setEnd(first.lastChild, 4); var p = div.firstChild; r.deleteContents(); equals(ua.getHTML(r.startContainer), 'fong.
'); ua.checkResult(r, p, p, 1, 1, true, 'startContainer和endContainer为文本节点内容'); ua.checkSameHtml(ua.getHTML(div), 'fong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
fong.
'); }); test('deleteContents--startContainer是endContainer后代', function () { var div = te.dom[2]; var html = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; div.innerHTML = html; var r = new baidu.editor.dom.Range(document); var em = document.getElementById('em'); r.setStart(em, 1).setEnd(div, 3); r.deleteContents(); ua.checkSameHtml(ua.getHTML(r.startContainer), 'first strong strong second em
1 | abc |
3 | 4 |
textabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; div.innerHTML = html; var r = new baidu.editor.dom.Range(document); var em = document.getElementById('em').firstChild; var two = document.getElementById('two'); r.setStart(em, 1).setEnd(two, 0); r.deleteContents(); ua.checkSameHtml(ua.getHTML(r.startContainer), 'first strong strong second e
abc | |
3 | 4 |
textabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first').firstChild; var two = document.getElementById('two').firstChild; r.setStart(first, 1).setEnd(two, 2); ua.checkSameHtml(ua.getHTML(r.extractContents()), 'irst strong strong second em strong.
bar
some textem textmore text
1 | ab |
f
c | |
3 | 4 |
textabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var last = document.getElementById('last').firstChild; var two = document.getElementById('two').firstChild; r.setStart(two, 1).setEnd(last, 2); ua.checkSameHtml(ua.getHTML(r.extractContents()), 'bc | |
3 | 4 |
te
'); ua.checkSameHtml(ua.getHTML(r.startContainer), 'first strong strong second em strong.
bar
some textem textmore text
1 | a |
xtabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first'); r.setStart(first.firstChild, 1).setEnd(first.lastChild, 4); /*strong前面有空格*/ ua.checkSameHtml(ua.getHTML(r.extractContents()), 'irst strong strong second em str'); ua.checkSameHtml(ua.getHTML(r.startContainer), 'fong.
', 'check startContainer html'); ua.checkResult(r, first, first, 1, 1, true, 'startContainer--startContainer和endContainer为兄弟节点'); }); test('extractContents--切同一个文本节点', function () { var div = te.dom[2]; var r = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first').firstChild; r.setStart(first, 1).setEnd(first, 4); equals(ua.getHTML(r.extractContents()), 'irs'); equal(ua.getHTML(r.startContainer), 'ft'); ua.checkResult(r, first, first, 1, 1, true, 'startContainer--切同一个文本节点'); }); /*startContainer和endContainer的nodeType=1*/ test('extractContents--startContainer和endContainer为非文本节点', function () { var div = te.dom[2]; var r = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first'); var last = document.getElementById('last'); r.setStart(first, 0).setEnd(last, 0); ua.checkSameHtml(ua.getHTML(r.extractContents()), 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; first = document.getElementById('first'); last = document.getElementById('last'); r.setStart(first, 2).setEnd(last, 1); ua.checkSameHtml(ua.getHTML(r.extractContents()), 'strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabc
', '检查得到的contents'); ua.checkSameHtml(ua.getHTML(r.startContainer), 'first
span
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first'); r.setStart(div, 0).setEnd(div, div.childNodes.length - 1); ua.checkSameHtml(ua.getHTML(r.extractContents()), 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
p_text
'; var text = div.firstChild.firstChild; range.setStart(text, 1).setEnd(text, 1); equals(ua.getHTML(range.extractContents()), 'null', '元素闭合直接返回null'); equal(ua.getHTML(range.startContainer), 'p_text'); ua.checkResult(range, text, text, 1, 1, true, 'extractContents--startContainer的nodeType=1,endContainer为em'); var p = div.firstChild; range.setStart(p, 1).setEnd(p, 1); equals(ua.getHTML(range.extractContents()), 'null', '元素闭合直接返回null'); equal(ua.getHTML(range.startContainer), 'p_text
'); ua.checkResult(range, p, p, 1, 1, true, 'extractContents--startContainer的nodeType=1,endContainer为em'); }); test('extractContents--自闭合元素', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); var inner = 'b_texti_textfirst strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var r = range; div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; r.setStart(document.getElementById('test'), 0); r.setEnd(document.getElementById('traverse'), 2); ua.checkSameHtml(ua.getHTML(r.extractContents()), 'first strong strong second em strong.
bar
some textem text
'); ua.checkSameHtml(ua.getHTML(r.startContainer), 'more text
1 | abc |
3 | 4 |
textabcspan
more text
1 | abc |
3 | 4 |
textabcspan
more text
1 | abc |
3 | 4 |
textabcspan
first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabc
xxx
first strong strong second em strong.bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var strong = document.getElementById('strong').firstChild; var span = document.getElementById('last').lastChild.firstChild; range.setStart(strong, 1).setEnd(span, 2); range.enlarge(true); /*右边的文本节点是右边最后一个节点,所以一直右扩直到body,左边的文本节点左边边有块元素兄弟,因此只扩到第一个块元素祖先*/ ua.checkResult(range, div.firstChild, document.body, 1, ua.getIndex(div) + 1, false, '右边扩到body'); }); test('enlarge--文本节点左右边扩到body', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var first = document.getElementById('first').firstChild; var span = document.getElementById('last').lastChild.firstChild; range.setStart(first, 1).setEnd(span, 2); range.enlarge(true); /*右边的文本节点是右边最后一个节点,所以一直右扩直到body,左边的文本节点是左边第一个节点,所以一直左扩直到body*/ ua.checkResult(range, document.body, document.body, ua.getIndex(div), ua.getIndex(div) + 1, false, '左右边扩到body'); }); test('enlarge--startContainer和endContainer的nodeType为1', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'first strongstrong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; range.setStart(div, 0).setEnd(div, 2); range.enlarge(true); ua.checkResult(range, document.body, div, ua.getIndex(div), 2, false, '左边扩到块元素父节点,右边扩到body'); }); test('enlarge--左边非块元素节点', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var strong = document.getElementById('strong'); var table = div.getElementsByTagName('table')[0]; range.setStart(strong, 0).setEnd(table, 1); range.enlarge(true); ua.checkResult(range, document.body, div, ua.getIndex(div), 4, false, '左边扩到块元素父节点,右边扩到父节点'); }); test('enlarge--左右属于同一非块元素节点', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var strong = document.getElementById('strong'); range.setStart(strong, 0).setEnd(strong, 1); range.enlarge(true); ua.checkResult(range, document.body, div, ua.getIndex(div), 1, false, '左边扩到body'); /*文本节点*/ var strong_text = strong.firstChild; range.setStart(strong_text, 2).setEnd(strong_text, 3); range.enlarge(true); ua.checkResult(range, document.body, div, ua.getIndex(div), 1, false, '左右均扩到第一个块元素祖先节点'); }); test('enlarge--isBlock为null', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'xxxxxxxxxxxxx'; range.selectNodeContents(div.getElementsByTagName('i')[0]); range.enlarge(); ua.checkResult(range, div, div.lastChild, 1, 1, false, 'isBlock为null'); }); test('enlarge--stopFn', function () { var div = te.dom[2]; var stopFn = function (container) { if (container.tagName.toLowerCase() == 'table') return true; return false; }; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'first strong strong second em strong.
bar
some textem textmore text
1 | abc |
3 | 4 |
textabcspan
'; var strong = document.getElementById('strong'); var table = div.getElementsByTagName('table')[0]; range.setStart(strong, 0).setEnd(table, 1); range.enlarge(true, stopFn); ua.checkResult(range, document.body, table, ua.getIndex(div), 1, false, '左边扩到块元素父节点,右边不扩(stopFn为false)'); }); //test( 'enlarge--闭合特殊情况,有歧义', function() { // var div = te.dom[2]; // var range = new baidu.editor.dom.Range( document ); // div.innerHTML = 'p_text
'; // var p = div.firstChild; // range.setStart( p.firstChild, 0 ).setEnd( p.firstChild, 3 ).trimBoundary(); // range.setStart( p, 1 ).setEnd( p, 1 ); // range.enlarge( true ); // // //TODO //} ); test('enlarge--闭合', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'xxxxxxxx
xxxxxxxxxxxxxxxxx|xxxbbbbb
xx'; range.setStart(div.getElementsByTagName('b')[0], 2).collapse(true); range.enlarge(true); ua.checkResult(range, div, div, 2, 6, false, "初始为闭合,文本父节点为非块元素"); div.innerHTML = 'xxxx'; range.setStart(div.firstChild.nextSibling, 2).collapse(true) range.enlarge(true); ua.checkResult(range, div, div, 1, 2, false, "初始为闭合,文本父节点为块元素"); }); test('insertNode--文本中插入', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'div_text1p_text
xxxem_textxxxxxxxxxxx|xxxbbbbb
text2_div'; var p_text = div.firstChild.nextSibling.firstChild; range.setStart(p_text, 1).setEnd(p_text, 2); /*插入块元素*/ var new_div = document.createElement('div'); range.insertNode(new_div); ua.checkResult(range, p_text.parentNode, new_div.nextSibling, 1, 1, false, '插入div'); /*插入文本节点,原来闭合*/ var em_text = div.getElementsByTagName('em')[0].firstChild; range.setStart(em_text, 0).setEnd(em_text, 0); range.insertNode(document.createTextNode('new_text')); ua.checkResult(range, em_text.parentNode, em_text.parentNode, 0, 1, false, '闭合情况下插入文本'); /*插入inline元素*/ range.setStart(div.firstChild, 1).setEnd(div.lastChild, 1); range.insertNode(document.createElement('i')); ua.checkResult(range, div, div.lastChild, 1, 1, false, '插入inline元素'); }); test('inserNode--块元素中插入', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'div_text1p_text
xxxem_textxxxxxxxxxxx|xxxbbbbb
text2_div'; // var p_text = div.firstChild.nextSibling.firstChild; range.setStart(div, 1).setEnd(div.lastChild, 2); /*插入块元素*/ var new_div = document.createElement('div'); range.insertNode(new_div); ua.checkResult(range, div, div.lastChild, 1, 2, false, '插入div'); }); test('insertNode--插入的节点为endContainer孩子', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'xxxxxxxx
xxxxxxxxxxxxxxxxx|xxxbbbbb
xx'; var length = div.childNodes.length; range.setStart(div, 1).setEnd(div, length); var new_div = document.createElement('div'); new_div.innerHTML = 'xxxxxxxxx
xxxxxxxxxxxxxxxxx|xxxbbbbb
xxxxxxx
xxxxxxxxxxxxxxxxx|xxxbbbbb
xx'; var length = div.childNodes.length; range.setStart(div, 1).setEnd(div, div.childNodes.length); var new_div = document.createElement('div'); frag.appendChild(new_div); frag.appendChild(document.createTextNode('text')); frag.appendChild(document.createElement('span')); range.insertNode(frag); ua.checkResult(range, div, div, 1, length + 3, false, '插入fragment为endContainer的孩子'); equal(ua.getHTML(div), 'xxxxx
xxxxxxxxxxxxxxxxx|xxxbbbbb
xxem_textp_text
'; var bookmark = range.selectNode(div).createBookmark(); ua.checkResult(range, document.body, document.body, ua.getIndex(div), ua.getIndex(div) + 1, false, "元素不闭合,创建书签"); ok(/_baidu_bookmark_start_/.test(div.previousSibling.id), '检查div的前一个兄弟'); ok(/_baidu_bookmark_end_/.test(div.nextSibling.id), '检查div的后一个兄弟'); /*moveToBookmark*/ range.moveToBookmark(bookmark); ua.checkResult(range, document.body, document.body, ua.getIndex(div), ua.getIndex(div) + 1, false, "元素不闭合,删除书签"); ok(!/_baidu_bookmark_start_/.test(div.previousSibling.id), '检查div的前面书签是否被删除'); range.setStart(div, 2).setEnd(div, 3); var bookmark = range.createBookmark(true); ua.checkResult(range, div, div, 3, 4, false, "元素不闭合,插入span"); var preId = document.getElementById('span').previousSibling.id; var latterId = document.getElementById('span').nextSibling.id; var reg = /_baidu_bookmark_start_/; ok(/_baidu_bookmark_start_/.test(preId), '检查前面span的id'); ok(/_baidu_bookmark_end_/.test(latterId), '检查后面span的id'); checkBookmark(bookmark, preId, latterId, true); range.moveToBookmark(bookmark); ua.checkResult(range, div, div, 2, 3, false, 'moveToBookmark'); equal(ua.getHTML(div), 'em_textp_text
em_textp_text
'; var span = document.getElementById('span'); range.setStart(span, 0).setEnd(span, 1); var bookmark = range.createBookmark(); var pre = span.firstChild; var latter = span.lastChild; ua.checkResult(range, span, span, 1, 2, false, 'span嵌套'); ok(/_baidu_bookmark_start_/.test(pre.id), '检查前面span的id'); ok(/_baidu_bookmark_end_/.test(latter.id), '检查后面span的id'); checkBookmark(bookmark, pre, latter, undefined); }); test('createBookmark/moveToBookmark--元素闭合', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'first_texti_textxxxxxxxspan_textem_textp_text
'; var em_text = document.getElementById('em').firstChild; var em = em_text.parentNode; range.setStart(em_text, 1).setEnd(em_text, 1); var bookmark = range.createBookmark(true, true); ua.checkResult(range, em, em, 2, 2, true, '元素闭合'); var pre = em.firstChild.nextSibling; checkBookmark(bookmark, pre.id, null, true); equal('_baidu_bookmark_start_', pre.id, '检查前面span的id'); }); test('getClosedNode', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'xxxxxxxxbbbbxxx
xxaaaaaaa
'; range.setStartBefore(div.firstChild.nextSibling.firstChild); range.setEndAfter(div.lastChild.firstChild.firstChild); range.applyInlineStyle('strong'); equals(ua.getHTML(div), 'xxbbbbxxx
xxaaaaaaa
1234
'; range.setStart(div, 0).setEnd(div.firstChild, 4); range.applyInlineStyle('b', {title:'b_title', id:'b_id'}); var b = div.firstChild.firstChild; same(b, document.getElementById('b_id'), '插入带有属性的b'); equal($(b).attr('title'), 'b_title', 'check title'); equal(b.innerHTML, '1234', 'check innerHTML'); equal(div.childNodes.length, 1, 'check child count'); }); test('applyInlineStyle--b放在Inline元素外面', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = '123456789
123456789
'; range.setStart(div, 0).setEnd(div, 2); range.applyInlineStyle('b'); equals(ua.getHTML(div), '123456789
123456789
x1234y
'; var span = document.getElementById('span'); range.setStart(span.firstChild, 0).setEnd(span.firstChild, 4); range.applyInlineStyle('b'); equals(ua.getHTML(div), 'x1234y
b_text
'; var b_text = div.firstChild.firstChild.firstChild; range.setStart(b_text, 1).setEnd(b_text, 2); range.applyInlineStyle('b'); equals(div.innerHTML.toLowerCase(), 'b_text
', '文本双重b'); div.innerHTML = 'a1234b
'; range.setStart(div.getElementsByTagName('em')[0].firstChild, 0); range.setEnd(div.getElementsByTagName('em')[0].firstChild, 4); range.applyInlineStyle('b'); equals(div.innerHTML.toLowerCase(), 'a1234b
', '双重b+多个inline元素'); // Inline element merged with parent and child div.innerHTML = 'a123456b
'; range.setStart(div.getElementsByTagName('b')[0].firstChild, 1); range.setEnd(div.getElementsByTagName('b')[0].lastChild, 1); range.applyInlineStyle('b'); equals(div.innerHTML.toLowerCase(), 'a123456b
', '去掉嵌套的b'); }); test('applyInlineStyle--多个style', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'xxxx'; range.setStart(div, 0).setEnd(div, 1); range.applyInlineStyle('i').applyInlineStyle('span', {style:'color:red'}).applyInlineStyle('span', {style:'font-size:12px'}); //1.2.6.1 span能套i // var span = div.firstChild.firstChild; var span = div.firstChild; equal(span.style['color'], 'red', 'check color'); equal($(span).css('font-size'), '12px', 'check font size'); //1.2.6.1 span能套i equal(span.innerHTML.toLowerCase(), 'xxxx', 'check innerHTML including u'); }); test('applyInlineStyle--MergeToParent', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = '1234568910'; range.setStart(div.firstChild, 0).setEnd(div.childNodes[1], 1).select(); range.applyInlineStyle('strong', {style:'font-size:24px'}); var html = '1234568910'; ua.checkSameHtml(div.innerHTML, html); }); test('trace1583:applyInlineStyle--MergeToChild', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = '123456789'; var span = div.getElementsByTagName('span')[1]; range.setStart(span.firstChild, 2).setEnd(span.firstChild, 4).select(); range.applyInlineStyle('span', {style:'font-size:24px'}); var html = '123456789'; ua.checkHTMLSameStyle(html, document, div, 'MergeToChild'); }); test('applyInlineStyle--选区包含部分兄弟', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'xxxxspan_text'; range.setStart(div, 0).setEnd(div.firstChild.nextSibling, 0); range.applyInlineStyle('u'); equal(div.innerHTML.toLowerCase(), 'xxxxspan_text', 'check innerHTML including u'); }); test('removeInlineStyle--删除父节点b', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = 'xxxx'; range.setStart(div, 0).setEnd(div, 1); range.removeInlineStyle('b'); equals(div.innerHTML, 'xxxx', '删除b'); }); test('removeInlineStyle--删除祖先b', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = "xxxx"; var i = div.firstChild.firstChild; range.setStart(i, 0).setEnd(i, 1); range.removeInlineStyle('b'); equals(div.innerHTML.toLowerCase(), 'xxxx'); ua.checkResult(range, div, div, 0, 1, false, '删除祖先b'); }); test('removeInlineStyle--删除部分b', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = "i_textspan_text"; var b = div.firstChild; range.setStart(b, 0).setEnd(b.firstChild.firstChild, 3); range.removeInlineStyle('b'); equals(div.innerHTML.toLowerCase(), 'i_textspan_text', '检查html'); ua.checkResult(range, div, div, 0, 1, false, '删除部分b'); }); test('removeInlineStyle--删除多个b', function () { var div = te.dom[2]; var range = new baidu.editor.dom.Range(document); div.innerHTML = "
| xxxxxx |
| xxxxxx |
hellohello1hello2
'); range.setStart(editor.body.firstChild.lastChild, 0).collapse(1).select(); range = editor.selection.getRange(); if ((ua.browser.ie &&ua.browser.ie < 9) || ua.browser.webkit) ua.checkResult(range, editor.body.firstChild.lastChild.previousSibling, editor.body.firstChild.lastChild.previousSibling, 1, 1, true, '节点后--check range'); else if(ua.browser.ie &&ua.browser.ie > 8) ua.checkResult(range, editor.body.firstChild, editor.body.firstChild, 3, 3, true, '节点后--check range'); else ua.checkResult(range, editor.body.firstChild.lastChild.previousSibling, editor.body.firstChild.lastChild.previousSibling, 0, 0, true, '节点后--check range'); range.setStart(editor.body.firstChild.firstChild.nextSibling, 0).collapse(1); range.select(); range = editor.selection.getRange(); if (ua.browser.webkit) ua.checkResult(range, editor.body.firstChild.firstChild.nextSibling.firstChild, editor.body.firstChild.firstChild.nextSibling.firstChild, 1, 1, true, '节点内文本节点前--check range'); else if (ua.browser.ie&&ua.browser.ie < 9) ua.checkResult(range, editor.body.firstChild.childNodes[1].childNodes[1], editor.body.firstChild.childNodes[1].childNodes[1], 0, 0, true, '节点内文本节点前--check range'); else if(ua.browser.ie &&ua.browser.ie > 8) ua.checkResult(range, editor.body.firstChild.childNodes[1], editor.body.firstChild.childNodes[1], 1, 1, true, '节点后--check range'); else ua.checkResult(range, editor.body.firstChild.firstChild.nextSibling.firstChild, editor.body.firstChild.firstChild.nextSibling.firstChild, 0, 0, true, '节点内文本节点前--check range'); range.setStart(editor.body.firstChild.childNodes[1], 0).collapse(1).select(); range = editor.selection.getRange(); if (ua.browser.webkit) ua.checkResult(range, editor.body.firstChild.childNodes[1].firstChild, editor.body.firstChild.childNodes[1].firstChild, 1, 1, true, 'b节点--check range'); else if (ua.browser.ie&&ua.browser.ie < 9) ua.checkResult(range, editor.body.firstChild.childNodes[1].childNodes[1], editor.body.firstChild.childNodes[1].childNodes[1], 0, 0, true, '节点内文本节点前--check range'); else if(ua.browser.ie &&ua.browser.ie > 8) ua.checkResult(range, editor.body.firstChild.childNodes[1], editor.body.firstChild.childNodes[1], 1, 1, true, '节点后--check range'); else ua.checkResult(range, editor.body.firstChild.childNodes[1].firstChild, editor.body.firstChild.childNodes[1].firstChild, 0, 0, true, 'b节点--check range'); start(); }); }); test('文本节点中间取range', function () { var div = te.dom[2]; var editor = new baidu.editor.Editor({'autoFloatEnabled':false}); stop(); editor.render(div); editor.ready(function () { var range = new baidu.editor.dom.Range(editor.document); editor.setContent('hello2
'); range.setStart(editor.body.firstChild.firstChild, 2).collapse(1).select(); range = editor.selection.getRange(); if (ua.browser.ie&&ua.browser.ie < 9) ua.checkResult(range, editor.body.firstChild.lastChild, editor.body.firstChild.lastChild, 0, 0, true, 'check range'); else if(ua.browser.ie &&ua.browser.ie > 8) ua.checkResult(range, editor.body.firstChild, editor.body.firstChild, 2, 2, true, 'check range'); else ua.checkResult(range, editor.body.firstChild.lastChild, editor.body.firstChild.lastChild, 2, 2, true, 'check range'); start(); }); }); //test( 'select--closedNode', function() { // var div = te.dom[2]; // var range = new baidu.editor.dom.Range( document ); // div.innerHTML = 'div_textspan_text