| OLD | NEW |
| 1 /** | 1 /** |
| 2 * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2010 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 * Copyright (C) 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 5 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). | 5 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| 11 * | 11 * |
| 12 * This library is distributed in the hope that it will be useful, | 12 * This library is distributed in the hope that it will be useful, |
| 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 * Library General Public License for more details. | 15 * Library General Public License for more details. |
| 16 * | 16 * |
| 17 * You should have received a copy of the GNU Library General Public License | 17 * You should have received a copy of the GNU Library General Public License |
| 18 * along with this library; see the file COPYING.LIB. If not, write to | 18 * along with this library; see the file COPYING.LIB. If not, write to |
| 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 20 * Boston, MA 02110-1301, USA. | 20 * Boston, MA 02110-1301, USA. |
| 21 * | 21 * |
| 22 */ | 22 */ |
| 23 | 23 |
| 24 #include "config.h" | 24 #include "config.h" |
| 25 #include "core/rendering/RenderTextControlSingleLine.h" | 25 #include "core/layout/LayoutTextControlSingleLine.h" |
| 26 | 26 |
| 27 #include "core/CSSValueKeywords.h" | 27 #include "core/CSSValueKeywords.h" |
| 28 #include "core/InputTypeNames.h" | 28 #include "core/InputTypeNames.h" |
| 29 #include "core/dom/shadow/ShadowRoot.h" | 29 #include "core/dom/shadow/ShadowRoot.h" |
| 30 #include "core/editing/FrameSelection.h" | 30 #include "core/editing/FrameSelection.h" |
| 31 #include "core/frame/LocalFrame.h" | 31 #include "core/frame/LocalFrame.h" |
| 32 #include "core/html/shadow/ShadowElementNames.h" | 32 #include "core/html/shadow/ShadowElementNames.h" |
| 33 #include "core/layout/HitTestResult.h" | 33 #include "core/layout/HitTestResult.h" |
| 34 #include "core/layout/Layer.h" | 34 #include "core/layout/Layer.h" |
| 35 #include "core/layout/LayoutTheme.h" | 35 #include "core/layout/LayoutTheme.h" |
| 36 #include "platform/PlatformKeyboardEvent.h" | 36 #include "platform/PlatformKeyboardEvent.h" |
| 37 #include "platform/fonts/SimpleFontData.h" | 37 #include "platform/fonts/SimpleFontData.h" |
| 38 | 38 |
| 39 namespace blink { | 39 namespace blink { |
| 40 | 40 |
| 41 using namespace HTMLNames; | 41 using namespace HTMLNames; |
| 42 | 42 |
| 43 RenderTextControlSingleLine::RenderTextControlSingleLine(HTMLInputElement* eleme
nt) | 43 LayoutTextControlSingleLine::LayoutTextControlSingleLine(HTMLInputElement* eleme
nt) |
| 44 : RenderTextControl(element) | 44 : LayoutTextControl(element) |
| 45 , m_shouldDrawCapsLockIndicator(false) | 45 , m_shouldDrawCapsLockIndicator(false) |
| 46 , m_desiredInnerEditorLogicalHeight(-1) | 46 , m_desiredInnerEditorLogicalHeight(-1) |
| 47 { | 47 { |
| 48 } | 48 } |
| 49 | 49 |
| 50 RenderTextControlSingleLine::~RenderTextControlSingleLine() | 50 LayoutTextControlSingleLine::~LayoutTextControlSingleLine() |
| 51 { | 51 { |
| 52 } | 52 } |
| 53 | 53 |
| 54 inline Element* RenderTextControlSingleLine::containerElement() const | 54 inline Element* LayoutTextControlSingleLine::containerElement() const |
| 55 { | 55 { |
| 56 return inputElement()->userAgentShadowRoot()->getElementById(ShadowElementNa
mes::textFieldContainer()); | 56 return inputElement()->userAgentShadowRoot()->getElementById(ShadowElementNa
mes::textFieldContainer()); |
| 57 } | 57 } |
| 58 | 58 |
| 59 inline Element* RenderTextControlSingleLine::editingViewPortElement() const | 59 inline Element* LayoutTextControlSingleLine::editingViewPortElement() const |
| 60 { | 60 { |
| 61 return inputElement()->userAgentShadowRoot()->getElementById(ShadowElementNa
mes::editingViewPort()); | 61 return inputElement()->userAgentShadowRoot()->getElementById(ShadowElementNa
mes::editingViewPort()); |
| 62 } | 62 } |
| 63 | 63 |
| 64 inline HTMLElement* RenderTextControlSingleLine::innerSpinButtonElement() const | 64 inline HTMLElement* LayoutTextControlSingleLine::innerSpinButtonElement() const |
| 65 { | 65 { |
| 66 return toHTMLElement(inputElement()->userAgentShadowRoot()->getElementById(S
hadowElementNames::spinButton())); | 66 return toHTMLElement(inputElement()->userAgentShadowRoot()->getElementById(S
hadowElementNames::spinButton())); |
| 67 } | 67 } |
| 68 | 68 |
| 69 void RenderTextControlSingleLine::paint(const PaintInfo& paintInfo, const Layout
Point& paintOffset) | 69 void LayoutTextControlSingleLine::paint(const PaintInfo& paintInfo, const Layout
Point& paintOffset) |
| 70 { | 70 { |
| 71 RenderTextControl::paint(paintInfo, paintOffset); | 71 LayoutTextControl::paint(paintInfo, paintOffset); |
| 72 | 72 |
| 73 if (paintInfo.phase == PaintPhaseBlockBackground && m_shouldDrawCapsLockIndi
cator) { | 73 if (paintInfo.phase == PaintPhaseBlockBackground && m_shouldDrawCapsLockIndi
cator) { |
| 74 LayoutRect contentsRect = contentBoxRect(); | 74 LayoutRect contentsRect = contentBoxRect(); |
| 75 | 75 |
| 76 // Center in the block progression direction. | 76 // Center in the block progression direction. |
| 77 if (isHorizontalWritingMode()) | 77 if (isHorizontalWritingMode()) |
| 78 contentsRect.setY((size().height() - contentsRect.height()) / 2); | 78 contentsRect.setY((size().height() - contentsRect.height()) / 2); |
| 79 else | 79 else |
| 80 contentsRect.setX((size().width() - contentsRect.width()) / 2); | 80 contentsRect.setX((size().width() - contentsRect.width()) / 2); |
| 81 | 81 |
| 82 // Convert the rect into the coords used for painting the content | 82 // Convert the rect into the coords used for painting the content |
| 83 contentsRect.moveBy(paintOffset + location()); | 83 contentsRect.moveBy(paintOffset + location()); |
| 84 LayoutTheme::theme().paintCapsLockIndicator(this, paintInfo, pixelSnappe
dIntRect(contentsRect)); | 84 LayoutTheme::theme().paintCapsLockIndicator(this, paintInfo, pixelSnappe
dIntRect(contentsRect)); |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 | 87 |
| 88 LayoutUnit RenderTextControlSingleLine::computeLogicalHeightLimit() const | 88 LayoutUnit LayoutTextControlSingleLine::computeLogicalHeightLimit() const |
| 89 { | 89 { |
| 90 return containerElement() ? contentLogicalHeight() : logicalHeight(); | 90 return containerElement() ? contentLogicalHeight() : logicalHeight(); |
| 91 } | 91 } |
| 92 | 92 |
| 93 void RenderTextControlSingleLine::layout() | 93 void LayoutTextControlSingleLine::layout() |
| 94 { | 94 { |
| 95 SubtreeLayoutScope layoutScope(*this); | 95 SubtreeLayoutScope layoutScope(*this); |
| 96 | 96 |
| 97 // FIXME: We should remove the height-related hacks in layout() and | 97 // FIXME: We should remove the height-related hacks in layout() and |
| 98 // styleDidChange(). We need them because | 98 // styleDidChange(). We need them because |
| 99 // - Center the inner elements vertically if the input height is taller than | 99 // - Center the inner elements vertically if the input height is taller than |
| 100 // the intrinsic height of the inner elements. | 100 // the intrinsic height of the inner elements. |
| 101 // - Shrink the inner elment heights if the input height is samller than the | 101 // - Shrink the inner elment heights if the input height is samller than the |
| 102 // intrinsic heights of the inner elements. | 102 // intrinsic heights of the inner elements. |
| 103 | 103 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 // The container might be taller because of decoration elements. | 145 // The container might be taller because of decoration elements. |
| 146 if (containerRenderer) { | 146 if (containerRenderer) { |
| 147 containerRenderer->layoutIfNeeded(); | 147 containerRenderer->layoutIfNeeded(); |
| 148 LayoutUnit containerLogicalHeight = containerRenderer->logicalHeight(); | 148 LayoutUnit containerLogicalHeight = containerRenderer->logicalHeight(); |
| 149 if (containerLogicalHeight > logicalHeightLimit) { | 149 if (containerLogicalHeight > logicalHeightLimit) { |
| 150 containerRenderer->style()->setLogicalHeight(Length(logicalHeightLim
it, Fixed)); | 150 containerRenderer->style()->setLogicalHeight(Length(logicalHeightLim
it, Fixed)); |
| 151 layoutScope.setNeedsLayout(this); | 151 layoutScope.setNeedsLayout(this); |
| 152 } else if (containerRenderer->logicalHeight() < contentLogicalHeight())
{ | 152 } else if (containerRenderer->logicalHeight() < contentLogicalHeight())
{ |
| 153 containerRenderer->style()->setLogicalHeight(Length(contentLogicalHe
ight(), Fixed)); | 153 containerRenderer->style()->setLogicalHeight(Length(contentLogicalHe
ight(), Fixed)); |
| 154 layoutScope.setNeedsLayout(this); | 154 layoutScope.setNeedsLayout(this); |
| 155 } else | 155 } else { |
| 156 containerRenderer->style()->setLogicalHeight(Length(containerLogical
Height, Fixed)); | 156 containerRenderer->style()->setLogicalHeight(Length(containerLogical
Height, Fixed)); |
| 157 } |
| 157 } | 158 } |
| 158 | 159 |
| 159 // If we need another layout pass, we have changed one of children's height
so we need to relayout them. | 160 // If we need another layout pass, we have changed one of children's height
so we need to relayout them. |
| 160 if (needsLayout()) | 161 if (needsLayout()) |
| 161 RenderBlockFlow::layoutBlock(true); | 162 RenderBlockFlow::layoutBlock(true); |
| 162 | 163 |
| 163 // Center the child block in the block progression direction (vertical cente
ring for horizontal text fields). | 164 // Center the child block in the block progression direction (vertical cente
ring for horizontal text fields). |
| 164 if (!container && innerEditorRenderer && innerEditorRenderer->size().height(
) != contentLogicalHeight()) { | 165 if (!container && innerEditorRenderer && innerEditorRenderer->size().height(
) != contentLogicalHeight()) { |
| 165 LayoutUnit logicalHeightDiff = innerEditorRenderer->logicalHeight() - co
ntentLogicalHeight(); | 166 LayoutUnit logicalHeightDiff = innerEditorRenderer->logicalHeight() - co
ntentLogicalHeight(); |
| 166 innerEditorRenderer->setLogicalTop(innerEditorRenderer->logicalTop() - (
logicalHeightDiff / 2 + layoutMod(logicalHeightDiff, 2))); | 167 innerEditorRenderer->setLogicalTop(innerEditorRenderer->logicalTop() - (
logicalHeightDiff / 2 + layoutMod(logicalHeightDiff, 2))); |
| 167 } else | 168 } else { |
| 168 centerContainerIfNeeded(containerRenderer); | 169 centerContainerIfNeeded(containerRenderer); |
| 170 } |
| 169 | 171 |
| 170 HTMLElement* placeholderElement = inputElement()->placeholderElement(); | 172 HTMLElement* placeholderElement = inputElement()->placeholderElement(); |
| 171 if (RenderBox* placeholderBox = placeholderElement ? placeholderElement->ren
derBox() : 0) { | 173 if (RenderBox* placeholderBox = placeholderElement ? placeholderElement->ren
derBox() : 0) { |
| 172 LayoutSize innerEditorSize; | 174 LayoutSize innerEditorSize; |
| 173 | 175 |
| 174 if (innerEditorRenderer) | 176 if (innerEditorRenderer) |
| 175 innerEditorSize = innerEditorRenderer->size(); | 177 innerEditorSize = innerEditorRenderer->size(); |
| 176 placeholderBox->style()->setWidth(Length(innerEditorSize.width() - place
holderBox->borderAndPaddingWidth(), Fixed)); | 178 placeholderBox->style()->setWidth(Length(innerEditorSize.width() - place
holderBox->borderAndPaddingWidth(), Fixed)); |
| 177 placeholderBox->style()->setHeight(Length(innerEditorSize.height() - pla
ceholderBox->borderAndPaddingHeight(), Fixed)); | 179 placeholderBox->style()->setHeight(Length(innerEditorSize.height() - pla
ceholderBox->borderAndPaddingHeight(), Fixed)); |
| 178 bool neededLayout = placeholderBox->needsLayout(); | 180 bool neededLayout = placeholderBox->needsLayout(); |
| 179 placeholderBox->layoutIfNeeded(); | 181 placeholderBox->layoutIfNeeded(); |
| 180 LayoutPoint textOffset; | 182 LayoutPoint textOffset; |
| 181 if (innerEditorRenderer) | 183 if (innerEditorRenderer) |
| 182 textOffset = innerEditorRenderer->location(); | 184 textOffset = innerEditorRenderer->location(); |
| 183 if (editingViewPortElement() && editingViewPortElement()->renderBox()) | 185 if (editingViewPortElement() && editingViewPortElement()->renderBox()) |
| 184 textOffset += toLayoutSize(editingViewPortElement()->renderBox()->lo
cation()); | 186 textOffset += toLayoutSize(editingViewPortElement()->renderBox()->lo
cation()); |
| 185 if (containerRenderer) | 187 if (containerRenderer) |
| 186 textOffset += toLayoutSize(containerRenderer->location()); | 188 textOffset += toLayoutSize(containerRenderer->location()); |
| 187 placeholderBox->setLocation(textOffset); | 189 placeholderBox->setLocation(textOffset); |
| 188 | 190 |
| 189 // The placeholder gets layout last, after the parent text control and i
ts other children, | 191 // The placeholder gets layout last, after the parent text control and i
ts other children, |
| 190 // so in order to get the correct overflow from the placeholder we need
to recompute it now. | 192 // so in order to get the correct overflow from the placeholder we need
to recompute it now. |
| 191 if (neededLayout) | 193 if (neededLayout) |
| 192 computeOverflow(clientLogicalBottom()); | 194 computeOverflow(clientLogicalBottom()); |
| 193 } | 195 } |
| 194 } | 196 } |
| 195 | 197 |
| 196 bool RenderTextControlSingleLine::nodeAtPoint(const HitTestRequest& request, Hit
TestResult& result, const HitTestLocation& locationInContainer, const LayoutPoin
t& accumulatedOffset, HitTestAction hitTestAction) | 198 bool LayoutTextControlSingleLine::nodeAtPoint(const HitTestRequest& request, Hit
TestResult& result, const HitTestLocation& locationInContainer, const LayoutPoin
t& accumulatedOffset, HitTestAction hitTestAction) |
| 197 { | 199 { |
| 198 if (!RenderTextControl::nodeAtPoint(request, result, locationInContainer, ac
cumulatedOffset, hitTestAction)) | 200 if (!LayoutTextControl::nodeAtPoint(request, result, locationInContainer, ac
cumulatedOffset, hitTestAction)) |
| 199 return false; | 201 return false; |
| 200 | 202 |
| 201 // Say that we hit the inner text element if | 203 // Say that we hit the inner text element if |
| 202 // - we hit a node inside the inner text element, | 204 // - we hit a node inside the inner text element, |
| 203 // - we hit the <input> element (e.g. we're over the border or padding), or | 205 // - we hit the <input> element (e.g. we're over the border or padding), or |
| 204 // - we hit regions not in any decoration buttons. | 206 // - we hit regions not in any decoration buttons. |
| 205 Element* container = containerElement(); | 207 Element* container = containerElement(); |
| 206 if (result.innerNode()->isDescendantOf(innerEditorElement()) || result.inner
Node() == node() || (container && container == result.innerNode())) { | 208 if (result.innerNode()->isDescendantOf(innerEditorElement()) || result.inner
Node() == node() || (container && container == result.innerNode())) { |
| 207 LayoutPoint pointInParent = locationInContainer.point(); | 209 LayoutPoint pointInParent = locationInContainer.point(); |
| 208 if (container && editingViewPortElement()) { | 210 if (container && editingViewPortElement()) { |
| 209 if (editingViewPortElement()->renderBox()) | 211 if (editingViewPortElement()->renderBox()) |
| 210 pointInParent -= toLayoutSize(editingViewPortElement()->renderBo
x()->location()); | 212 pointInParent -= toLayoutSize(editingViewPortElement()->renderBo
x()->location()); |
| 211 if (container->renderBox()) | 213 if (container->renderBox()) |
| 212 pointInParent -= toLayoutSize(container->renderBox()->location()
); | 214 pointInParent -= toLayoutSize(container->renderBox()->location()
); |
| 213 } | 215 } |
| 214 hitInnerEditorElement(result, pointInParent, accumulatedOffset); | 216 hitInnerEditorElement(result, pointInParent, accumulatedOffset); |
| 215 } | 217 } |
| 216 return true; | 218 return true; |
| 217 } | 219 } |
| 218 | 220 |
| 219 void RenderTextControlSingleLine::styleDidChange(StyleDifference diff, const Lay
outStyle* oldStyle) | 221 void LayoutTextControlSingleLine::styleDidChange(StyleDifference diff, const Lay
outStyle* oldStyle) |
| 220 { | 222 { |
| 221 m_desiredInnerEditorLogicalHeight = -1; | 223 m_desiredInnerEditorLogicalHeight = -1; |
| 222 RenderTextControl::styleDidChange(diff, oldStyle); | 224 LayoutTextControl::styleDidChange(diff, oldStyle); |
| 223 | 225 |
| 224 // We may have set the width and the height in the old style in layout(). | 226 // We may have set the width and the height in the old style in layout(). |
| 225 // Reset them now to avoid getting a spurious layout hint. | 227 // Reset them now to avoid getting a spurious layout hint. |
| 226 Element* viewPort = editingViewPortElement(); | 228 Element* viewPort = editingViewPortElement(); |
| 227 if (LayoutObject* viewPortRenderer = viewPort ? viewPort->renderer() : 0) { | 229 if (LayoutObject* viewPortRenderer = viewPort ? viewPort->renderer() : 0) { |
| 228 viewPortRenderer->style()->setHeight(Length()); | 230 viewPortRenderer->style()->setHeight(Length()); |
| 229 viewPortRenderer->style()->setWidth(Length()); | 231 viewPortRenderer->style()->setWidth(Length()); |
| 230 } | 232 } |
| 231 Element* container = containerElement(); | 233 Element* container = containerElement(); |
| 232 if (LayoutObject* containerRenderer = container ? container->renderer() : 0)
{ | 234 if (LayoutObject* containerRenderer = container ? container->renderer() : 0)
{ |
| 233 containerRenderer->style()->setHeight(Length()); | 235 containerRenderer->style()->setHeight(Length()); |
| 234 containerRenderer->style()->setWidth(Length()); | 236 containerRenderer->style()->setWidth(Length()); |
| 235 } | 237 } |
| 236 LayoutObject* innerEditorRenderer = innerEditorElement()->renderer(); | 238 LayoutObject* innerEditorRenderer = innerEditorElement()->renderer(); |
| 237 if (innerEditorRenderer && diff.needsFullLayout()) | 239 if (innerEditorRenderer && diff.needsFullLayout()) |
| 238 innerEditorRenderer->setNeedsLayoutAndFullPaintInvalidation(); | 240 innerEditorRenderer->setNeedsLayoutAndFullPaintInvalidation(); |
| 239 if (HTMLElement* placeholder = inputElement()->placeholderElement()) | 241 if (HTMLElement* placeholder = inputElement()->placeholderElement()) |
| 240 placeholder->setInlineStyleProperty(CSSPropertyTextOverflow, textShouldB
eTruncated() ? CSSValueEllipsis : CSSValueClip); | 242 placeholder->setInlineStyleProperty(CSSPropertyTextOverflow, textShouldB
eTruncated() ? CSSValueEllipsis : CSSValueClip); |
| 241 setHasOverflowClip(false); | 243 setHasOverflowClip(false); |
| 242 } | 244 } |
| 243 | 245 |
| 244 void RenderTextControlSingleLine::capsLockStateMayHaveChanged() | 246 void LayoutTextControlSingleLine::capsLockStateMayHaveChanged() |
| 245 { | 247 { |
| 246 if (!node()) | 248 if (!node()) |
| 247 return; | 249 return; |
| 248 | 250 |
| 249 // Only draw the caps lock indicator if these things are true: | 251 // Only draw the caps lock indicator if these things are true: |
| 250 // 1) The field is a password field | 252 // 1) The field is a password field |
| 251 // 2) The frame is active | 253 // 2) The frame is active |
| 252 // 3) The element is focused | 254 // 3) The element is focused |
| 253 // 4) The caps lock is on | 255 // 4) The caps lock is on |
| 254 bool shouldDrawCapsLockIndicator = false; | 256 bool shouldDrawCapsLockIndicator = false; |
| 255 | 257 |
| 256 if (LocalFrame* frame = document().frame()) | 258 if (LocalFrame* frame = document().frame()) |
| 257 shouldDrawCapsLockIndicator = inputElement()->type() == InputTypeNames::
password && frame->selection().isFocusedAndActive() && document().focusedElement
() == node() && PlatformKeyboardEvent::currentCapsLockState(); | 259 shouldDrawCapsLockIndicator = inputElement()->type() == InputTypeNames::
password && frame->selection().isFocusedAndActive() && document().focusedElement
() == node() && PlatformKeyboardEvent::currentCapsLockState(); |
| 258 | 260 |
| 259 if (shouldDrawCapsLockIndicator != m_shouldDrawCapsLockIndicator) { | 261 if (shouldDrawCapsLockIndicator != m_shouldDrawCapsLockIndicator) { |
| 260 m_shouldDrawCapsLockIndicator = shouldDrawCapsLockIndicator; | 262 m_shouldDrawCapsLockIndicator = shouldDrawCapsLockIndicator; |
| 261 setShouldDoFullPaintInvalidation(); | 263 setShouldDoFullPaintInvalidation(); |
| 262 } | 264 } |
| 263 } | 265 } |
| 264 | 266 |
| 265 bool RenderTextControlSingleLine::hasControlClip() const | 267 bool LayoutTextControlSingleLine::hasControlClip() const |
| 266 { | 268 { |
| 267 // Apply control clip for text fields with decorations. | 269 // Apply control clip for text fields with decorations. |
| 268 return !!containerElement(); | 270 return !!containerElement(); |
| 269 } | 271 } |
| 270 | 272 |
| 271 LayoutRect RenderTextControlSingleLine::controlClipRect(const LayoutPoint& addit
ionalOffset) const | 273 LayoutRect LayoutTextControlSingleLine::controlClipRect(const LayoutPoint& addit
ionalOffset) const |
| 272 { | 274 { |
| 273 ASSERT(hasControlClip()); | 275 ASSERT(hasControlClip()); |
| 274 LayoutRect clipRect = contentBoxRect(); | 276 LayoutRect clipRect = contentBoxRect(); |
| 275 if (containerElement()->renderBox()) | 277 if (containerElement()->renderBox()) |
| 276 clipRect = unionRect(clipRect, containerElement()->renderBox()->frameRec
t()); | 278 clipRect = unionRect(clipRect, containerElement()->renderBox()->frameRec
t()); |
| 277 clipRect.moveBy(additionalOffset); | 279 clipRect.moveBy(additionalOffset); |
| 278 return clipRect; | 280 return clipRect; |
| 279 } | 281 } |
| 280 | 282 |
| 281 float RenderTextControlSingleLine::getAvgCharWidth(AtomicString family) | 283 float LayoutTextControlSingleLine::getAvgCharWidth(AtomicString family) |
| 282 { | 284 { |
| 283 // Since Lucida Grande is the default font, we want this to match the width | 285 // Since Lucida Grande is the default font, we want this to match the width |
| 284 // of MS Shell Dlg, the default font for textareas in Firefox, Safari Win an
d | 286 // of MS Shell Dlg, the default font for textareas in Firefox, Safari Win an
d |
| 285 // IE for some encodings (in IE, the default font is encoding specific). | 287 // IE for some encodings (in IE, the default font is encoding specific). |
| 286 // 901 is the avgCharWidth value in the OS/2 table for MS Shell Dlg. | 288 // 901 is the avgCharWidth value in the OS/2 table for MS Shell Dlg. |
| 287 if (family == "Lucida Grande") | 289 if (family == "Lucida Grande") |
| 288 return scaleEmToUnits(901); | 290 return scaleEmToUnits(901); |
| 289 | 291 |
| 290 return RenderTextControl::getAvgCharWidth(family); | 292 return LayoutTextControl::getAvgCharWidth(family); |
| 291 } | 293 } |
| 292 | 294 |
| 293 LayoutUnit RenderTextControlSingleLine::preferredContentLogicalWidth(float charW
idth) const | 295 LayoutUnit LayoutTextControlSingleLine::preferredContentLogicalWidth(float charW
idth) const |
| 294 { | 296 { |
| 295 int factor; | 297 int factor; |
| 296 bool includesDecoration = inputElement()->sizeShouldIncludeDecoration(factor
); | 298 bool includesDecoration = inputElement()->sizeShouldIncludeDecoration(factor
); |
| 297 if (factor <= 0) | 299 if (factor <= 0) |
| 298 factor = 20; | 300 factor = 20; |
| 299 | 301 |
| 300 LayoutUnit result = LayoutUnit::fromFloatCeil(charWidth * factor); | 302 LayoutUnit result = LayoutUnit::fromFloatCeil(charWidth * factor); |
| 301 | 303 |
| 302 float maxCharWidth = 0.f; | 304 float maxCharWidth = 0.f; |
| 303 AtomicString family = style()->font().fontDescription().family().family(); | 305 AtomicString family = style()->font().fontDescription().family().family(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 320 result += spinRenderer->borderAndPaddingLogicalWidth(); | 322 result += spinRenderer->borderAndPaddingLogicalWidth(); |
| 321 // Since the width of spinRenderer is not calculated yet, spinRender
er->logicalWidth() returns 0. | 323 // Since the width of spinRenderer is not calculated yet, spinRender
er->logicalWidth() returns 0. |
| 322 // So computedStyle()->logicalWidth() is used instead. | 324 // So computedStyle()->logicalWidth() is used instead. |
| 323 result += spinButton->computedStyle()->logicalWidth().value(); | 325 result += spinButton->computedStyle()->logicalWidth().value(); |
| 324 } | 326 } |
| 325 } | 327 } |
| 326 | 328 |
| 327 return result; | 329 return result; |
| 328 } | 330 } |
| 329 | 331 |
| 330 LayoutUnit RenderTextControlSingleLine::computeControlLogicalHeight(LayoutUnit l
ineHeight, LayoutUnit nonContentHeight) const | 332 LayoutUnit LayoutTextControlSingleLine::computeControlLogicalHeight(LayoutUnit l
ineHeight, LayoutUnit nonContentHeight) const |
| 331 { | 333 { |
| 332 return lineHeight + nonContentHeight; | 334 return lineHeight + nonContentHeight; |
| 333 } | 335 } |
| 334 | 336 |
| 335 PassRefPtr<LayoutStyle> RenderTextControlSingleLine::createInnerEditorStyle(cons
t LayoutStyle& startStyle) const | 337 PassRefPtr<LayoutStyle> LayoutTextControlSingleLine::createInnerEditorStyle(cons
t LayoutStyle& startStyle) const |
| 336 { | 338 { |
| 337 RefPtr<LayoutStyle> textBlockStyle = LayoutStyle::create(); | 339 RefPtr<LayoutStyle> textBlockStyle = LayoutStyle::create(); |
| 338 textBlockStyle->inheritFrom(startStyle); | 340 textBlockStyle->inheritFrom(startStyle); |
| 339 adjustInnerEditorStyle(*textBlockStyle); | 341 adjustInnerEditorStyle(*textBlockStyle); |
| 340 | 342 |
| 341 textBlockStyle->setWhiteSpace(PRE); | 343 textBlockStyle->setWhiteSpace(PRE); |
| 342 textBlockStyle->setOverflowWrap(NormalOverflowWrap); | 344 textBlockStyle->setOverflowWrap(NormalOverflowWrap); |
| 343 textBlockStyle->setOverflowX(OHIDDEN); | 345 textBlockStyle->setOverflowX(OHIDDEN); |
| 344 textBlockStyle->setOverflowY(OHIDDEN); | 346 textBlockStyle->setOverflowY(OHIDDEN); |
| 345 textBlockStyle->setTextOverflow(textShouldBeTruncated() ? TextOverflowEllips
is : TextOverflowClip); | 347 textBlockStyle->setTextOverflow(textShouldBeTruncated() ? TextOverflowEllips
is : TextOverflowClip); |
| 346 | 348 |
| 347 if (m_desiredInnerEditorLogicalHeight >= 0) | 349 if (m_desiredInnerEditorLogicalHeight >= 0) |
| 348 textBlockStyle->setLogicalHeight(Length(m_desiredInnerEditorLogicalHeigh
t, Fixed)); | 350 textBlockStyle->setLogicalHeight(Length(m_desiredInnerEditorLogicalHeigh
t, Fixed)); |
| 349 // Do not allow line-height to be smaller than our default. | 351 // Do not allow line-height to be smaller than our default. |
| 350 if (textBlockStyle->fontMetrics().lineSpacing() > lineHeight(true, Horizonta
lLine, PositionOfInteriorLineBoxes)) | 352 if (textBlockStyle->fontMetrics().lineSpacing() > lineHeight(true, Horizonta
lLine, PositionOfInteriorLineBoxes)) |
| 351 textBlockStyle->setLineHeight(LayoutStyle::initialLineHeight()); | 353 textBlockStyle->setLineHeight(LayoutStyle::initialLineHeight()); |
| 352 | 354 |
| 353 textBlockStyle->setDisplay(BLOCK); | 355 textBlockStyle->setDisplay(BLOCK); |
| 354 textBlockStyle->setUnique(); | 356 textBlockStyle->setUnique(); |
| 355 | 357 |
| 356 if (inputElement()->shouldRevealPassword()) | 358 if (inputElement()->shouldRevealPassword()) |
| 357 textBlockStyle->setTextSecurity(TSNONE); | 359 textBlockStyle->setTextSecurity(TSNONE); |
| 358 | 360 |
| 359 return textBlockStyle.release(); | 361 return textBlockStyle.release(); |
| 360 } | 362 } |
| 361 | 363 |
| 362 bool RenderTextControlSingleLine::textShouldBeTruncated() const | 364 bool LayoutTextControlSingleLine::textShouldBeTruncated() const |
| 363 { | 365 { |
| 364 return document().focusedElement() != node() && style()->textOverflow() == T
extOverflowEllipsis; | 366 return document().focusedElement() != node() && style()->textOverflow() == T
extOverflowEllipsis; |
| 365 } | 367 } |
| 366 | 368 |
| 367 void RenderTextControlSingleLine::autoscroll(const IntPoint& position) | 369 void LayoutTextControlSingleLine::autoscroll(const IntPoint& position) |
| 368 { | 370 { |
| 369 RenderBox* renderer = innerEditorElement()->renderBox(); | 371 RenderBox* renderer = innerEditorElement()->renderBox(); |
| 370 if (!renderer) | 372 if (!renderer) |
| 371 return; | 373 return; |
| 372 | 374 |
| 373 renderer->autoscroll(position); | 375 renderer->autoscroll(position); |
| 374 } | 376 } |
| 375 | 377 |
| 376 LayoutUnit RenderTextControlSingleLine::scrollWidth() const | 378 LayoutUnit LayoutTextControlSingleLine::scrollWidth() const |
| 377 { | 379 { |
| 378 if (RenderBox* inner = innerEditorElement() ? innerEditorElement()->renderBo
x() : 0) { | 380 if (RenderBox* inner = innerEditorElement() ? innerEditorElement()->renderBo
x() : 0) { |
| 379 // Adjust scrollWidth to inculde input element horizontal paddings and | 381 // Adjust scrollWidth to inculde input element horizontal paddings and |
| 380 // decoration width | 382 // decoration width |
| 381 LayoutUnit adjustment = clientWidth() - inner->clientWidth(); | 383 LayoutUnit adjustment = clientWidth() - inner->clientWidth(); |
| 382 return innerEditorElement()->scrollWidth() + adjustment; | 384 return innerEditorElement()->scrollWidth() + adjustment; |
| 383 } | 385 } |
| 384 return RenderBlockFlow::scrollWidth(); | 386 return RenderBlockFlow::scrollWidth(); |
| 385 } | 387 } |
| 386 | 388 |
| 387 LayoutUnit RenderTextControlSingleLine::scrollHeight() const | 389 LayoutUnit LayoutTextControlSingleLine::scrollHeight() const |
| 388 { | 390 { |
| 389 if (RenderBox* inner = innerEditorElement() ? innerEditorElement()->renderBo
x() : 0) { | 391 if (RenderBox* inner = innerEditorElement() ? innerEditorElement()->renderBo
x() : 0) { |
| 390 // Adjust scrollHeight to include input element vertical paddings and | 392 // Adjust scrollHeight to include input element vertical paddings and |
| 391 // decoration height | 393 // decoration height |
| 392 LayoutUnit adjustment = clientHeight() - inner->clientHeight(); | 394 LayoutUnit adjustment = clientHeight() - inner->clientHeight(); |
| 393 return innerEditorElement()->scrollHeight() + adjustment; | 395 return innerEditorElement()->scrollHeight() + adjustment; |
| 394 } | 396 } |
| 395 return RenderBlockFlow::scrollHeight(); | 397 return RenderBlockFlow::scrollHeight(); |
| 396 } | 398 } |
| 397 | 399 |
| 398 LayoutUnit RenderTextControlSingleLine::scrollLeft() const | 400 LayoutUnit LayoutTextControlSingleLine::scrollLeft() const |
| 399 { | 401 { |
| 400 if (innerEditorElement()) | 402 if (innerEditorElement()) |
| 401 return innerEditorElement()->scrollLeft(); | 403 return innerEditorElement()->scrollLeft(); |
| 402 return RenderBlockFlow::scrollLeft(); | 404 return RenderBlockFlow::scrollLeft(); |
| 403 } | 405 } |
| 404 | 406 |
| 405 LayoutUnit RenderTextControlSingleLine::scrollTop() const | 407 LayoutUnit LayoutTextControlSingleLine::scrollTop() const |
| 406 { | 408 { |
| 407 if (innerEditorElement()) | 409 if (innerEditorElement()) |
| 408 return innerEditorElement()->scrollTop(); | 410 return innerEditorElement()->scrollTop(); |
| 409 return RenderBlockFlow::scrollTop(); | 411 return RenderBlockFlow::scrollTop(); |
| 410 } | 412 } |
| 411 | 413 |
| 412 void RenderTextControlSingleLine::setScrollLeft(LayoutUnit newLeft) | 414 void LayoutTextControlSingleLine::setScrollLeft(LayoutUnit newLeft) |
| 413 { | 415 { |
| 414 if (innerEditorElement()) | 416 if (innerEditorElement()) |
| 415 innerEditorElement()->setScrollLeft(newLeft); | 417 innerEditorElement()->setScrollLeft(newLeft); |
| 416 } | 418 } |
| 417 | 419 |
| 418 void RenderTextControlSingleLine::setScrollTop(LayoutUnit newTop) | 420 void LayoutTextControlSingleLine::setScrollTop(LayoutUnit newTop) |
| 419 { | 421 { |
| 420 if (innerEditorElement()) | 422 if (innerEditorElement()) |
| 421 innerEditorElement()->setScrollTop(newTop); | 423 innerEditorElement()->setScrollTop(newTop); |
| 422 } | 424 } |
| 423 | 425 |
| 424 HTMLInputElement* RenderTextControlSingleLine::inputElement() const | 426 HTMLInputElement* LayoutTextControlSingleLine::inputElement() const |
| 425 { | 427 { |
| 426 return toHTMLInputElement(node()); | 428 return toHTMLInputElement(node()); |
| 427 } | 429 } |
| 428 | 430 |
| 429 } | 431 } |
| OLD | NEW |