From 00f450ae6c41620f529e2462ad303d47a891360b Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Tue, 16 Aug 2011 02:55:22 +0200 Subject: [PATCH] Bug 191864 - Range and Selection broken with splitText() and normalize(). --- layout/reftests/selection/reftest.list | 1 + .../selection/splitText-normalize-ref.html | 40 ++++++++ .../selection/splitText-normalize.html | 40 ++++++++ .../reftests/selection/splitText-normalize.js | 97 +++++++++++++++++++ 4 files changed, 178 insertions(+) create mode 100644 layout/reftests/selection/splitText-normalize-ref.html create mode 100644 layout/reftests/selection/splitText-normalize.html create mode 100644 layout/reftests/selection/splitText-normalize.js diff --git a/layout/reftests/selection/reftest.list b/layout/reftests/selection/reftest.list index 88bf6b134e23..8cac708904d3 100644 --- a/layout/reftests/selection/reftest.list +++ b/layout/reftests/selection/reftest.list @@ -30,3 +30,4 @@ fails-if(cocoaWidget) == non-themed-widget.html non-themed-widget-ref.html fails-if(cocoaWidget) == themed-widget.html themed-widget-ref.html == addrange-1.html addrange-ref.html == addrange-2.html addrange-ref.html +== splitText-normalize.html splitText-normalize-ref.html diff --git a/layout/reftests/selection/splitText-normalize-ref.html b/layout/reftests/selection/splitText-normalize-ref.html new file mode 100644 index 000000000000..fd507ab0f9db --- /dev/null +++ b/layout/reftests/selection/splitText-normalize-ref.html @@ -0,0 +1,40 @@ + + + + + Test for Bug 191864 + + + + + + + + + + diff --git a/layout/reftests/selection/splitText-normalize.html b/layout/reftests/selection/splitText-normalize.html new file mode 100644 index 000000000000..a6fc7ed640da --- /dev/null +++ b/layout/reftests/selection/splitText-normalize.html @@ -0,0 +1,40 @@ + + + + + Test for Bug 191864 + + + + + + + + + + diff --git a/layout/reftests/selection/splitText-normalize.js b/layout/reftests/selection/splitText-normalize.js new file mode 100644 index 000000000000..c0b1e976e339 --- /dev/null +++ b/layout/reftests/selection/splitText-normalize.js @@ -0,0 +1,97 @@ +/** Test for Bug 191864 **/ +var tests_done = 0; +var tests = [ + [ {}, [0,4], "012345678" ], + [ {}, [0,0], "012345678" ], + [ {}, [0,9], "012345678" ], + [ {startOffset:4}, [0,4], "012345678" ], + [ {startOffset:5}, [0,4], "012345678" ], + [ {startOffset:5,endOffset:6}, [0,4], "012345678" ], + [ {endOffset:5}, [0,4], "012345678" ], + [ {endOffset:4}, [0,4], "012345678" ], + [ {endOffset:3}, [0,4], "012345678" ], + [ {startOffset:1,endOffset:3}, [0,4], "012345678" ], + [ {startOffset:7,endOffset:7}, [0,4], "012345678" ], + [ {startOffset:4,endOffset:4}, [0,4], "012345678" ], + [ {endNode:1}, [0,4], "012345678", "" ], + [ {endNode:1}, [0,4], "01234567", "8" ], + [ {endNode:1}, [1,4], "0", "12345678" ], + [ {endNode:2}, [1,4], "0", "12345", "678" ], +] + +function runtest(f,t,nosplit) { + // create content + let doc = f.contentDocument; + for (let i = 2; i < t.length; ++i) { + c = doc.createTextNode(t[i]); + doc.body.appendChild(c); + } + + // setup selection + let sel = t[0] + let startNode = sel.startNode === undefined ? doc.body.firstChild : doc.body.childNodes[sel.startNode]; + let startOffset = sel.startOffset === undefined ? 0 : sel.startOffset; + let endNode = sel.endNode === undefined ? startNode : doc.body.childNodes[sel.endNode]; + let endOffset = sel.endOffset === undefined ? endNode.length : sel.endOffset; + let selection = f.contentWindow.getSelection(); + let r = doc.createRange(); + r.setStart(startNode, startOffset); + r.setEnd(endNode, endOffset); + selection.addRange(r); + + // splitText + let split = t[1] + if (!nosplit) + doc.body.childNodes[split[0]].splitText(split[1]) +} +function test_ref(f,t,nosplit) { + runtest(f,t,true); +} +function test_split(f,t) { + runtest(f,t); +} +function test_split_insert(f,t) { + runtest(f,t); + let doc = f.contentDocument; + doc.body.firstChild; + let split = t[1] + let text1 = doc.body.childNodes[split[0]] + let text2 = doc.body.childNodes[split[0]+1] + if (text2.textContent.length==0) return; + let c = doc.createTextNode(text2.textContent[0]); + doc.body.insertBefore(c,text2); + let r = doc.createRange(); + r.setStart(text2, 0); + r.setEnd(text2, 1); + r.deleteContents(); +} +function test_split_merge(f,t) { + runtest(f,t); + f.contentDocument.body.normalize(); +} +function test_merge(f,t) { + runtest(f,t,true); + f.contentDocument.body.normalize(); +} + +function repaint_selection(win) { + let a = new Array; + let sel = win.getSelection(); + for (let i = 0; i < sel.rangeCount; ++i) { + a[i] = sel.getRangeAt(i); + } + sel.removeAllRanges(); + for (let i = 0; i < a.length; ++i) { + sel.addRange(a[i]); + } +} + +function createFrame(run,t) { + let f = document.createElement('iframe'); + f.setAttribute('height','22'); + f.setAttribute('frameborder','0'); + f.setAttribute('width','200'); + f.src = 'data:text/html,'; + f.onload = function () { try { run(f, t); repaint_selection(f.contentWindow);} finally { ++tests_done; } } + return f; +}