void DeleteSelectionCommand::removeNode(PassRefPtr<Node> node) { if (!node) return; if (m_startRoot != m_endRoot && !(node->isDescendantOf(m_startRoot.get()) && node->isDescendantOf(m_endRoot.get()))) { // If a node is not in both the start and end editable roots, remove it only if its inside an editable region. if (!node->parentNode()->rendererIsEditable()) { // Don't remove non-editable atomic nodes. if (!node->firstChild()) return; // Search this non-editable region for editable regions to empty. RefPtr<Node> child = node->firstChild(); while (child) { RefPtr<Node> nextChild = child->nextSibling(); removeNode(child.get()); // Bail if nextChild is no longer node's child. if (nextChild && nextChild->parentNode() != node) return; child = nextChild; } // Don't remove editable regions that are inside non-editable ones, just clear them. return; } } if (isTableStructureNode(node.get()) || node == node->rootEditableElement()) { // Do not remove an element of table structure; remove its contents. // Likewise for the root editable element. Node* child = node->firstChild(); while (child) { Node* remove = child; child = child->nextSibling(); removeNode(remove); } // Make sure empty cell has some height, if a placeholder can be inserted. document()->updateLayoutIgnorePendingStylesheets(); RenderObject *r = node->renderer(); if (r && r->isTableCell() && toRenderTableCell(r)->contentHeight() <= 0) { Position firstEditablePosition = firstEditablePositionInNode(node.get()); if (firstEditablePosition.isNotNull()) insertBlockPlaceholder(firstEditablePosition); } return; } if (node == m_startBlock && !isEndOfBlock(VisiblePosition(firstPositionInNode(m_startBlock.get())).previous())) m_needPlaceholder = true; else if (node == m_endBlock && !isStartOfBlock(VisiblePosition(lastPositionInNode(m_startBlock.get())).next())) m_needPlaceholder = true; // FIXME: Update the endpoints of the range being deleted. updatePositionForNodeRemoval(m_endingPosition, node.get()); updatePositionForNodeRemoval(m_leadingWhitespace, node.get()); updatePositionForNodeRemoval(m_trailingWhitespace, node.get()); CompositeEditCommand::removeNode(node); }
void replaceChildrenWithFragment(ContainerNode* container, PassRefPtr<DocumentFragment> fragment, ExceptionState& exceptionState) { ASSERT(container); RefPtr<ContainerNode> containerNode(container); ChildListMutationScope mutation(*containerNode); if (!fragment->firstChild()) { containerNode->removeChildren(); return; } // FIXME: This is wrong if containerNode->firstChild() has more than one ref! if (containerNode->hasOneTextChild() && fragment->hasOneTextChild()) { toText(containerNode->firstChild())->setData(toText(fragment->firstChild())->data()); return; } // FIXME: No need to replace the child it is a text node and its contents are already == text. if (containerNode->hasOneChild()) { containerNode->replaceChild(fragment, containerNode->firstChild(), exceptionState); return; } containerNode->removeChildren(); containerNode->appendChild(fragment, exceptionState); }
PassRefPtr<StaticNodeList> createSelectorNodeList(PassRefPtr<Node> rootNode, CSSSelector* querySelector) { Vector<RefPtr<Node> > nodes; Document* document = rootNode->document(); AtomicString selectorValue = querySelector->m_value; if (!querySelector->next() && querySelector->m_match == CSSSelector::Id && !document->containsMultipleElementsWithId(selectorValue)) { Element* element = document->getElementById(selectorValue); if (element && (rootNode->isDocumentNode() || element->isDescendantOf(rootNode.get()))) nodes.append(element); } else { CSSStyleSelector::SelectorChecker selectorChecker(document, !document->inCompatMode()); for (Node* n = rootNode->firstChild(); n; n = n->traverseNextNode(rootNode.get())) { if (n->isElementNode()) { Element* element = static_cast<Element*>(n); for (CSSSelector* selector = querySelector; selector; selector = selector->next()) { if (selectorChecker.checkSelector(selector, element)) { nodes.append(n); break; } } } } } return StaticNodeList::adopt(nodes); }
static void replaceChildrenWithFragment(HTMLElement* element, PassRefPtr<DocumentFragment> fragment, ExceptionCode& ec) { if (!fragment->firstChild()) { element->removeChildren(); return; } if (hasOneTextChild(element) && hasOneTextChild(fragment.get())) { static_cast<Text*>(element->firstChild())->setData(static_cast<Text*>(fragment->firstChild())->string(), ec); return; } if (hasOneChild(element)) { element->replaceChild(fragment, element->firstChild(), ec); return; } element->removeChildren(); element->appendChild(fragment, ec); }
void replaceChildrenWithFragment(ContainerNode& container, PassRefPtr<DocumentFragment> fragment, ExceptionCode& ec) { Ref<ContainerNode> containerNode(container); ChildListMutationScope mutation(containerNode.get()); if (!fragment->firstChild()) { containerNode->removeChildren(); return; } if (hasOneTextChild(&containerNode.get()) && hasOneTextChild(fragment.get())) { toText(containerNode->firstChild())->setData(toText(fragment->firstChild())->data(), ec); return; } if (hasOneChild(&containerNode.get())) { containerNode->replaceChild(fragment, containerNode->firstChild(), ec); return; } containerNode->removeChildren(); containerNode->appendChild(fragment, ec); }
void replaceChildrenWithFragment(ContainerNode& container, PassRefPtr<DocumentFragment> fragment, ExceptionCode& ec) { Ref<ContainerNode> containerNode(container); ChildListMutationScope mutation(containerNode); if (!fragment->firstChild()) { containerNode->removeChildren(); return; } if (hasOneTextChild(containerNode) && hasOneTextChild(*fragment)) { downcast<Text>(*containerNode->firstChild()).setData(downcast<Text>(*fragment->firstChild()).data(), ec); return; } if (hasOneChild(containerNode)) { containerNode->replaceChild(fragment, containerNode->firstChild(), ec); return; } containerNode->removeChildren(); containerNode->appendChild(fragment, ec); }