void InputMethodController::setCompositionFromExistingText(const Vector<CompositionUnderline>& underlines, unsigned compositionStart, unsigned compositionEnd) { Node* editable = m_frame->selection().rootEditableElement(); Position base = m_frame->selection().base().downstream(); Node* baseNode = base.anchorNode(); if (editable->firstChild() == baseNode && editable->lastChild() == baseNode && baseNode->isTextNode()) { m_compositionNode = 0; m_customCompositionUnderlines.clear(); if (base.anchorType() != Position::PositionIsOffsetInAnchor) return; if (!baseNode || baseNode != m_frame->selection().extent().anchorNode()) return; m_compositionNode = toText(baseNode); m_compositionStart = compositionStart; m_compositionEnd = compositionEnd; m_customCompositionUnderlines = underlines; size_t numUnderlines = m_customCompositionUnderlines.size(); for (size_t i = 0; i < numUnderlines; ++i) { m_customCompositionUnderlines[i].startOffset += compositionStart; m_customCompositionUnderlines[i].endOffset += compositionStart; } if (baseNode->renderer()) baseNode->renderer()->repaint(); return; } Editor::RevealSelectionScope revealSelectionScope(&editor()); SelectionOffsetsScope selectionOffsetsScope(this); setSelectionOffsets(PlainTextOffsets(compositionStart, compositionEnd)); setComposition(m_frame->selectedText(), underlines, 0, 0); }
void InputMethodController::extendSelectionAndDelete(int before, int after) { if (!editor().canEdit()) return; PlainTextRange selectionOffsets(getSelectionOffsets()); if (selectionOffsets.isNull()) return; // A common call of before=1 and after=0 will fail if the last character // is multi-code-word UTF-16, including both multi-16bit code-points and // Unicode combining character sequences of multiple single-16bit code- // points (officially called "compositions"). Try more until success. // http://crbug.com/355995 // // FIXME: Note that this is not an ideal solution when this function is // called to implement "backspace". In that case, there should be some call // that will not delete a full multi-code-point composition but rather // only the last code-point so that it's possible for a user to correct // a composition without starting it from the beginning. // http://crbug.com/37993 do { if (!setSelectionOffsets(PlainTextRange(std::max(static_cast<int>(selectionOffsets.start()) - before, 0), selectionOffsets.end() + after))) return; if (before == 0) break; ++before; } while (frame().selection().start() == frame().selection().end() && before <= static_cast<int>(selectionOffsets.start())); TypingCommand::deleteSelection(*frame().document()); }
void InputMethodController::extendSelectionAndDelete(int before, int after) { if (!editor().canEdit()) return; PlainTextRange selectionOffsets(getSelectionOffsets()); if (selectionOffsets.isNull()) return; setSelectionOffsets(PlainTextRange(std::max(static_cast<int>(selectionOffsets.start()) - before, 0), selectionOffsets.end() + after)); TypingCommand::deleteSelection(*m_frame.document()); }
void InputMethodController::setCompositionFromExistingText(const Vector<CompositionUnderline>& underlines, unsigned compositionStart, unsigned compositionEnd) { Element* editable = m_frame.selection().rootEditableElement(); Position base = m_frame.selection().base().downstream(); Node* baseNode = base.anchorNode(); if (editable->firstChild() == baseNode && editable->lastChild() == baseNode && baseNode->isTextNode()) { m_compositionNode = nullptr; m_customCompositionUnderlines.clear(); if (base.anchorType() != Position::PositionIsOffsetInAnchor) return; if (!baseNode || baseNode != m_frame.selection().extent().anchorNode()) return; m_compositionNode = toText(baseNode); RefPtr<Range> range = PlainTextRange(compositionStart, compositionEnd).createRange(*editable); m_compositionStart = range->startOffset(); m_compositionEnd = range->endOffset(); m_customCompositionUnderlines = underlines; size_t numUnderlines = m_customCompositionUnderlines.size(); for (size_t i = 0; i < numUnderlines; ++i) { m_customCompositionUnderlines[i].startOffset += m_compositionStart; m_customCompositionUnderlines[i].endOffset += m_compositionStart; } // TODO(ojan): What was this for? Do we need it in sky since we // don't need to support legacy IMEs? if (baseNode->renderer()) baseNode->document().scheduleVisualUpdate(); return; } Editor::RevealSelectionScope revealSelectionScope(&editor()); SelectionOffsetsScope selectionOffsetsScope(this); setSelectionOffsets(PlainTextRange(compositionStart, compositionEnd)); setComposition(m_frame.selectedText(), underlines, 0, 0); }
void InputMethodController::setCompositionFromExistingText(const Vector<CompositionUnderline>& underlines, unsigned compositionStart, unsigned compositionEnd) { Element* editable = frame().selection().rootEditableElement(); Position base = frame().selection().base().downstream(); Node* baseNode = base.anchorNode(); if (baseNode && editable->firstChild() == baseNode && editable->lastChild() == baseNode && baseNode->isTextNode()) { m_compositionNode = nullptr; m_customCompositionUnderlines.clear(); if (base.anchorType() != Position::PositionIsOffsetInAnchor) return; if (baseNode != frame().selection().extent().anchorNode()) return; m_compositionNode = toText(baseNode); RefPtrWillBeRawPtr<Range> range = PlainTextRange(compositionStart, compositionEnd).createRange(*editable); if (!range) return; m_compositionStart = range->startOffset(); m_compositionEnd = range->endOffset(); m_customCompositionUnderlines = underlines; size_t numUnderlines = m_customCompositionUnderlines.size(); for (size_t i = 0; i < numUnderlines; ++i) { m_customCompositionUnderlines[i].startOffset += m_compositionStart; m_customCompositionUnderlines[i].endOffset += m_compositionStart; } if (baseNode->layoutObject()) baseNode->layoutObject()->setShouldDoFullPaintInvalidation(); return; } Editor::RevealSelectionScope revealSelectionScope(&editor()); SelectionOffsetsScope selectionOffsetsScope(this); setSelectionOffsets(PlainTextRange(compositionStart, compositionEnd)); setComposition(frame().selectedText(), underlines, 0, 0); }
bool InputMethodController::setEditableSelectionOffsets(const PlainTextRange& selectionOffsets) { if (!editor().canEdit()) return false; return setSelectionOffsets(selectionOffsets); }