michael@0: /** Test for Bug 191864 **/ michael@0: var tests_done = 0; michael@0: var tests = [ michael@0: [ {}, [0,4], "012345678" ], michael@0: [ {}, [0,0], "012345678" ], michael@0: [ {}, [0,9], "012345678" ], michael@0: [ {startOffset:4}, [0,4], "012345678" ], michael@0: [ {startOffset:5}, [0,4], "012345678" ], michael@0: [ {startOffset:5,endOffset:6}, [0,4], "012345678" ], michael@0: [ {endOffset:5}, [0,4], "012345678" ], michael@0: [ {endOffset:4}, [0,4], "012345678" ], michael@0: [ {endOffset:3}, [0,4], "012345678" ], michael@0: [ {startOffset:1,endOffset:3}, [0,4], "012345678" ], michael@0: [ {startOffset:7,endOffset:7}, [0,4], "012345678" ], michael@0: [ {startOffset:4,endOffset:4}, [0,4], "012345678" ], michael@0: [ {endNode:1}, [0,4], "012345678", "" ], michael@0: [ {endNode:1}, [0,4], "01234567", "8" ], michael@0: [ {endNode:1}, [1,4], "0", "12345678" ], michael@0: [ {startOffset:1,endNode:1}, [0,0], "0", "12345678" ], michael@0: [ {endNode:2}, [1,4], "0", "12345", "678" ], michael@0: ] michael@0: michael@0: function runtest(f,t,nosplit) { michael@0: // create content michael@0: let doc = f.contentDocument; michael@0: for (let i = 2; i < t.length; ++i) { michael@0: c = doc.createTextNode(t[i]); michael@0: doc.body.appendChild(c); michael@0: } michael@0: michael@0: // setup selection michael@0: let sel = t[0] michael@0: let startNode = sel.startNode === undefined ? doc.body.firstChild : doc.body.childNodes[sel.startNode]; michael@0: let startOffset = sel.startOffset === undefined ? 0 : sel.startOffset; michael@0: let endNode = sel.endNode === undefined ? startNode : doc.body.childNodes[sel.endNode]; michael@0: let endOffset = sel.endOffset === undefined ? endNode.length : sel.endOffset; michael@0: let selection = f.contentWindow.getSelection(); michael@0: let r = doc.createRange(); michael@0: r.setStart(startNode, startOffset); michael@0: r.setEnd(endNode, endOffset); michael@0: selection.addRange(r); michael@0: michael@0: // splitText michael@0: let split = t[1] michael@0: if (!nosplit) michael@0: doc.body.childNodes[split[0]].splitText(split[1]) michael@0: } michael@0: function test_ref(f,t,nosplit) { michael@0: runtest(f,t,true); michael@0: } michael@0: function test_split(f,t) { michael@0: runtest(f,t); michael@0: } michael@0: function test_split_insert(f,t) { michael@0: runtest(f,t); michael@0: let doc = f.contentDocument; michael@0: doc.body.firstChild; michael@0: let split = t[1] michael@0: let text1 = doc.body.childNodes[split[0]] michael@0: let text2 = doc.body.childNodes[split[0]+1] michael@0: if (text2.textContent.length==0) return; michael@0: let c = doc.createTextNode(text2.textContent[0]); michael@0: doc.body.insertBefore(c,text2); michael@0: let r = doc.createRange(); michael@0: r.setStart(text2, 0); michael@0: r.setEnd(text2, 1); michael@0: r.deleteContents(); michael@0: } michael@0: function test_split_merge(f,t) { michael@0: runtest(f,t); michael@0: f.contentDocument.body.normalize(); michael@0: } michael@0: function test_merge(f,t) { michael@0: runtest(f,t,true); michael@0: f.contentDocument.body.normalize(); michael@0: } michael@0: michael@0: function createFrame(run,t) { michael@0: let f = document.createElement('iframe'); michael@0: f.setAttribute('height','22'); michael@0: f.setAttribute('frameborder','0'); michael@0: f.setAttribute('width','200'); michael@0: f.src = 'data:text/html,'; michael@0: f.onload = function () { try { run(f, t); } finally { ++tests_done; } } michael@0: return f; michael@0: }