2009-03-11 Simon Fraser <simon.fraser@apple.com>
Reviewed by Dan Bernstein
https://bugs.webkit.org/show_bug.cgi?id=23093
When the cancel button in the search field is shown or hidden,
we need to explicitly setStyle() on the cancel button's renderer,
to ensure that repaint happens. Changing the style without telling
the renderer won't work.
Test: fast/repaint/search-field-cancel.html
* rendering/RenderTextControlSingleLine.cpp:
(WebCore::RenderTextControlSingleLine::subtreeHasChanged):
(WebCore::RenderTextControlSingleLine::updateFromElement):
(WebCore::RenderTextControlSingleLine::createCancelButtonStyle):
(WebCore::RenderTextControlSingleLine::updateCancelButtonVisibility):
(WebCore::RenderTextControlSingleLine::visibilityForCancelButton):
* rendering/RenderTextControlSingleLine.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@41590 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/RenderTextControlSingleLine.cpp b/WebCore/rendering/RenderTextControlSingleLine.cpp
index 0e84aaf..468b6e0 100644
--- a/WebCore/rendering/RenderTextControlSingleLine.cpp
+++ b/WebCore/rendering/RenderTextControlSingleLine.cpp
@@ -174,8 +174,8 @@
InputElement* input = inputElement();
input->setValueFromRenderer(input->constrainValue(text()));
- if (RenderObject* cancelButtonRenderer = m_cancelButton ? m_cancelButton->renderer() : 0)
- updateCancelButtonVisibility(cancelButtonRenderer->style());
+ if (m_cancelButton)
+ updateCancelButtonVisibility();
// If the incremental attribute is set, then dispatch the search event
if (input->searchEventsShouldBeDispatched())
@@ -473,8 +473,8 @@
bool placeholderVisibilityShouldChange = m_placeholderVisible != placeholderShouldBeVisible();
m_placeholderVisible = placeholderShouldBeVisible();
- if (RenderObject* cancelButtonRenderer = m_cancelButton ? m_cancelButton->renderer() : 0)
- updateCancelButtonVisibility(cancelButtonRenderer->style());
+ if (m_cancelButton)
+ updateCancelButtonVisibility();
if (m_placeholderVisible) {
ExceptionCode ec = 0;
@@ -582,15 +582,30 @@
if (startStyle)
cancelBlockStyle->inheritFrom(startStyle);
- updateCancelButtonVisibility(cancelBlockStyle.get());
+ cancelBlockStyle->setVisibility(visibilityForCancelButton());
return cancelBlockStyle.release();
}
-void RenderTextControlSingleLine::updateCancelButtonVisibility(RenderStyle* style) const
+void RenderTextControlSingleLine::updateCancelButtonVisibility() const
+{
+ if (!m_cancelButton->renderer())
+ return;
+
+ const RenderStyle* curStyle = m_cancelButton->renderer()->style();
+ EVisibility buttonVisibility = visibilityForCancelButton();
+ if (curStyle->visibility() == buttonVisibility)
+ return;
+
+ RefPtr<RenderStyle> cancelButtonStyle = RenderStyle::clone(curStyle);
+ cancelButtonStyle->setVisibility(buttonVisibility);
+ m_cancelButton->renderer()->setStyle(cancelButtonStyle);
+}
+
+EVisibility RenderTextControlSingleLine::visibilityForCancelButton() const
{
ASSERT(node()->isHTMLElement());
HTMLInputElement* input = static_cast<HTMLInputElement*>(node());
- style->setVisibility(input->value().isEmpty() ? HIDDEN : VISIBLE);
+ return input->value().isEmpty() ? HIDDEN : VISIBLE;
}
const AtomicString& RenderTextControlSingleLine::autosaveName() const