OLD | NEW |
1 /** | 1 /** |
2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. |
3 * (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 3 * (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 29 matching lines...) Expand all Loading... |
40 | 40 |
41 RenderTextControl::~RenderTextControl() | 41 RenderTextControl::~RenderTextControl() |
42 { | 42 { |
43 } | 43 } |
44 | 44 |
45 HTMLTextFormControlElement* RenderTextControl::textFormControlElement() const | 45 HTMLTextFormControlElement* RenderTextControl::textFormControlElement() const |
46 { | 46 { |
47 return toHTMLTextFormControlElement(node()); | 47 return toHTMLTextFormControlElement(node()); |
48 } | 48 } |
49 | 49 |
50 HTMLElement* RenderTextControl::innerTextElement() const | 50 HTMLElement* RenderTextControl::innerEditorElement() const |
51 { | 51 { |
52 return textFormControlElement()->innerTextElement(); | 52 return textFormControlElement()->innerEditorElement(); |
53 } | 53 } |
54 | 54 |
55 void RenderTextControl::addChild(RenderObject* newChild, RenderObject* beforeChi
ld) | 55 void RenderTextControl::addChild(RenderObject* newChild, RenderObject* beforeChi
ld) |
56 { | 56 { |
57 // FIXME: This is a terrible hack to get the caret over the placeholder text
since it'll | 57 // FIXME: This is a terrible hack to get the caret over the placeholder text
since it'll |
58 // make us paint the placeholder first. (See https://trac.webkit.org/changes
et/118733) | 58 // make us paint the placeholder first. (See https://trac.webkit.org/changes
et/118733) |
59 Node* node = newChild->node(); | 59 Node* node = newChild->node(); |
60 if (node && node->isElementNode() && toElement(node)->shadowPseudoId() == "-
webkit-input-placeholder") | 60 if (node && node->isElementNode() && toElement(node)->shadowPseudoId() == "-
webkit-input-placeholder") |
61 RenderBlockFlow::addChild(newChild, firstChild()); | 61 RenderBlockFlow::addChild(newChild, firstChild()); |
62 else | 62 else |
63 RenderBlockFlow::addChild(newChild, beforeChild); | 63 RenderBlockFlow::addChild(newChild, beforeChild); |
64 } | 64 } |
65 | 65 |
66 void RenderTextControl::styleDidChange(StyleDifference diff, const RenderStyle*
oldStyle) | 66 void RenderTextControl::styleDidChange(StyleDifference diff, const RenderStyle*
oldStyle) |
67 { | 67 { |
68 RenderBlockFlow::styleDidChange(diff, oldStyle); | 68 RenderBlockFlow::styleDidChange(diff, oldStyle); |
69 Element* innerText = innerTextElement(); | 69 Element* innerEditor = innerEditorElement(); |
70 if (!innerText) | 70 if (!innerEditor) |
71 return; | 71 return; |
72 RenderBlock* innerTextRenderer = toRenderBlock(innerText->renderer()); | 72 RenderBlock* innerEditorRenderer = toRenderBlock(innerEditor->renderer()); |
73 if (innerTextRenderer) { | 73 if (innerEditorRenderer) { |
74 // We may have set the width and the height in the old style in layout()
. | 74 // We may have set the width and the height in the old style in layout()
. |
75 // Reset them now to avoid getting a spurious layout hint. | 75 // Reset them now to avoid getting a spurious layout hint. |
76 innerTextRenderer->style()->setHeight(Length()); | 76 innerEditorRenderer->style()->setHeight(Length()); |
77 innerTextRenderer->style()->setWidth(Length()); | 77 innerEditorRenderer->style()->setWidth(Length()); |
78 innerTextRenderer->setStyle(createInnerTextStyle(style())); | 78 innerEditorRenderer->setStyle(createInnerEditorStyle(style())); |
79 innerText->setNeedsStyleRecalc(SubtreeStyleChange); | 79 innerEditor->setNeedsStyleRecalc(SubtreeStyleChange); |
80 } | 80 } |
81 textFormControlElement()->updatePlaceholderVisibility(false); | 81 textFormControlElement()->updatePlaceholderVisibility(false); |
82 } | 82 } |
83 | 83 |
84 static inline void updateUserModifyProperty(HTMLTextFormControlElement* node, Re
nderStyle* style) | 84 static inline void updateUserModifyProperty(HTMLTextFormControlElement* node, Re
nderStyle* style) |
85 { | 85 { |
86 style->setUserModify(node->isDisabledOrReadOnly() ? READ_ONLY : READ_WRITE_P
LAINTEXT_ONLY); | 86 style->setUserModify(node->isDisabledOrReadOnly() ? READ_ONLY : READ_WRITE_P
LAINTEXT_ONLY); |
87 } | 87 } |
88 | 88 |
89 void RenderTextControl::adjustInnerTextStyle(RenderStyle* textBlockStyle) const | 89 void RenderTextControl::adjustInnerEditorStyle(RenderStyle* textBlockStyle) cons
t |
90 { | 90 { |
91 // The inner block, if present, always has its direction set to LTR, | 91 // The inner block, if present, always has its direction set to LTR, |
92 // so we need to inherit the direction and unicode-bidi style from the eleme
nt. | 92 // so we need to inherit the direction and unicode-bidi style from the eleme
nt. |
93 textBlockStyle->setDirection(style()->direction()); | 93 textBlockStyle->setDirection(style()->direction()); |
94 textBlockStyle->setUnicodeBidi(style()->unicodeBidi()); | 94 textBlockStyle->setUnicodeBidi(style()->unicodeBidi()); |
95 | 95 |
96 updateUserModifyProperty(textFormControlElement(), textBlockStyle); | 96 updateUserModifyProperty(textFormControlElement(), textBlockStyle); |
97 } | 97 } |
98 | 98 |
99 int RenderTextControl::textBlockLogicalHeight() const | 99 int RenderTextControl::textBlockLogicalHeight() const |
100 { | 100 { |
101 return logicalHeight() - borderAndPaddingLogicalHeight(); | 101 return logicalHeight() - borderAndPaddingLogicalHeight(); |
102 } | 102 } |
103 | 103 |
104 int RenderTextControl::textBlockLogicalWidth() const | 104 int RenderTextControl::textBlockLogicalWidth() const |
105 { | 105 { |
106 Element* innerText = innerTextElement(); | 106 Element* innerEditor = innerEditorElement(); |
107 ASSERT(innerText); | 107 ASSERT(innerEditor); |
108 | 108 |
109 LayoutUnit unitWidth = logicalWidth() - borderAndPaddingLogicalWidth(); | 109 LayoutUnit unitWidth = logicalWidth() - borderAndPaddingLogicalWidth(); |
110 if (innerText->renderer()) | 110 if (innerEditor->renderer()) |
111 unitWidth -= innerText->renderBox()->paddingStart() + innerText->renderB
ox()->paddingEnd(); | 111 unitWidth -= innerEditor->renderBox()->paddingStart() + innerEditor->ren
derBox()->paddingEnd(); |
112 | 112 |
113 return unitWidth; | 113 return unitWidth; |
114 } | 114 } |
115 | 115 |
116 void RenderTextControl::updateFromElement() | 116 void RenderTextControl::updateFromElement() |
117 { | 117 { |
118 Element* innerText = innerTextElement(); | 118 Element* innerEditor = innerEditorElement(); |
119 if (innerText && innerText->renderer()) | 119 if (innerEditor && innerEditor->renderer()) |
120 updateUserModifyProperty(textFormControlElement(), innerText->renderer()
->style()); | 120 updateUserModifyProperty(textFormControlElement(), innerEditor->renderer
()->style()); |
121 } | 121 } |
122 | 122 |
123 int RenderTextControl::scrollbarThickness() const | 123 int RenderTextControl::scrollbarThickness() const |
124 { | 124 { |
125 // FIXME: We should get the size of the scrollbar from the RenderTheme inste
ad. | 125 // FIXME: We should get the size of the scrollbar from the RenderTheme inste
ad. |
126 return ScrollbarTheme::theme()->scrollbarThickness(); | 126 return ScrollbarTheme::theme()->scrollbarThickness(); |
127 } | 127 } |
128 | 128 |
129 void RenderTextControl::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUni
t logicalTop, LogicalExtentComputedValues& computedValues) const | 129 void RenderTextControl::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUni
t logicalTop, LogicalExtentComputedValues& computedValues) const |
130 { | 130 { |
131 HTMLElement* innerText = innerTextElement(); | 131 HTMLElement* innerEditor = innerEditorElement(); |
132 ASSERT(innerText); | 132 ASSERT(innerEditor); |
133 if (RenderBox* innerTextBox = innerText->renderBox()) { | 133 if (RenderBox* innerEditorBox = innerEditor->renderBox()) { |
134 LayoutUnit nonContentHeight = innerTextBox->borderAndPaddingHeight() + i
nnerTextBox->marginHeight(); | 134 LayoutUnit nonContentHeight = innerEditorBox->borderAndPaddingHeight() +
innerEditorBox->marginHeight(); |
135 logicalHeight = computeControlLogicalHeight(innerTextBox->lineHeight(tru
e, HorizontalLine, PositionOfInteriorLineBoxes), nonContentHeight); | 135 logicalHeight = computeControlLogicalHeight(innerEditorBox->lineHeight(t
rue, HorizontalLine, PositionOfInteriorLineBoxes), nonContentHeight); |
136 | 136 |
137 // We are able to have a horizontal scrollbar if the overflow style is s
croll, or if its auto and there's no word wrap. | 137 // We are able to have a horizontal scrollbar if the overflow style is s
croll, or if its auto and there's no word wrap. |
138 if ((isHorizontalWritingMode() && (style()->overflowX() == OSCROLL || (
style()->overflowX() == OAUTO && innerText->renderer()->style()->overflowWrap()
== NormalOverflowWrap))) | 138 if ((isHorizontalWritingMode() && (style()->overflowX() == OSCROLL || (
style()->overflowX() == OAUTO && innerEditor->renderer()->style()->overflowWrap(
) == NormalOverflowWrap))) |
139 || (!isHorizontalWritingMode() && (style()->overflowY() == OSCROLL |
| (style()->overflowY() == OAUTO && innerText->renderer()->style()->overflowWra
p() == NormalOverflowWrap)))) | 139 || (!isHorizontalWritingMode() && (style()->overflowY() == OSCROLL |
| (style()->overflowY() == OAUTO && innerEditor->renderer()->style()->overflowW
rap() == NormalOverflowWrap)))) |
140 logicalHeight += scrollbarThickness(); | 140 logicalHeight += scrollbarThickness(); |
141 | 141 |
142 // FIXME: The logical height of the inner text box should have been adde
d before calling computeLogicalHeight to | 142 // FIXME: The logical height of the inner text box should have been adde
d before calling computeLogicalHeight to |
143 // avoid this hack. | 143 // avoid this hack. |
144 updateIntrinsicContentLogicalHeight(logicalHeight); | 144 updateIntrinsicContentLogicalHeight(logicalHeight); |
145 | 145 |
146 logicalHeight += borderAndPaddingHeight(); | 146 logicalHeight += borderAndPaddingHeight(); |
147 } | 147 } |
148 | 148 |
149 RenderBox::computeLogicalHeight(logicalHeight, logicalTop, computedValues); | 149 RenderBox::computeLogicalHeight(logicalHeight, logicalTop, computedValues); |
150 } | 150 } |
151 | 151 |
152 void RenderTextControl::hitInnerTextElement(HitTestResult& result, const LayoutP
oint& pointInContainer, const LayoutPoint& accumulatedOffset) | 152 void RenderTextControl::hitInnerEditorElement(HitTestResult& result, const Layou
tPoint& pointInContainer, const LayoutPoint& accumulatedOffset) |
153 { | 153 { |
154 HTMLElement* innerText = innerTextElement(); | 154 HTMLElement* innerEditor = innerEditorElement(); |
155 if (!innerText->renderer()) | 155 if (!innerEditor->renderer()) |
156 return; | 156 return; |
157 | 157 |
158 LayoutPoint adjustedLocation = accumulatedOffset + location(); | 158 LayoutPoint adjustedLocation = accumulatedOffset + location(); |
159 LayoutPoint localPoint = pointInContainer - toLayoutSize(adjustedLocation +
innerText->renderBox()->location()); | 159 LayoutPoint localPoint = pointInContainer - toLayoutSize(adjustedLocation +
innerEditor->renderBox()->location()); |
160 if (hasOverflowClip()) | 160 if (hasOverflowClip()) |
161 localPoint += scrolledContentOffset(); | 161 localPoint += scrolledContentOffset(); |
162 result.setInnerNode(innerText); | 162 result.setInnerNode(innerEditor); |
163 result.setInnerNonSharedNode(innerText); | 163 result.setInnerNonSharedNode(innerEditor); |
164 result.setLocalPoint(localPoint); | 164 result.setLocalPoint(localPoint); |
165 } | 165 } |
166 | 166 |
167 static const char* const fontFamiliesWithInvalidCharWidth[] = { | 167 static const char* const fontFamiliesWithInvalidCharWidth[] = { |
168 "American Typewriter", | 168 "American Typewriter", |
169 "Arial Hebrew", | 169 "Arial Hebrew", |
170 "Chalkboard", | 170 "Chalkboard", |
171 "Cochin", | 171 "Cochin", |
172 "Corsiva Hebrew", | 172 "Corsiva Hebrew", |
173 "Courier", | 173 "Courier", |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 // This matches the unitsPerEm value for MS Shell Dlg and Courier New from t
he "head" font table. | 241 // This matches the unitsPerEm value for MS Shell Dlg and Courier New from t
he "head" font table. |
242 float unitsPerEm = 2048.0f; | 242 float unitsPerEm = 2048.0f; |
243 return roundf(style()->font().fontDescription().computedSize() * x / unitsPe
rEm); | 243 return roundf(style()->font().fontDescription().computedSize() * x / unitsPe
rEm); |
244 } | 244 } |
245 | 245 |
246 void RenderTextControl::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidt
h, LayoutUnit& maxLogicalWidth) const | 246 void RenderTextControl::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidt
h, LayoutUnit& maxLogicalWidth) const |
247 { | 247 { |
248 // Use average character width. Matches IE. | 248 // Use average character width. Matches IE. |
249 AtomicString family = style()->font().fontDescription().family().family(); | 249 AtomicString family = style()->font().fontDescription().family().family(); |
250 maxLogicalWidth = preferredContentLogicalWidth(const_cast<RenderTextControl*
>(this)->getAvgCharWidth(family)); | 250 maxLogicalWidth = preferredContentLogicalWidth(const_cast<RenderTextControl*
>(this)->getAvgCharWidth(family)); |
251 if (RenderBox* innerTextRenderBox = innerTextElement()->renderBox()) | 251 if (RenderBox* innerEditorRenderBox = innerEditorElement()->renderBox()) |
252 maxLogicalWidth += innerTextRenderBox->paddingStart() + innerTextRenderB
ox->paddingEnd(); | 252 maxLogicalWidth += innerEditorRenderBox->paddingStart() + innerEditorRen
derBox->paddingEnd(); |
253 if (!style()->logicalWidth().isPercent()) | 253 if (!style()->logicalWidth().isPercent()) |
254 minLogicalWidth = maxLogicalWidth; | 254 minLogicalWidth = maxLogicalWidth; |
255 } | 255 } |
256 | 256 |
257 void RenderTextControl::computePreferredLogicalWidths() | 257 void RenderTextControl::computePreferredLogicalWidths() |
258 { | 258 { |
259 ASSERT(preferredLogicalWidthsDirty()); | 259 ASSERT(preferredLogicalWidthsDirty()); |
260 | 260 |
261 m_minPreferredLogicalWidth = 0; | 261 m_minPreferredLogicalWidth = 0; |
262 m_maxPreferredLogicalWidth = 0; | 262 m_maxPreferredLogicalWidth = 0; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 HTMLElement* placeholder = toHTMLTextFormControlElement(node())->placeholder
Element(); | 296 HTMLElement* placeholder = toHTMLTextFormControlElement(node())->placeholder
Element(); |
297 RenderObject* placeholderRenderer = placeholder ? placeholder->renderer() :
0; | 297 RenderObject* placeholderRenderer = placeholder ? placeholder->renderer() :
0; |
298 if (!placeholderRenderer) | 298 if (!placeholderRenderer) |
299 return 0; | 299 return 0; |
300 if (relayoutChildren) | 300 if (relayoutChildren) |
301 layoutScope.setChildNeedsLayout(placeholderRenderer); | 301 layoutScope.setChildNeedsLayout(placeholderRenderer); |
302 return placeholderRenderer; | 302 return placeholderRenderer; |
303 } | 303 } |
304 | 304 |
305 } // namespace WebCore | 305 } // namespace WebCore |
OLD | NEW |