diff options
author | Feng Qian <> | 2009-04-10 18:11:29 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-04-10 18:11:29 -0700 |
commit | 8f72e70a9fd78eec56623b3a62e68f16b7b27e28 (patch) | |
tree | 181bf9a400c30a1bf34ea6d72560e8d00111d549 /WebCore/rendering/RenderTextControl.cpp | |
parent | 7ed56f225e0ade046e1c2178977f72b2d896f196 (diff) | |
download | external_webkit-8f72e70a9fd78eec56623b3a62e68f16b7b27e28.zip external_webkit-8f72e70a9fd78eec56623b3a62e68f16b7b27e28.tar.gz external_webkit-8f72e70a9fd78eec56623b3a62e68f16b7b27e28.tar.bz2 |
AI 145796: Land the WebKit merge @r42026.
Automated import of CL 145796
Diffstat (limited to 'WebCore/rendering/RenderTextControl.cpp')
-rw-r--r-- | WebCore/rendering/RenderTextControl.cpp | 109 |
1 files changed, 34 insertions, 75 deletions
diff --git a/WebCore/rendering/RenderTextControl.cpp b/WebCore/rendering/RenderTextControl.cpp index 642ef1f..38d689b 100644 --- a/WebCore/rendering/RenderTextControl.cpp +++ b/WebCore/rendering/RenderTextControl.cpp @@ -31,17 +31,14 @@ #include "HTMLFormControlElement.h" #include "HTMLNames.h" #include "HitTestResult.h" +#include "RenderLayer.h" #include "RenderText.h" #include "ScrollbarTheme.h" #include "SelectionController.h" -#include "TextControlInnerElements.h" #include "Text.h" +#include "TextControlInnerElements.h" #include "TextIterator.h" -#ifdef ANDROID_LAYOUT -#include "FrameView.h" -#endif - using namespace std; namespace WebCore { @@ -84,12 +81,12 @@ RenderTextControl::~RenderTextControl() m_innerText->detach(); } -void RenderTextControl::styleDidChange(RenderStyle::Diff diff, const RenderStyle* oldStyle) +void RenderTextControl::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) { RenderBlock::styleDidChange(diff, oldStyle); if (m_innerText) { - RenderBlock* textBlockRenderer = static_cast<RenderBlock*>(m_innerText->renderer()); + RenderBlock* textBlockRenderer = toRenderBlock(m_innerText->renderer()); RefPtr<RenderStyle> textBlockStyle = createInnerTextStyle(style()); // We may have set the width and the height in the old style in layout(). // Reset them now to avoid getting a spurious layout hint. @@ -102,18 +99,34 @@ void RenderTextControl::styleDidChange(RenderStyle::Diff diff, const RenderStyle } } - setHasOverflowClip(false); setReplaced(isInline()); } +static inline bool updateUserModifyProperty(Node* node, RenderStyle* style) +{ + bool isEnabled = true; + bool isReadOnlyControl = false; + + if (node->isElementNode()) { + FormControlElement* formControlElement = toFormControlElement(static_cast<Element*>(node)); + ASSERT(formControlElement); + + isEnabled = formControlElement->isEnabled(); + isReadOnlyControl = formControlElement->isReadOnlyControl(); + } + + style->setUserModify((isReadOnlyControl || !isEnabled) ? READ_ONLY : READ_WRITE_PLAINTEXT_ONLY); + return !isEnabled; +} + void RenderTextControl::adjustInnerTextStyle(const RenderStyle* startStyle, RenderStyle* textBlockStyle) const { // The inner block, if present, always has its direction set to LTR, // so we need to inherit the direction from the element. textBlockStyle->setDirection(style()->direction()); - textBlockStyle->setUserModify((node()->isReadOnlyControl() || !node()->isEnabled()) ? READ_ONLY : READ_WRITE_PLAINTEXT_ONLY); - if (!node()->isEnabled()) + bool disabled = updateUserModifyProperty(node(), textBlockStyle); + if (disabled) textBlockStyle->setColor(disabledTextColor(textBlockStyle->color(), startStyle->backgroundColor())); } @@ -142,7 +155,7 @@ int RenderTextControl::textBlockWidth() const void RenderTextControl::updateFromElement() { - m_innerText->renderer()->style()->setUserModify((node()->isReadOnlyControl() || !node()->isEnabled()) ? READ_ONLY : READ_WRITE_PLAINTEXT_ONLY); + updateUserModifyProperty(node(), m_innerText->renderer()->style()); } void RenderTextControl::setInnerTextValue(const String& innerTextValue) @@ -236,7 +249,7 @@ void RenderTextControl::setSelectionRange(int start, int end) ASSERT(startPosition.isNotNull() && endPosition.isNotNull()); ASSERT(startPosition.deepEquivalent().node()->shadowAncestorNode() == node() && endPosition.deepEquivalent().node()->shadowAncestorNode() == node()); - Selection newSelection = Selection(startPosition, endPosition); + VisibleSelection newSelection = VisibleSelection(startPosition, endPosition); if (Frame* frame = document()->frame()) frame->selection()->setSelection(newSelection); @@ -247,10 +260,10 @@ void RenderTextControl::setSelectionRange(int start, int end) frame->setSelectionGranularity(CharacterGranularity); } -Selection RenderTextControl::selection(int start, int end) const +VisibleSelection RenderTextControl::selection(int start, int end) const { - return Selection(VisiblePosition(m_innerText.get(), start, VP_DEFAULT_AFFINITY), - VisiblePosition(m_innerText.get(), end, VP_DEFAULT_AFFINITY)); + return VisibleSelection(VisiblePosition(m_innerText.get(), start, VP_DEFAULT_AFFINITY), + VisiblePosition(m_innerText.get(), end, VP_DEFAULT_AFFINITY)); } VisiblePosition RenderTextControl::visiblePositionForIndex(int index) @@ -279,7 +292,7 @@ int RenderTextControl::indexForVisiblePosition(const VisiblePosition& pos) RefPtr<Range> range = Range::create(document()); range->setStart(m_innerText.get(), 0, ec); ASSERT(!ec); - range->setEnd(indexPosition.node(), indexPosition.offset(), ec); + range->setEnd(indexPosition.node(), indexPosition.m_offset, ec); ASSERT(!ec); return TextIterator::rangeLength(range.get()); } @@ -367,7 +380,7 @@ String RenderTextControl::textWithHardLineBreaks() if (!renderer) return ""; - InlineBox* box = renderer->isText() ? toRenderText(renderer)->firstTextBox() : renderer->inlineBoxWrapper(); + InlineBox* box = renderer->isText() ? toRenderText(renderer)->firstTextBox() : toRenderBox(renderer)->inlineBoxWrapper(); if (!box) return ""; @@ -434,15 +447,16 @@ void RenderTextControl::calcHeight() setHeight(height() + paddingTop() + paddingBottom() + borderTop() + borderBottom()); // We are able to have a horizontal scrollbar if the overflow style is scroll, or if its auto and there's no word wrap. - if (m_innerText->renderer()->style()->overflowX() == OSCROLL || (m_innerText->renderer()->style()->overflowX() == OAUTO && m_innerText->renderer()->style()->wordWrap() == NormalWordWrap)) + if (style()->overflowX() == OSCROLL || (style()->overflowX() == OAUTO && m_innerText->renderer()->style()->wordWrap() == NormalWordWrap)) setHeight(height() + scrollbarThickness()); RenderBlock::calcHeight(); } -void RenderTextControl::hitInnerTextBlock(HitTestResult& result, int xPos, int yPos, int tx, int ty) +void RenderTextControl::hitInnerTextElement(HitTestResult& result, int xPos, int yPos, int tx, int ty) { result.setInnerNode(m_innerText.get()); + result.setInnerNonSharedNode(m_innerText.get()); result.setLocalPoint(IntPoint(xPos - tx - x() - m_innerText->renderBox()->x(), yPos - ty - y() - m_innerText->renderBox()->y())); } @@ -517,7 +531,7 @@ void RenderTextControl::selectionChanged(bool userTriggered) if (Frame* frame = document()->frame()) { if (frame->selection()->isRange() && userTriggered) - static_cast<EventTargetNode*>(node())->dispatchEventForType(eventNames().selectEvent, true, false); + node()->dispatchEventForType(eventNames().selectEvent, true, false); } } @@ -526,61 +540,6 @@ void RenderTextControl::addFocusRingRects(GraphicsContext* graphicsContext, int graphicsContext->addFocusRingRect(IntRect(tx, ty, width(), height())); } -void RenderTextControl::autoscroll() -{ - RenderLayer* layer = m_innerText->renderBox()->layer(); - if (layer) - layer->autoscroll(); -} - -int RenderTextControl::scrollWidth() const -{ - if (m_innerText) - return m_innerText->scrollWidth(); - return RenderBlock::scrollWidth(); -} - -int RenderTextControl::scrollHeight() const -{ - if (m_innerText) - return m_innerText->scrollHeight(); - return RenderBlock::scrollHeight(); -} - -int RenderTextControl::scrollLeft() const -{ - if (m_innerText) - return m_innerText->scrollLeft(); - return RenderBlock::scrollLeft(); -} - -int RenderTextControl::scrollTop() const -{ - if (m_innerText) - return m_innerText->scrollTop(); - return RenderBlock::scrollTop(); -} - -void RenderTextControl::setScrollLeft(int newLeft) -{ - if (m_innerText) - m_innerText->setScrollLeft(newLeft); -} - -void RenderTextControl::setScrollTop(int newTop) -{ - if (m_innerText) - m_innerText->setScrollTop(newTop); -} - -bool RenderTextControl::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier) -{ - RenderLayer* layer = m_innerText->renderBox()->layer(); - if (layer && layer->scroll(direction, granularity, multiplier)) - return true; - return RenderBlock::scroll(direction, granularity, multiplier); -} - HTMLElement* RenderTextControl::innerTextElement() const { return m_innerText.get(); |