📄 rendertextcontrol.cpp
字号:
return TextIterator::rangeLength(range.get());}void RenderTextControl::subtreeHasChanged(){ m_edited = true; m_userEdited = true;}String RenderTextControl::finishText(Vector<UChar>& result) const{ // Remove one trailing newline; there's always one that's collapsed out by rendering. size_t size = result.size(); if (size && result[size - 1] == '\n') result.shrink(--size); // Convert backslash to currency symbol. document()->displayBufferModifiedByEncoding(result.data(), result.size()); return String::adopt(result);}String RenderTextControl::text(){ if (!m_innerText) return ""; Frame* frame = document()->frame(); Text* compositionNode = frame ? frame->editor()->compositionNode() : 0; Vector<UChar> result; for (Node* n = m_innerText.get(); n; n = n->traverseNextNode(m_innerText.get())) { if (n->hasTagName(brTag)) result.append(&newlineCharacter, 1); else if (n->isTextNode()) { Text* text = static_cast<Text*>(n); String data = text->data(); unsigned length = data.length(); if (text != compositionNode) result.append(data.characters(), length); else { unsigned compositionStart = min(frame->editor()->compositionStart(), length); unsigned compositionEnd = min(max(compositionStart, frame->editor()->compositionEnd()), length); result.append(data.characters(), compositionStart); result.append(data.characters() + compositionEnd, length - compositionEnd); } } } return finishText(result);}static void getNextSoftBreak(RootInlineBox*& line, Node*& breakNode, unsigned& breakOffset){ RootInlineBox* next; for (; line; line = next) { next = line->nextRootBox(); if (next && !line->endsWithBreak()) { ASSERT(line->lineBreakObj()); breakNode = line->lineBreakObj()->node(); breakOffset = line->lineBreakPos(); line = next; return; } } breakNode = 0;}String RenderTextControl::textWithHardLineBreaks(){ if (!m_innerText) return ""; Node* firstChild = m_innerText->firstChild(); if (!firstChild) return ""; document()->updateLayout(); RenderObject* renderer = firstChild->renderer(); if (!renderer) return ""; InlineBox* box = renderer->isText() ? toRenderText(renderer)->firstTextBox() : toRenderBox(renderer)->inlineBoxWrapper(); if (!box) return ""; Frame* frame = document()->frame(); Text* compositionNode = frame ? frame->editor()->compositionNode() : 0; Node* breakNode; unsigned breakOffset; RootInlineBox* line = box->root(); getNextSoftBreak(line, breakNode, breakOffset); Vector<UChar> result; for (Node* n = firstChild; n; n = n->traverseNextNode(m_innerText.get())) { if (n->hasTagName(brTag)) result.append(&newlineCharacter, 1); else if (n->isTextNode()) { Text* text = static_cast<Text*>(n); String data = text->data(); unsigned length = data.length(); unsigned compositionStart = (text == compositionNode) ? min(frame->editor()->compositionStart(), length) : 0; unsigned compositionEnd = (text == compositionNode) ? min(max(compositionStart, frame->editor()->compositionEnd()), length) : 0; unsigned position = 0; while (breakNode == n && breakOffset < compositionStart) { result.append(data.characters() + position, breakOffset - position); position = breakOffset; result.append(&newlineCharacter, 1); getNextSoftBreak(line, breakNode, breakOffset); } result.append(data.characters() + position, compositionStart - position); position = compositionEnd; while (breakNode == n && breakOffset <= length) { if (breakOffset > position) { result.append(data.characters() + position, breakOffset - position); position = breakOffset; result.append(&newlineCharacter, 1); } getNextSoftBreak(line, breakNode, breakOffset); } result.append(data.characters() + position, length - position); } while (breakNode == n) getNextSoftBreak(line, breakNode, breakOffset); } return finishText(result);}int RenderTextControl::scrollbarThickness() const{ // FIXME: We should get the size of the scrollbar from the RenderTheme instead. return ScrollbarTheme::nativeTheme()->scrollbarThickness();}void RenderTextControl::calcHeight(){ setHeight(m_innerText->renderBox()->borderTop() + m_innerText->renderBox()->borderBottom() + m_innerText->renderBox()->paddingTop() + m_innerText->renderBox()->paddingBottom() + m_innerText->renderBox()->marginTop() + m_innerText->renderBox()->marginBottom()); adjustControlHeightBasedOnLineHeight(m_innerText->renderer()->lineHeight(true, true)); setHeight(height() + paddingTop() + paddingBottom() + borderTop() + borderBottom()); // We are able to have a horizontal scrollbar if the overflow style is scroll, or if its auto and there's no word wrap. if (m_innerText->renderer()->style()->overflowX() == OSCROLL || (m_innerText->renderer()->style()->overflowX() == OAUTO && m_innerText->renderer()->style()->wordWrap() == NormalWordWrap)) setHeight(height() + scrollbarThickness()); RenderBlock::calcHeight();}void RenderTextControl::hitInnerTextBlock(HitTestResult& result, int xPos, int yPos, int tx, int ty){ result.setInnerNode(m_innerText.get()); result.setLocalPoint(IntPoint(xPos - tx - x() - m_innerText->renderBox()->x(), yPos - ty - y() - m_innerText->renderBox()->y()));}void RenderTextControl::forwardEvent(Event* event){ if (event->type() == eventNames().blurEvent || event->type() == eventNames().focusEvent) return; m_innerText->defaultEventHandler(event);}IntRect RenderTextControl::controlClipRect(int tx, int ty) const{ IntRect clipRect = contentBoxRect(); clipRect.move(tx, ty); return clipRect;}void RenderTextControl::calcPrefWidths(){ ASSERT(prefWidthsDirty()); m_minPrefWidth = 0; m_maxPrefWidth = 0; if (style()->width().isFixed() && style()->width().value() > 0) m_minPrefWidth = m_maxPrefWidth = calcContentBoxWidth(style()->width().value()); else { // Figure out how big a text control needs to be for a given number of characters // (using "0" as the nominal character). const UChar ch = '0'; float charWidth = style()->font().floatWidth(TextRun(&ch, 1, false, 0, 0, false, false, false)); m_maxPrefWidth = preferredContentWidth(charWidth) + m_innerText->renderBox()->paddingLeft() + m_innerText->renderBox()->paddingRight(); } if (style()->minWidth().isFixed() && style()->minWidth().value() > 0) { m_maxPrefWidth = max(m_maxPrefWidth, calcContentBoxWidth(style()->minWidth().value())); m_minPrefWidth = max(m_minPrefWidth, calcContentBoxWidth(style()->minWidth().value())); } else if (style()->width().isPercent() || (style()->width().isAuto() && style()->height().isPercent())) m_minPrefWidth = 0; else m_minPrefWidth = m_maxPrefWidth; if (style()->maxWidth().isFixed() && style()->maxWidth().value() != undefinedLength) { m_maxPrefWidth = min(m_maxPrefWidth, calcContentBoxWidth(style()->maxWidth().value())); m_minPrefWidth = min(m_minPrefWidth, calcContentBoxWidth(style()->maxWidth().value())); } int toAdd = paddingLeft() + paddingRight() + borderLeft() + borderRight(); m_minPrefWidth += toAdd; m_maxPrefWidth += toAdd; setPrefWidthsDirty(false);}void RenderTextControl::selectionChanged(bool userTriggered){ cacheSelection(selectionStart(), selectionEnd()); if (Frame* frame = document()->frame()) { if (frame->selection()->isRange() && userTriggered) node()->dispatchEventForType(eventNames().selectEvent, true, false); }}void RenderTextControl::addFocusRingRects(GraphicsContext* graphicsContext, int tx, int ty){ graphicsContext->addFocusRingRect(IntRect(tx, ty, width(), height()));}void RenderTextControl::autoscroll(){ RenderLayer* layer = m_innerText->renderBox()->layer(); if (layer) layer->autoscroll();}int RenderTextControl::scrollWidth() const{ if (m_innerText) return m_innerText->scrollWidth(); return RenderBlock::scrollWidth();}int RenderTextControl::scrollHeight() const{ if (m_innerText) return m_innerText->scrollHeight(); return RenderBlock::scrollHeight();}int RenderTextControl::scrollLeft() const{ if (m_innerText) return m_innerText->scrollLeft(); return RenderBlock::scrollLeft();}int RenderTextControl::scrollTop() const{ if (m_innerText) return m_innerText->scrollTop(); return RenderBlock::scrollTop();}void RenderTextControl::setScrollLeft(int newLeft){ if (m_innerText) m_innerText->setScrollLeft(newLeft);}void RenderTextControl::setScrollTop(int newTop){ if (m_innerText) m_innerText->setScrollTop(newTop);}bool RenderTextControl::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier){ RenderLayer* layer = m_innerText->renderBox()->layer(); if (layer && layer->scroll(direction, granularity, multiplier)) return true; return RenderBlock::scroll(direction, granularity, multiplier);}HTMLElement* RenderTextControl::innerTextElement() const{ return m_innerText.get();}FormControlElement* RenderTextControl::formControlElement() const{ return toFormControlElement(static_cast<Element*>(node()));}} // namespace WebCore
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -