bool DOMSelection::containsNode(const Node* n, bool allowPartial) const { if (!m_frame) return false; FrameSelection& selection = m_frame->selection(); if (!n || m_frame->document() != n->document() || selection.isNone()) return false; unsigned nodeIndex = n->nodeIndex(); RefPtr<Range> selectedRange = selection.selection().toNormalizedRange(); ContainerNode* parentNode = n->parentNode(); if (!parentNode) return false; TrackExceptionState exceptionState; bool nodeFullySelected = Range::compareBoundaryPoints(parentNode, nodeIndex, selectedRange->startContainer(), selectedRange->startOffset(), exceptionState) >= 0 && !exceptionState.had_exception() && Range::compareBoundaryPoints(parentNode, nodeIndex + 1, selectedRange->endContainer(), selectedRange->endOffset(), exceptionState) <= 0 && !exceptionState.had_exception(); if (exceptionState.had_exception()) return false; if (nodeFullySelected) return true; bool nodeFullyUnselected = (Range::compareBoundaryPoints(parentNode, nodeIndex, selectedRange->endContainer(), selectedRange->endOffset(), exceptionState) > 0 && !exceptionState.had_exception()) || (Range::compareBoundaryPoints(parentNode, nodeIndex + 1, selectedRange->startContainer(), selectedRange->startOffset(), exceptionState) < 0 && !exceptionState.had_exception()); ASSERT(!exceptionState.had_exception()); if (nodeFullyUnselected) return false; return allowPartial || n->isTextNode(); }
static void frameContentAsPlainText(size_t maxChars, LocalFrame* frame, StringBuilder& output) { Document* document = frame->document(); if (!document) return; if (!frame->view()) return; // Select the document body. RefPtr<Range> range(document->createRange()); TrackExceptionState exceptionState; range->selectNodeContents(document, exceptionState); if (!exceptionState.had_exception()) { // The text iterator will walk nodes giving us text. This is similar to // the plainText() function in core/editing/TextIterator.h, but we implement the maximum // size and also copy the results directly into a wstring, avoiding the // string conversion. for (TextIterator it(range.get()); !it.atEnd(); it.advance()) { it.appendTextToStringBuilder(output, 0, maxChars - output.length()); if (output.length() >= maxChars) return; // Filled up the buffer. } } }
void SplitTextNodeCommand::insertText1AndTrimText2() { TrackExceptionState exceptionState; m_text2->parentNode()->insertBefore(m_text1.get(), m_text2.get(), exceptionState); if (exceptionState.had_exception()) return; m_text2->deleteData(0, m_offset, exceptionState, CharacterData::DeprecatedRecalcStyleImmediatlelyForEditing); }