[Yulup-commits] rev 21849 - public/yulup/src/trunk/prototyping/chrome/content

andi at wyona.com andi at wyona.com
Wed Jan 17 23:33:08 CET 2007


Author: andi
Date: 2007-01-17 23:33:06 +0100 (Wed, 17 Jan 2007)
New Revision: 21849

Modified:
   public/yulup/src/trunk/prototyping/chrome/content/domops-test.xul
Log:
Special case with empty ancestor implemented.


Modified: public/yulup/src/trunk/prototyping/chrome/content/domops-test.xul
===================================================================
--- public/yulup/src/trunk/prototyping/chrome/content/domops-test.xul	2007-01-17 22:22:23 UTC (rev 21848)
+++ public/yulup/src/trunk/prototyping/chrome/content/domops-test.xul	2007-01-17 22:33:06 UTC (rev 21849)
@@ -248,48 +248,73 @@
                 DOMSerialiser.serialiseDOMTree(aSelection.focusNode);
                 dump("\n");
 
-                var leftMostChild  = getLeftMostElementChild(commonAncestor);
-                var rightMostChild = getRightMostElementChild(commonAncestor);
+                /* Check if our parent is the element we are looking for, and the only
+                   children are empty text nodes. If this is the case, we can simply remove the parent. */
+                if (aSelection.focusNode.parentNode == commonAncestor) {
+                    var removeAncestor = true;
 
-                // create left splitting range
-                var leftSplittingRange = gEditor.document.createRange();
-                leftSplittingRange.setStartBefore(leftMostChild);
-                leftSplittingRange.setEnd(aSelection.focusNode, aSelection.focusOffset);
+                    for (var i = 0; i < commonAncestor.childNodes.length; i++) {
+                        if (commonAncestor.childNodes.item(i).nodeType != Components.interfaces.nsIDOMNode.TEXT_NODE) {
+                            removeAncestor = false;
+                            break;
+                        } else {
+                            if (commonAncestor.childNodes.item(i).QueryInterface(Components.interfaces.nsIDOMCharacterData).length != 0) {
+                                removeAncestor = false;
+                                break;
+                            }
+                        }
+                    }
+                }
 
-                // create right splitting range
-                var rightSplittingRange = gEditor.document.createRange();
-                rightSplittingRange.setStart(aSelection.focusNode, aSelection.focusOffset);
-                rightSplittingRange.setEndAfter(rightMostChild);
+                if (!removeAncestor) {
+                    var leftMostChild  = getLeftMostElementChild(commonAncestor);
+                    var rightMostChild = getRightMostElementChild(commonAncestor);
 
-                var leftSplittingFragment  = leftSplittingRange.cloneContents();
-                var rightSplittingFragment = rightSplittingRange.cloneContents();
+                    // create left splitting range
+                    var leftSplittingRange = gEditor.document.createRange();
+                    leftSplittingRange.setStartBefore(leftMostChild);
+                    leftSplittingRange.setEnd(aSelection.focusNode, aSelection.focusOffset);
 
-                // dump it
-                dump("left splitting fragment =\n");
-                DOMSerialiser.serialiseDOMTree(leftSplittingFragment);
-                dump("\n");
+                    // create right splitting range
+                    var rightSplittingRange = gEditor.document.createRange();
+                    rightSplittingRange.setStart(aSelection.focusNode, aSelection.focusOffset);
+                    rightSplittingRange.setEndAfter(rightMostChild);
 
-                dump("right splitting fragment =\n");
-                DOMSerialiser.serialiseDOMTree(rightSplittingFragment);
-                dump("\n");
+                    var leftSplittingFragment  = leftSplittingRange.cloneContents();
+                    var rightSplittingFragment = rightSplittingRange.cloneContents();
 
-                // create a new text node where the selection will be placed after the operation
-                textNode = gEditor.document.createTextNode("");
+                    // dump it
+                    dump("left splitting fragment =\n");
+                    DOMSerialiser.serialiseDOMTree(leftSplittingFragment);
+                    dump("\n");
 
-                // create new document fragment to assemble our split subtree
-                var replacementFragment = gEditor.document.createDocumentFragment();
-                replacementFragment.appendChild(leftSplittingFragment);
-                replacementFragment.appendChild(textNode);
-                replacementFragment.appendChild(rightSplittingFragment);
+                    dump("right splitting fragment =\n");
+                    DOMSerialiser.serialiseDOMTree(rightSplittingFragment);
+                    dump("\n");
 
-                dump("replacement fragment =\n");
-                DOMSerialiser.serialiseDOMTree(replacementFragment);
-                dump("\n");
+                    // create a new text node where the selection will be placed after the operation
+                    textNode = gEditor.document.createTextNode("");
 
-                commonAncestor.parentNode.replaceChild(replacementFragment, commonAncestor);
+                    // create new document fragment to assemble our split subtree
+                    var replacementFragment = gEditor.document.createDocumentFragment();
+                    replacementFragment.appendChild(leftSplittingFragment);
+                    replacementFragment.appendChild(textNode);
+                    replacementFragment.appendChild(rightSplittingFragment);
 
-                // move selection into the freshly created text node
-                aSelection.collapse(textNode, 0);
+                    dump("replacement fragment =\n");
+                    DOMSerialiser.serialiseDOMTree(replacementFragment);
+                    dump("\n");
+
+                    commonAncestor.parentNode.replaceChild(replacementFragment, commonAncestor);
+
+                    // move selection into the freshly created text node
+                    aSelection.collapse(textNode, 0);
+                } else {
+                    // simply remove the ancestor
+                    dump("removing common ancestor\n");
+
+                    commonAncestor.parentNode.removeChild(commonAncestor);
+                }
             } else {
 
                 // check if we are in a text node




More information about the Phoenix-commits mailing list