Index: Source/core/rendering/RenderTextControl.cpp |
diff --git a/Source/core/rendering/RenderTextControl.cpp b/Source/core/rendering/RenderTextControl.cpp |
deleted file mode 100644 |
index e73dc9dc78ed14481df3af3eaed7853e470e0c83..0000000000000000000000000000000000000000 |
--- a/Source/core/rendering/RenderTextControl.cpp |
+++ /dev/null |
@@ -1,303 +0,0 @@ |
-/** |
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. |
- * (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) |
- * |
- * This library is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU Library General Public |
- * License as published by the Free Software Foundation; either |
- * version 2 of the License, or (at your option) any later version. |
- * |
- * This library is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
- * Library General Public License for more details. |
- * |
- * You should have received a copy of the GNU Library General Public License |
- * along with this library; see the file COPYING.LIB. If not, write to |
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
- * Boston, MA 02110-1301, USA. |
- * |
- */ |
- |
-#include "config.h" |
-#include "core/rendering/RenderTextControl.h" |
- |
-#include "core/html/HTMLTextFormControlElement.h" |
-#include "core/layout/HitTestResult.h" |
-#include "core/layout/LayoutTheme.h" |
-#include "core/layout/TextRunConstructor.h" |
-#include "platform/scroll/ScrollbarTheme.h" |
-#include "wtf/unicode/CharacterNames.h" |
- |
-namespace blink { |
- |
-RenderTextControl::RenderTextControl(HTMLTextFormControlElement* element) |
- : RenderBlockFlow(element) |
-{ |
- ASSERT(element); |
-} |
- |
-RenderTextControl::~RenderTextControl() |
-{ |
-} |
- |
-HTMLTextFormControlElement* RenderTextControl::textFormControlElement() const |
-{ |
- return toHTMLTextFormControlElement(node()); |
-} |
- |
-HTMLElement* RenderTextControl::innerEditorElement() const |
-{ |
- return textFormControlElement()->innerEditorElement(); |
-} |
- |
-void RenderTextControl::addChild(LayoutObject* newChild, LayoutObject* beforeChild) |
-{ |
- // FIXME: This is a terrible hack to get the caret over the placeholder text since it'll |
- // make us paint the placeholder first. (See https://trac.webkit.org/changeset/118733) |
- Node* node = newChild->node(); |
- if (node && node->isElementNode() && toElement(node)->shadowPseudoId() == "-webkit-input-placeholder") |
- RenderBlockFlow::addChild(newChild, firstChild()); |
- else |
- RenderBlockFlow::addChild(newChild, beforeChild); |
-} |
- |
-void RenderTextControl::styleDidChange(StyleDifference diff, const LayoutStyle* oldStyle) |
-{ |
- RenderBlockFlow::styleDidChange(diff, oldStyle); |
- Element* innerEditor = innerEditorElement(); |
- if (!innerEditor) |
- return; |
- RenderBlock* innerEditorRenderer = toRenderBlock(innerEditor->renderer()); |
- if (innerEditorRenderer) { |
- // We may have set the width and the height in the old style in layout(). |
- // Reset them now to avoid getting a spurious layout hint. |
- innerEditorRenderer->style()->setHeight(Length()); |
- innerEditorRenderer->style()->setWidth(Length()); |
- innerEditorRenderer->setStyle(createInnerEditorStyle(styleRef())); |
- innerEditor->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::Control)); |
- } |
- textFormControlElement()->updatePlaceholderVisibility(false); |
-} |
- |
-static inline void updateUserModifyProperty(HTMLTextFormControlElement& node, LayoutStyle& style) |
-{ |
- style.setUserModify(node.isDisabledOrReadOnly() ? READ_ONLY : READ_WRITE_PLAINTEXT_ONLY); |
-} |
- |
-void RenderTextControl::adjustInnerEditorStyle(LayoutStyle& textBlockStyle) const |
-{ |
- // The inner block, if present, always has its direction set to LTR, |
- // so we need to inherit the direction and unicode-bidi style from the element. |
- textBlockStyle.setDirection(style()->direction()); |
- textBlockStyle.setUnicodeBidi(style()->unicodeBidi()); |
- |
- updateUserModifyProperty(*textFormControlElement(), textBlockStyle); |
-} |
- |
-int RenderTextControl::textBlockLogicalHeight() const |
-{ |
- return logicalHeight() - borderAndPaddingLogicalHeight(); |
-} |
- |
-int RenderTextControl::textBlockLogicalWidth() const |
-{ |
- Element* innerEditor = innerEditorElement(); |
- ASSERT(innerEditor); |
- |
- LayoutUnit unitWidth = logicalWidth() - borderAndPaddingLogicalWidth(); |
- if (innerEditor->renderer()) |
- unitWidth -= innerEditor->renderBox()->paddingStart() + innerEditor->renderBox()->paddingEnd(); |
- |
- return unitWidth; |
-} |
- |
-void RenderTextControl::updateFromElement() |
-{ |
- Element* innerEditor = innerEditorElement(); |
- if (innerEditor && innerEditor->renderer()) |
- updateUserModifyProperty(*textFormControlElement(), innerEditor->renderer()->mutableStyleRef()); |
-} |
- |
-int RenderTextControl::scrollbarThickness() const |
-{ |
- // FIXME: We should get the size of the scrollbar from the LayoutTheme instead. |
- return ScrollbarTheme::theme()->scrollbarThickness(); |
-} |
- |
-void RenderTextControl::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues& computedValues) const |
-{ |
- HTMLElement* innerEditor = innerEditorElement(); |
- ASSERT(innerEditor); |
- if (RenderBox* innerEditorBox = innerEditor->renderBox()) { |
- LayoutUnit nonContentHeight = innerEditorBox->borderAndPaddingHeight() + innerEditorBox->marginHeight(); |
- logicalHeight = computeControlLogicalHeight(innerEditorBox->lineHeight(true, HorizontalLine, PositionOfInteriorLineBoxes), nonContentHeight); |
- |
- // 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 ((isHorizontalWritingMode() && (style()->overflowX() == OSCROLL || (style()->overflowX() == OAUTO && innerEditor->renderer()->style()->overflowWrap() == NormalOverflowWrap))) |
- || (!isHorizontalWritingMode() && (style()->overflowY() == OSCROLL || (style()->overflowY() == OAUTO && innerEditor->renderer()->style()->overflowWrap() == NormalOverflowWrap)))) |
- logicalHeight += scrollbarThickness(); |
- |
- // FIXME: The logical height of the inner text box should have been added before calling computeLogicalHeight to |
- // avoid this hack. |
- setIntrinsicContentLogicalHeight(logicalHeight); |
- |
- logicalHeight += borderAndPaddingHeight(); |
- } |
- |
- RenderBox::computeLogicalHeight(logicalHeight, logicalTop, computedValues); |
-} |
- |
-void RenderTextControl::hitInnerEditorElement(HitTestResult& result, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset) |
-{ |
- HTMLElement* innerEditor = innerEditorElement(); |
- if (!innerEditor->renderer()) |
- return; |
- |
- LayoutPoint adjustedLocation = accumulatedOffset + location(); |
- LayoutPoint localPoint = pointInContainer - toLayoutSize(adjustedLocation + innerEditor->renderBox()->location()); |
- if (hasOverflowClip()) |
- localPoint += scrolledContentOffset(); |
- result.setInnerNode(innerEditor); |
- result.setInnerNonSharedNode(innerEditor); |
- result.setLocalPoint(localPoint); |
-} |
- |
-static const char* const fontFamiliesWithInvalidCharWidth[] = { |
- "American Typewriter", |
- "Arial Hebrew", |
- "Chalkboard", |
- "Cochin", |
- "Corsiva Hebrew", |
- "Courier", |
- "Euphemia UCAS", |
- "Geneva", |
- "Gill Sans", |
- "Hei", |
- "Helvetica", |
- "Hoefler Text", |
- "InaiMathi", |
- "Kai", |
- "Lucida Grande", |
- "Marker Felt", |
- "Monaco", |
- "Mshtakan", |
- "New Peninim MT", |
- "Osaka", |
- "Raanana", |
- "STHeiti", |
- "Symbol", |
- "Times", |
- "Apple Braille", |
- "Apple LiGothic", |
- "Apple LiSung", |
- "Apple Symbols", |
- "AppleGothic", |
- "AppleMyungjo", |
- "#GungSeo", |
- "#HeadLineA", |
- "#PCMyungjo", |
- "#PilGi", |
-}; |
- |
-// For font families where any of the fonts don't have a valid entry in the OS/2 table |
-// for avgCharWidth, fallback to the legacy webkit behavior of getting the avgCharWidth |
-// from the width of a '0'. This only seems to apply to a fixed number of Mac fonts, |
-// but, in order to get similar rendering across platforms, we do this check for |
-// all platforms. |
-bool RenderTextControl::hasValidAvgCharWidth(AtomicString family) |
-{ |
- static HashSet<AtomicString>* fontFamiliesWithInvalidCharWidthMap = 0; |
- |
- if (family.isEmpty()) |
- return false; |
- |
- if (!fontFamiliesWithInvalidCharWidthMap) { |
- fontFamiliesWithInvalidCharWidthMap = new HashSet<AtomicString>; |
- |
- for (size_t i = 0; i < WTF_ARRAY_LENGTH(fontFamiliesWithInvalidCharWidth); ++i) |
- fontFamiliesWithInvalidCharWidthMap->add(AtomicString(fontFamiliesWithInvalidCharWidth[i])); |
- } |
- |
- return !fontFamiliesWithInvalidCharWidthMap->contains(family); |
-} |
- |
-float RenderTextControl::getAvgCharWidth(AtomicString family) |
-{ |
- if (hasValidAvgCharWidth(family)) |
- return roundf(style()->font().primaryFont()->avgCharWidth()); |
- |
- const UChar ch = '0'; |
- const String str = String(&ch, 1); |
- const Font& font = style()->font(); |
- TextRun textRun = constructTextRun(this, font, str, styleRef(), TextRun::AllowTrailingExpansion); |
- return font.width(textRun); |
-} |
- |
-float RenderTextControl::scaleEmToUnits(int x) const |
-{ |
- // This matches the unitsPerEm value for MS Shell Dlg and Courier New from the "head" font table. |
- float unitsPerEm = 2048.0f; |
- return roundf(style()->font().fontDescription().computedSize() * x / unitsPerEm); |
-} |
- |
-void RenderTextControl::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const |
-{ |
- // Use average character width. Matches IE. |
- AtomicString family = style()->font().fontDescription().family().family(); |
- maxLogicalWidth = preferredContentLogicalWidth(const_cast<RenderTextControl*>(this)->getAvgCharWidth(family)); |
- if (RenderBox* innerEditorRenderBox = innerEditorElement()->renderBox()) |
- maxLogicalWidth += innerEditorRenderBox->paddingStart() + innerEditorRenderBox->paddingEnd(); |
- if (!style()->logicalWidth().isPercent()) |
- minLogicalWidth = maxLogicalWidth; |
-} |
- |
-void RenderTextControl::computePreferredLogicalWidths() |
-{ |
- ASSERT(preferredLogicalWidthsDirty()); |
- |
- m_minPreferredLogicalWidth = 0; |
- m_maxPreferredLogicalWidth = 0; |
- const LayoutStyle& styleToUse = styleRef(); |
- |
- if (styleToUse.logicalWidth().isFixed() && styleToUse.logicalWidth().value() >= 0) |
- m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(styleToUse.logicalWidth().value()); |
- else |
- computeIntrinsicLogicalWidths(m_minPreferredLogicalWidth, m_maxPreferredLogicalWidth); |
- |
- if (styleToUse.logicalMinWidth().isFixed() && styleToUse.logicalMinWidth().value() > 0) { |
- m_maxPreferredLogicalWidth = std::max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse.logicalMinWidth().value())); |
- m_minPreferredLogicalWidth = std::max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse.logicalMinWidth().value())); |
- } |
- |
- if (styleToUse.logicalMaxWidth().isFixed()) { |
- m_maxPreferredLogicalWidth = std::min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse.logicalMaxWidth().value())); |
- m_minPreferredLogicalWidth = std::min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse.logicalMaxWidth().value())); |
- } |
- |
- LayoutUnit toAdd = borderAndPaddingLogicalWidth(); |
- |
- m_minPreferredLogicalWidth += toAdd; |
- m_maxPreferredLogicalWidth += toAdd; |
- |
- clearPreferredLogicalWidthsDirty(); |
-} |
- |
-void RenderTextControl::addFocusRingRects(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const |
-{ |
- if (!size().isEmpty()) |
- rects.append(LayoutRect(additionalOffset, size())); |
-} |
- |
-LayoutObject* RenderTextControl::layoutSpecialExcludedChild(bool relayoutChildren, SubtreeLayoutScope& layoutScope) |
-{ |
- HTMLElement* placeholder = toHTMLTextFormControlElement(node())->placeholderElement(); |
- LayoutObject* placeholderRenderer = placeholder ? placeholder->renderer() : 0; |
- if (!placeholderRenderer) |
- return 0; |
- if (relayoutChildren) |
- layoutScope.setChildNeedsLayout(placeholderRenderer); |
- return placeholderRenderer; |
-} |
- |
-} // namespace blink |