Enable fieldsets to be flexboxes, grids and multicolumn.
[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, RenderStyle&& style)
36     : RenderTextControl(element, WTFMove(style))
37 {
38 }
39
40 RenderTextControlMultiLine::~RenderTextControlMultiLine()
41 {
42     if (textAreaElement().isConnected())
43         textAreaElement().rendererWillBeDestroyed();
44 }
45
46 HTMLTextAreaElement& RenderTextControlMultiLine::textAreaElement() const
47 {
48     return downcast<HTMLTextAreaElement>(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().fontCascade().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 void RenderTextControlMultiLine::layoutExcludedChildren(bool relayoutChildren)
91 {
92     RenderTextControl::layoutExcludedChildren(relayoutChildren);
93     HTMLElement* placeholder = textFormControlElement().placeholderElement();
94     RenderElement* placeholderRenderer = placeholder ? placeholder->renderer() : 0;
95     if (!placeholderRenderer)
96         return;
97     if (is<RenderBox>(placeholderRenderer)) {
98         auto& placeholderBox = downcast<RenderBox>(*placeholderRenderer);
99         placeholderBox.mutableStyle().setLogicalWidth(Length(contentLogicalWidth() - placeholderBox.borderAndPaddingLogicalWidth(), Fixed));
100         placeholderBox.layoutIfNeeded();
101         placeholderBox.setX(borderLeft() + paddingLeft());
102         placeholderBox.setY(borderTop() + paddingTop());
103     }
104 }
105     
106 }