Add WTF::move()
[WebKit-https.git] / Source / WebCore / rendering / RenderTextControlMultiLine.cpp
1 /**
2  * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3  *           (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #include "config.h"
23 #include "RenderTextControlMultiLine.h"
24
25 #include "Frame.h"
26 #include "HTMLNames.h"
27 #include "HTMLTextAreaElement.h"
28 #include "HitTestResult.h"
29 #include "ShadowRoot.h"
30 #include "StyleInheritedData.h"
31 #include "TextControlInnerElements.h"
32
33 namespace WebCore {
34
35 RenderTextControlMultiLine::RenderTextControlMultiLine(HTMLTextAreaElement& element, PassRef<RenderStyle> style)
36     : RenderTextControl(element, WTF::move(style))
37 {
38 }
39
40 RenderTextControlMultiLine::~RenderTextControlMultiLine()
41 {
42     if (textAreaElement().inDocument())
43         textAreaElement().rendererWillBeDestroyed();
44 }
45
46 HTMLTextAreaElement& RenderTextControlMultiLine::textAreaElement() const
47 {
48     return toHTMLTextAreaElement(RenderTextControl::textFormControlElement());
49 }
50
51 bool RenderTextControlMultiLine::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
52 {
53     if (!RenderTextControl::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, hitTestAction))
54         return false;
55
56     if (result.innerNode() == &textAreaElement() || result.innerNode() == innerTextElement())
57         hitInnerTextElement(result, locationInContainer.point(), accumulatedOffset);
58
59     return true;
60 }
61
62 float RenderTextControlMultiLine::getAverageCharWidth()
63 {
64 #if !PLATFORM(IOS)
65     // Since Lucida Grande is the default font, we want this to match the width
66     // of Courier New, the default font for textareas in IE, Firefox and Safari Win.
67     // 1229 is the avgCharWidth value in the OS/2 table for Courier New.
68     if (style().font().firstFamily() == "Lucida Grande")
69         return scaleEmToUnits(1229);
70 #endif
71
72     return RenderTextControl::getAverageCharWidth();
73 }
74
75 LayoutUnit RenderTextControlMultiLine::preferredContentLogicalWidth(float charWidth) const
76 {
77     return ceilf(charWidth * textAreaElement().cols()) + scrollbarThickness();
78 }
79
80 LayoutUnit RenderTextControlMultiLine::computeControlLogicalHeight(LayoutUnit lineHeight, LayoutUnit nonContentHeight) const
81 {
82     return lineHeight * textAreaElement().rows() + nonContentHeight;
83 }
84
85 int RenderTextControlMultiLine::baselinePosition(FontBaseline baselineType, bool firstLine, LineDirectionMode direction, LinePositionMode linePositionMode) const
86 {
87     return RenderBox::baselinePosition(baselineType, firstLine, direction, linePositionMode);
88 }
89
90 PassRef<RenderStyle> RenderTextControlMultiLine::createInnerTextStyle(const RenderStyle* startStyle) const
91 {
92     auto textBlockStyle = RenderStyle::create();
93     textBlockStyle.get().inheritFrom(startStyle);
94     adjustInnerTextStyle(startStyle, &textBlockStyle.get());
95     textBlockStyle.get().setDisplay(BLOCK);
96
97 #if PLATFORM(IOS)
98     // We're adding three extra pixels of padding to line textareas up with text fields.  
99     textBlockStyle.get().setPaddingLeft(Length(3, Fixed));
100     textBlockStyle.get().setPaddingRight(Length(3, Fixed));
101 #endif
102
103     return textBlockStyle;
104 }
105
106 RenderObject* RenderTextControlMultiLine::layoutSpecialExcludedChild(bool relayoutChildren)
107 {
108     RenderObject* placeholderRenderer = RenderTextControl::layoutSpecialExcludedChild(relayoutChildren);
109     if (!placeholderRenderer)
110         return 0;
111     if (!placeholderRenderer->isBox())
112         return placeholderRenderer;
113     RenderBox* placeholderBox = toRenderBox(placeholderRenderer);
114     placeholderBox->style().setLogicalWidth(Length(contentLogicalWidth() - placeholderBox->borderAndPaddingLogicalWidth(), Fixed));
115     placeholderBox->layoutIfNeeded();
116     placeholderBox->setX(borderLeft() + paddingLeft());
117     placeholderBox->setY(borderTop() + paddingTop());
118     return placeholderRenderer;
119 }
120     
121 }