Diff
Modified: trunk/Source/WebCore/ChangeLog (91013 => 91014)
--- trunk/Source/WebCore/ChangeLog 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/ChangeLog 2011-07-14 17:45:04 UTC (rev 91014)
@@ -1,3 +1,44 @@
+2011-07-14 Ryosuke Niwa <[email protected]>
+
+ Move subtreeHasChanged from RenderTextControl to HTMLTextFormControlElement
+ https://bugs.webkit.org/show_bug.cgi?id=64476
+
+ Reviewed by Kent Tamura.
+
+ Moved subtreeHasChanged from RenderTextControl, RenderTextControlSingleLine, and
+ RenderTextControlMultiLine to HTMLTextFormControlElement, HTMLInputElement, and
+ HTMLTextAreaElement. Also moved m_searchEventTimer and related functions from
+ RenderTextSingleLine to SearchInputType.
+
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::subtreeHasChanged): Moved from RenderTextControlSingleLine.
+ (WebCore::HTMLInputElement::onSearch): Calls stopSearchEventTimer.
+ * html/HTMLInputElement.h:
+ * html/HTMLTextAreaElement.cpp:
+ (WebCore::HTMLTextAreaElement::subtreeHasChanged): Moved from RenderTextMultiLine.
+ * html/HTMLTextAreaElement.h:
+ * html/HTMLTextFormControlElement.cpp:
+ (WebCore::HTMLTextFormControlElement::defaultEventHandler): Calls subtreeHasChanged.
+ (WebCore::HTMLTextFormControlElement::subtreeHasChanged): Added; calls respondToChangeByUser.
+ * html/HTMLTextFormControlElement.h:
+ * html/SearchInputType.cpp:
+ (WebCore::SearchInputType::SearchInputType): Initializes m_searchEventTimer.
+ (WebCore::SearchInputType::startSearchEventTimer): Moved from RenderTextControlSingleLine.
+ (WebCore::SearchInputType::stopSearchEventTimer): Ditto.
+ (WebCore::SearchInputType::searchEventTimerFired): Ditto.
+ * html/SearchInputType.h:
+ * html/TextFieldInputType.cpp:
+ (WebCore::TextFieldInputType::handleBeforeTextInsertedEvent): Updated comment.
+ * rendering/RenderTextControl.cpp:
+ * rendering/RenderTextControl.h:
+ (WebCore::RenderTextControl::respondToChangeByUser): Renamed from subtreeHasChanged.
+ * rendering/RenderTextControlMultiLine.cpp:
+ * rendering/RenderTextControlMultiLine.h:
+ * rendering/RenderTextControlSingleLine.cpp:
+ (WebCore::RenderTextControlSingleLine::RenderTextControlSingleLine): No longer initializes
+ m_searchEventTimer.
+ * rendering/RenderTextControlSingleLine.h:
+
2011-07-14 Vsevolod Vlasov <[email protected]>
Move XML errors handling out from XMLDocumentParser (refactoring).
Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (91013 => 91014)
--- trunk/Source/WebCore/html/HTMLInputElement.cpp 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp 2011-07-14 17:45:04 UTC (rev 91014)
@@ -55,6 +55,7 @@
#include "RenderTextControlSingleLine.h"
#include "RenderTheme.h"
#include "RuntimeEnabledFeatures.h"
+#include "SearchInputType.h"
#include "ScriptEventListener.h"
#include "WheelEvent.h"
#include <wtf/MathExtras.h>
@@ -614,6 +615,45 @@
notifyFormStateChanged();
}
+void HTMLInputElement::subtreeHasChanged()
+{
+ ASSERT(isTextField());
+ ASSERT(renderer());
+ RenderTextControlSingleLine* renderTextControl = toRenderTextControlSingleLine(renderer());
+
+ HTMLTextFormControlElement::subtreeHasChanged();
+
+ bool wasChanged = wasChangedSinceLastFormControlChangeEvent();
+ setChangedSinceLastFormControlChangeEvent(true);
+
+ // We don't need to call sanitizeUserInputValue() function here because
+ // HTMLInputElement::handleBeforeTextInsertedEvent() has already called
+ // sanitizeUserInputValue().
+ // sanitizeValue() is needed because IME input doesn't dispatch BeforeTextInsertedEvent.
+ String value = toRenderTextControl(renderer())->text();
+ if (isAcceptableValue(value))
+ setValueFromRenderer(sanitizeValue(convertFromVisibleValue(value)));
+ // Recalc for :invalid and hasUnacceptableValue() change.
+ setNeedsStyleRecalc();
+
+ if (cancelButtonElement())
+ renderTextControl->updateCancelButtonVisibility();
+
+ // If the incremental attribute is set, then dispatch the search event
+ if (searchEventsShouldBeDispatched() && isSearchField() && m_inputType)
+ static_cast<SearchInputType*>(m_inputType.get())->startSearchEventTimer();
+
+ if (!wasChanged && focused()) {
+ if (Frame* frame = document()->frame())
+ frame->editor()->textFieldDidBeginEditing(this);
+ }
+
+ if (focused()) {
+ if (Frame* frame = document()->frame())
+ frame->editor()->textDidChangeInTextField(this);
+ }
+}
+
const AtomicString& HTMLInputElement::formControlType() const
{
return m_inputType->formControlType();
@@ -1373,8 +1413,8 @@
void HTMLInputElement::onSearch()
{
ASSERT(isSearchField());
- if (renderer())
- toRenderTextControlSingleLine(renderer())->stopSearchEventTimer();
+ if (m_inputType)
+ static_cast<SearchInputType*>(m_inputType.get())->stopSearchEventTimer();
dispatchEvent(Event::create(eventNames().searchEvent, true, false));
}
Modified: trunk/Source/WebCore/html/HTMLInputElement.h (91013 => 91014)
--- trunk/Source/WebCore/html/HTMLInputElement.h 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/HTMLInputElement.h 2011-07-14 17:45:04 UTC (rev 91014)
@@ -315,6 +315,8 @@
virtual bool recalcWillValidate() const;
void updateType();
+
+ virtual void subtreeHasChanged();
bool getAllowedValueStepWithDecimalPlaces(AnyStepHandling, double*, unsigned*) const;
Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.cpp (91013 => 91014)
--- trunk/Source/WebCore/html/HTMLTextAreaElement.cpp 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.cpp 2011-07-14 17:45:04 UTC (rev 91014)
@@ -242,6 +242,21 @@
HTMLTextFormControlElement::defaultEventHandler(event);
}
+void HTMLTextAreaElement::subtreeHasChanged()
+{
+ HTMLTextFormControlElement::subtreeHasChanged();
+
+ setChangedSinceLastFormControlChangeEvent(true);
+ setFormControlValueMatchesRenderer(false);
+ setNeedsValidityCheck();
+
+ if (!focused())
+ return;
+
+ if (Frame* frame = document()->frame())
+ frame->editor()->textDidChangeInTextArea(this);
+}
+
void HTMLTextAreaElement::handleBeforeTextInsertedEvent(BeforeTextInsertedEvent* event) const
{
ASSERT(event);
Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.h (91013 => 91014)
--- trunk/Source/WebCore/html/HTMLTextAreaElement.h 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.h 2011-07-14 17:45:04 UTC (rev 91014)
@@ -82,6 +82,8 @@
virtual bool isRequiredFormControl() const { return required(); }
virtual void defaultEventHandler(Event*);
+
+ virtual void subtreeHasChanged();
virtual bool isEnumeratable() const { return true; }
Modified: trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp (91013 => 91014)
--- trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp 2011-07-14 17:45:04 UTC (rev 91014)
@@ -82,7 +82,7 @@
void HTMLTextFormControlElement::defaultEventHandler(Event* event)
{
if (event->type() == eventNames().webkitEditableContentChangedEvent && renderer() && renderer()->isTextControl()) {
- toRenderTextControl(renderer())->subtreeHasChanged();
+ subtreeHasChanged();
return;
}
@@ -96,6 +96,11 @@
innerTextElement()->defaultEventHandler(event);
}
+void HTMLTextFormControlElement::subtreeHasChanged()
+{
+ toRenderTextControl(renderer())->respondToChangeByUser();
+}
+
String HTMLTextFormControlElement::strippedPlaceholder() const
{
// According to the HTML5 specification, we need to remove CR and LF from
Modified: trunk/Source/WebCore/html/HTMLTextFormControlElement.h (91013 => 91014)
--- trunk/Source/WebCore/html/HTMLTextFormControlElement.h 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/HTMLTextFormControlElement.h 2011-07-14 17:45:04 UTC (rev 91014)
@@ -88,6 +88,7 @@
bool hasCachedSelectionEnd() const { return m_cachedSelectionEnd >= 0; }
virtual void defaultEventHandler(Event*);
+ virtual void subtreeHasChanged();
private:
int computeSelectionStart() const;
Modified: trunk/Source/WebCore/html/SearchInputType.cpp (91013 => 91014)
--- trunk/Source/WebCore/html/SearchInputType.cpp 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/SearchInputType.cpp 2011-07-14 17:45:04 UTC (rev 91014)
@@ -32,6 +32,7 @@
#include "SearchInputType.h"
#include "HTMLInputElement.h"
+#include "RenderTextControlSingleLine.h"
#include "ShadowRoot.h"
#include "TextControlInnerElements.h"
#include <wtf/PassOwnPtr.h>
@@ -40,6 +41,7 @@
inline SearchInputType::SearchInputType(HTMLInputElement* element)
: BaseTextInputType(element)
+ , m_searchEventTimer(this, &SearchInputType::searchEventTimerFired)
{
}
@@ -104,5 +106,31 @@
m_cancelButton.clear();
}
+void SearchInputType::startSearchEventTimer()
+{
+ ASSERT(element()->renderer());
+ unsigned length = toRenderTextControlSingleLine(element()->renderer())->text().length();
+ if (!length) {
+ stopSearchEventTimer();
+ element()->onSearch();
+ return;
+ }
+
+ // After typing the first key, we wait 0.5 seconds.
+ // After the second key, 0.4 seconds, then 0.3, then 0.2 from then on.
+ m_searchEventTimer.startOneShot(max(0.2, 0.6 - 0.1 * length));
+}
+
+void SearchInputType::stopSearchEventTimer()
+{
+ m_searchEventTimer.stop();
+}
+
+void SearchInputType::searchEventTimerFired(Timer<SearchInputType>*)
+{
+ element()->onSearch();
+}
+
+
} // namespace WebCore
Modified: trunk/Source/WebCore/html/SearchInputType.h (91013 => 91014)
--- trunk/Source/WebCore/html/SearchInputType.h 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/SearchInputType.h 2011-07-14 17:45:04 UTC (rev 91014)
@@ -32,6 +32,7 @@
#define SearchInputType_h
#include "BaseTextInputType.h"
+#include "Timer.h"
namespace WebCore {
@@ -42,6 +43,9 @@
public:
static PassOwnPtr<InputType> create(HTMLInputElement*);
+ void startSearchEventTimer();
+ void stopSearchEventTimer();
+
private:
SearchInputType(HTMLInputElement*);
virtual const AtomicString& formControlType() const;
@@ -53,8 +57,11 @@
virtual HTMLElement* resultsButtonElement() const;
virtual HTMLElement* cancelButtonElement() const;
+ void searchEventTimerFired(Timer<SearchInputType>*);
+
RefPtr<HTMLElement> m_resultsButton;
RefPtr<HTMLElement> m_cancelButton;
+ Timer<SearchInputType> m_searchEventTimer;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/html/TextFieldInputType.cpp (91013 => 91014)
--- trunk/Source/WebCore/html/TextFieldInputType.cpp 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/html/TextFieldInputType.cpp 2011-07-14 17:45:04 UTC (rev 91014)
@@ -279,7 +279,7 @@
// We use RenderTextControlSingleLine::text() instead of InputElement::value()
// because they can be mismatched by sanitizeValue() in
- // RenderTextControlSingleLine::subtreeHasChanged() in some cases.
+ // HTMLInputElement::subtreeHasChanged() in some cases.
unsigned oldLength = numGraphemeClusters(toRenderTextControlSingleLine(element()->renderer())->text());
// selectionLength represents the selection length of this text field to be
Modified: trunk/Source/WebCore/rendering/RenderTextControl.cpp (91013 => 91014)
--- trunk/Source/WebCore/rendering/RenderTextControl.cpp 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/rendering/RenderTextControl.cpp 2011-07-14 17:45:04 UTC (rev 91014)
@@ -172,12 +172,6 @@
static_cast<Element*>(node())->setFormControlValueMatchesRenderer(true);
}
-void RenderTextControl::setLastChangeWasUserEdit(bool lastChangeWasUserEdit)
-{
- m_lastChangeWasUserEdit = lastChangeWasUserEdit;
- document()->setIgnoreAutofocus(lastChangeWasUserEdit);
-}
-
VisiblePosition RenderTextControl::visiblePositionForIndex(int index) const
{
if (index <= 0)
@@ -191,11 +185,6 @@
return VisiblePosition(it.range()->endPosition(), UPSTREAM);
}
-void RenderTextControl::subtreeHasChanged()
-{
- m_lastChangeWasUserEdit = true;
-}
-
static String finishText(StringBuilder& result)
{
// Remove one trailing newline; there's always one that's collapsed out by rendering.
Modified: trunk/Source/WebCore/rendering/RenderTextControl.h (91013 => 91014)
--- trunk/Source/WebCore/rendering/RenderTextControl.h 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/rendering/RenderTextControl.h 2011-07-14 17:45:04 UTC (rev 91014)
@@ -36,9 +36,7 @@
virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const = 0;
bool lastChangeWasUserEdit() const { return m_lastChangeWasUserEdit; }
- void setLastChangeWasUserEdit(bool lastChangeWasUserEdit);
-
- virtual void subtreeHasChanged();
+ void respondToChangeByUser() { m_lastChangeWasUserEdit = true; }
String text();
String textWithHardLineBreaks();
Modified: trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp (91013 => 91014)
--- trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp 2011-07-14 17:45:04 UTC (rev 91014)
@@ -42,21 +42,6 @@
static_cast<HTMLTextAreaElement*>(node())->rendererWillBeDestroyed();
}
-void RenderTextControlMultiLine::subtreeHasChanged()
-{
- RenderTextControl::subtreeHasChanged();
- HTMLTextAreaElement* textArea = static_cast<HTMLTextAreaElement*>(node());
- textArea->setChangedSinceLastFormControlChangeEvent(true);
- textArea->setFormControlValueMatchesRenderer(false);
- textArea->setNeedsValidityCheck();
-
- if (!node()->focused())
- return;
-
- if (Frame* frame = this->frame())
- frame->editor()->textDidChangeInTextArea(textArea);
-}
-
bool RenderTextControlMultiLine::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
{
if (!RenderTextControl::nodeAtPoint(request, result, pointInContainer, accumulatedOffset, hitTestAction))
Modified: trunk/Source/WebCore/rendering/RenderTextControlMultiLine.h (91013 => 91014)
--- trunk/Source/WebCore/rendering/RenderTextControlMultiLine.h 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/rendering/RenderTextControlMultiLine.h 2011-07-14 17:45:04 UTC (rev 91014)
@@ -34,8 +34,6 @@
private:
virtual bool isTextArea() const { return true; }
- virtual void subtreeHasChanged();
-
virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
virtual float getAvgCharWidth(AtomicString family);
Modified: trunk/Source/WebCore/rendering/RenderTextControlSingleLine.cpp (91013 => 91014)
--- trunk/Source/WebCore/rendering/RenderTextControlSingleLine.cpp 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/rendering/RenderTextControlSingleLine.cpp 2011-07-14 17:45:04 UTC (rev 91014)
@@ -72,7 +72,6 @@
, m_searchPopupIsVisible(false)
, m_shouldDrawCapsLockIndicator(false)
, m_desiredInnerTextHeight(-1)
- , m_searchEventTimer(this, &RenderTextControlSingleLine::searchEventTimerFired)
, m_searchPopup(0)
{
ASSERT(node->isHTMLElement());
@@ -156,11 +155,6 @@
m_searchPopup->saveRecentSearches(name, m_recentSearches);
}
-void RenderTextControlSingleLine::stopSearchEventTimer()
-{
- m_searchEventTimer.stop();
-}
-
void RenderTextControlSingleLine::showPopup()
{
if (m_searchPopupIsVisible)
@@ -196,44 +190,6 @@
m_searchPopup->popupMenu()->hide();
}
-void RenderTextControlSingleLine::subtreeHasChanged()
-{
- RenderTextControl::subtreeHasChanged();
-
- ASSERT(node()->isElementNode());
- Element* element = static_cast<Element*>(node());
- bool wasChanged = element->wasChangedSinceLastFormControlChangeEvent();
- element->setChangedSinceLastFormControlChangeEvent(true);
-
- HTMLInputElement* input = inputElement();
- // We don't need to call sanitizeUserInputValue() function here because
- // HTMLInputElement::handleBeforeTextInsertedEvent() has already called
- // sanitizeUserInputValue().
- // sanitizeValue() is needed because IME input doesn't dispatch BeforeTextInsertedEvent.
- String value = text();
- if (input->isAcceptableValue(value))
- input->setValueFromRenderer(input->sanitizeValue(input->convertFromVisibleValue(value)));
- // Recalc for :invalid and hasUnacceptableValue() change.
- input->setNeedsStyleRecalc();
-
- if (cancelButtonElement())
- updateCancelButtonVisibility();
-
- // If the incremental attribute is set, then dispatch the search event
- if (input->searchEventsShouldBeDispatched())
- startSearchEventTimer();
-
- if (!wasChanged && node()->focused()) {
- if (Frame* frame = this->frame())
- frame->editor()->textFieldDidBeginEditing(static_cast<Element*>(node()));
- }
-
- if (node()->focused()) {
- if (Frame* frame = document()->frame())
- frame->editor()->textDidChangeInTextField(static_cast<Element*>(node()));
- }
-}
-
void RenderTextControlSingleLine::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
RenderTextControl::paint(paintInfo, paintOffset);
@@ -588,27 +544,6 @@
return static_cast<Element*>(node())->getAttribute(autosaveAttr);
}
-void RenderTextControlSingleLine::startSearchEventTimer()
-{
- unsigned length = text().length();
-
- // If there's no text, fire the event right away.
- if (!length) {
- stopSearchEventTimer();
- inputElement()->onSearch();
- return;
- }
-
- // After typing the first key, we wait 0.5 seconds.
- // After the second key, 0.4 seconds, then 0.3, then 0.2 from then on.
- m_searchEventTimer.startOneShot(max(0.2, 0.6 - 0.1 * length));
-}
-
-void RenderTextControlSingleLine::searchEventTimerFired(Timer<RenderTextControlSingleLine>*)
-{
- inputElement()->onSearch();
-}
-
// PopupMenuClient methods
void RenderTextControlSingleLine::valueChanged(unsigned listIndex, bool fireEvents)
{
Modified: trunk/Source/WebCore/rendering/RenderTextControlSingleLine.h (91013 => 91014)
--- trunk/Source/WebCore/rendering/RenderTextControlSingleLine.h 2011-07-14 17:44:29 UTC (rev 91013)
+++ trunk/Source/WebCore/rendering/RenderTextControlSingleLine.h 2011-07-14 17:45:04 UTC (rev 91014)
@@ -25,7 +25,6 @@
#include "PopupMenuClient.h"
#include "RenderTextControl.h"
-#include "Timer.h"
namespace WebCore {
@@ -39,6 +38,7 @@
// FIXME: Move create*Style() to their classes.
virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const;
PassRefPtr<RenderStyle> createInnerBlockStyle(const RenderStyle* startStyle) const;
+ void updateCancelButtonVisibility() const;
void addSearchResult();
void stopSearchEventTimer();
@@ -54,7 +54,6 @@
virtual IntRect controlClipRect(const IntPoint&) const;
virtual bool isTextField() const { return true; }
- virtual void subtreeHasChanged();
virtual void paint(PaintInfo&, const LayoutPoint&);
virtual void layout();
@@ -82,13 +81,9 @@
virtual RenderStyle* textBaseStyle() const;
- void updateCancelButtonVisibility() const;
EVisibility visibilityForCancelButton() const;
const AtomicString& autosaveName() const;
- void startSearchEventTimer();
- void searchEventTimerFired(Timer<RenderTextControlSingleLine>*);
-
// PopupMenuClient methods
virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
virtual void selectionChanged(unsigned, bool) {}
@@ -132,7 +127,6 @@
bool m_searchPopupIsVisible;
bool m_shouldDrawCapsLockIndicator;
LayoutUnit m_desiredInnerTextHeight;
- Timer<RenderTextControlSingleLine> m_searchEventTimer;
RefPtr<SearchPopupMenu> m_searchPopup;
Vector<String> m_recentSearches;
};