diff options
Diffstat (limited to 'src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp')
-rw-r--r-- | src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp index e19ac0af8..6a1dcf87d 100644 --- a/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp +++ b/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp @@ -27,6 +27,7 @@ #include "HTMLTextAreaElement.h" #include "ChromeClient.h" +#include "CSSValueKeywords.h" #include "Document.h" #include "Event.h" #include "EventNames.h" @@ -106,32 +107,34 @@ int HTMLTextAreaElement::selectionEnd() return toRenderTextControl(renderer())->selectionEnd(); } +static RenderTextControl* rendererAfterUpdateLayout(HTMLTextAreaElement* element) +{ + element->document()->updateLayoutIgnorePendingStylesheets(); + return toRenderTextControl(element->renderer()); +} + void HTMLTextAreaElement::setSelectionStart(int start) { - if (!renderer()) - return; - toRenderTextControl(renderer())->setSelectionStart(start); + if (RenderTextControl* renderer = rendererAfterUpdateLayout(this)) + renderer->setSelectionStart(start); } void HTMLTextAreaElement::setSelectionEnd(int end) { - if (!renderer()) - return; - toRenderTextControl(renderer())->setSelectionEnd(end); + if (RenderTextControl* renderer = rendererAfterUpdateLayout(this)) + renderer->setSelectionEnd(end); } void HTMLTextAreaElement::select() { - if (!renderer()) - return; - toRenderTextControl(renderer())->select(); + if (RenderTextControl* renderer = rendererAfterUpdateLayout(this)) + renderer->select(); } void HTMLTextAreaElement::setSelectionRange(int start, int end) { - if (!renderer()) - return; - toRenderTextControl(renderer())->setSelectionRange(start, end); + if (RenderTextControl* renderer = rendererAfterUpdateLayout(this)) + renderer->setSelectionRange(start, end); } void HTMLTextAreaElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta) @@ -172,6 +175,15 @@ void HTMLTextAreaElement::parseMappedAttribute(MappedAttribute* attr) wrap = SoftWrap; if (wrap != m_wrap) { m_wrap = wrap; + + if (shouldWrapText()) { + addCSSProperty(attr, CSSPropertyWhiteSpace, CSSValuePreWrap); + addCSSProperty(attr, CSSPropertyWordWrap, CSSValueBreakWord); + } else { + addCSSProperty(attr, CSSPropertyWhiteSpace, CSSValuePre); + addCSSProperty(attr, CSSPropertyWordWrap, CSSValueNormal); + } + if (renderer()) renderer()->setNeedsLayoutAndPrefWidthsRecalc(); } @@ -229,7 +241,8 @@ bool HTMLTextAreaElement::isMouseFocusable() const void HTMLTextAreaElement::updateFocusAppearance(bool restorePreviousSelection) { ASSERT(renderer()); - + ASSERT(!document()->childNeedsAndNotInStyleRecalc()); + if (!restorePreviousSelection || m_cachedSelectionStart < 0) { #if ENABLE(ON_FIRST_TEXTAREA_FOCUS_SELECT_ALL) // Devices with trackballs or d-pads may focus on a textarea in route |