- Revision
- 89624
- Author
- [email protected]
- Date
- 2011-06-23 15:13:30 -0700 (Thu, 23 Jun 2011)
Log Message
2011-06-23 Emil A Eklund <[email protected]>
Reviewed by Dimitri Glazkov.
input/textarea onchange doesn't fire if value is set in key listener
https://bugs.webkit.org/show_bug.cgi?id=63092
Add test for text field onchange when setting the value in a key listener.
* fast/events/onchange-setvalue-expected.txt: Added.
* fast/events/onchange-setvalue.html: Added.
2011-06-23 Emil A Eklund <[email protected]>
Reviewed by Darin Adler.
input/textarea onchange doesn't fire if value is set in key listener
https://bugs.webkit.org/show_bug.cgi?id=63092
Change setValue implementation of HTMLInputElement and HTMLTextAreaElement to
not call setTextAsOfLastFormControlChangeEvent unless the value truly changed.
Thus element.value = element.value will no longer reset the state
m_textAsOfLastFormControlChangeEvent field and suppress the change event.
Test: fast/events/onchange-setvalue.html
* html/HTMLInputElement.cpp:
(WebCore::HTMLInputElement::setValue):
* html/HTMLTextAreaElement.cpp:
(WebCore::HTMLTextAreaElement::setValue):
(WebCore::HTMLTextAreaElement::setNonDirtyValue):
(WebCore::HTMLTextAreaElement::setValueCommon):
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (89623 => 89624)
--- trunk/LayoutTests/ChangeLog 2011-06-23 22:11:50 UTC (rev 89623)
+++ trunk/LayoutTests/ChangeLog 2011-06-23 22:13:30 UTC (rev 89624)
@@ -1,3 +1,15 @@
+2011-06-23 Emil A Eklund <[email protected]>
+
+ Reviewed by Dimitri Glazkov.
+
+ input/textarea onchange doesn't fire if value is set in key listener
+ https://bugs.webkit.org/show_bug.cgi?id=63092
+
+ Add test for text field onchange when setting the value in a key listener.
+
+ * fast/events/onchange-setvalue-expected.txt: Added.
+ * fast/events/onchange-setvalue.html: Added.
+
2011-06-23 Wyatt Carss <[email protected]>
Reviewed by Ryosuke Niwa.
Added: trunk/LayoutTests/fast/events/onchange-setvalue-expected.txt (0 => 89624)
--- trunk/LayoutTests/fast/events/onchange-setvalue-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/events/onchange-setvalue-expected.txt 2011-06-23 22:13:30 UTC (rev 89624)
@@ -0,0 +1,14 @@
+PASS events.length is 2
+PASS events[0] is 'change e'
+PASS events[1] is 'change es'
+PASS events.length is 3
+PASS events[0] is 'change a'
+PASS events[1] is 'change ab'
+PASS events[2] is 'change abc'
+PASS events.length is 2
+PASS events[0] is 'change e'
+PASS events[1] is 'change es'
+PASS events.length is 2
+PASS events[0] is 'change e'
+PASS events[1] is 'change es'
+
Added: trunk/LayoutTests/fast/events/onchange-setvalue.html (0 => 89624)
--- trunk/LayoutTests/fast/events/onchange-setvalue.html (rev 0)
+++ trunk/LayoutTests/fast/events/onchange-setvalue.html 2011-06-23 22:13:30 UTC (rev 89624)
@@ -0,0 +1,99 @@
+<html>
+<head>
+<script src=""
+<body>
+ <div id="test">
+ <input type="text">
+ <textarea type="text"></textarea>
+ </div>
+ <div id="console"></div>
+</body>
+<script>
+
+ if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+ var events = [];
+
+ var UPPER_CASE_T_KEY_CODE = 84;
+ var LOWER_CASE_T_CHAR_CODE = 116;
+
+ function keyListener(event)
+ {
+ if (event.keyCode == UPPER_CASE_T_KEY_CODE || event.keyCode == LOWER_CASE_T_CHAR_CODE)
+ event.preventDefault();
+ event.target.value = event.target.value.replace('t', '');
+ }
+
+ function changeListener(event)
+ {
+ events.push(event.type + ' ' + event.target.value);
+ }
+
+ function sendKeysForString(target, str)
+ {
+ for (var i = 0; i < str.length; i++) {
+ target.focus();
+ eventSender.keyDown(str[i]);
+ target.blur();
+ }
+ }
+
+ // Replace value on keyup.
+ var inputElement = document.body.getElementsByTagName('input')[0];
+ inputElement.addEventListener('keyup', keyListener, false);
+ inputElement.addEventListener('change', changeListener, false);
+
+ if (window.eventSender)
+ sendKeysForString(inputElement, 'test');
+
+ shouldBe("events.length", "2");
+ shouldBe("events[0]", "'change e'");
+ shouldBe("events[1]", "'change es'");
+
+ var textAreaElement = document.body.getElementsByTagName('textarea')[0];
+ textAreaElement.addEventListener('keyup', keyListener, false);
+ textAreaElement.addEventListener('change', changeListener, false);
+ events.length = 0;
+
+ if (window.eventSender)
+ sendKeysForString(textAreaElement, 'atttbttc');
+
+ shouldBe("events.length", "3");
+ shouldBe("events[0]", "'change a'");
+ shouldBe("events[1]", "'change ab'");
+ shouldBe("events[2]", "'change abc'");
+
+
+ // Prevent default on keydown.
+ inputElement.removeEventListener('keyup', keyListener, false);
+ inputElement.addEventListener('keydown', keyListener, false);
+ inputElement.value = '';
+ events.length = 0;
+
+ if (window.eventSender)
+ sendKeysForString(inputElement, 'test');
+
+ shouldBe("events.length", "2");
+ shouldBe("events[0]", "'change e'");
+ shouldBe("events[1]", "'change es'");
+
+
+ // Prevent default on keypress.
+ inputElement.removeEventListener('keydown', keyListener, false);
+ inputElement.addEventListener('keypress', keyListener, false);
+ inputElement.value = '';
+ events.length = 0;
+
+ if (window.eventSender)
+ sendKeysForString(inputElement, 'test');
+
+ shouldBe("events.length", "2");
+ shouldBe("events[0]", "'change e'");
+ shouldBe("events[1]", "'change es'");
+
+ // Hide test elements after run to avoid whitespace differences across platforms in the results.
+ document.getElementById('test').style.display = 'none';
+</script>
+</html>
+
Modified: trunk/Source/WebCore/ChangeLog (89623 => 89624)
--- trunk/Source/WebCore/ChangeLog 2011-06-23 22:11:50 UTC (rev 89623)
+++ trunk/Source/WebCore/ChangeLog 2011-06-23 22:13:30 UTC (rev 89624)
@@ -1,3 +1,24 @@
+2011-06-23 Emil A Eklund <[email protected]>
+
+ Reviewed by Darin Adler.
+
+ input/textarea onchange doesn't fire if value is set in key listener
+ https://bugs.webkit.org/show_bug.cgi?id=63092
+
+ Change setValue implementation of HTMLInputElement and HTMLTextAreaElement to
+ not call setTextAsOfLastFormControlChangeEvent unless the value truly changed.
+ Thus element.value = element.value will no longer reset the state
+ m_textAsOfLastFormControlChangeEvent field and suppress the change event.
+
+ Test: fast/events/onchange-setvalue.html
+
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::setValue):
+ * html/HTMLTextAreaElement.cpp:
+ (WebCore::HTMLTextAreaElement::setValue):
+ (WebCore::HTMLTextAreaElement::setNonDirtyValue):
+ (WebCore::HTMLTextAreaElement::setValueCommon):
+
2011-06-23 Alexis Menard <[email protected]>
Reviewed by Eric Carlson.
Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (89623 => 89624)
--- trunk/Source/WebCore/html/HTMLInputElement.cpp 2011-06-23 22:11:50 UTC (rev 89623)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp 2011-06-23 22:13:30 UTC (rev 89624)
@@ -976,19 +976,22 @@
if (!m_inputType->canSetValue(value))
return;
+ String sanitizedValue = sanitizeValue(value);
+ bool valueChanged = sanitizedValue != this->value();
+
setFormControlValueMatchesRenderer(false);
if (m_inputType->storesValueSeparateFromAttribute()) {
if (files())
files()->clear();
else {
- m_valueIfDirty = sanitizeValue(value);
+ m_valueIfDirty = sanitizedValue;
m_wasModifiedByUser = sendChangeEvent;
if (isTextField())
updatePlaceholderVisibility(false);
}
setNeedsStyleRecalc();
} else
- setAttribute(valueAttr, sanitizeValue(value));
+ setAttribute(valueAttr, sanitizedValue);
setNeedsValidityCheck();
@@ -1000,6 +1003,10 @@
cacheSelection(max, max);
m_suggestedValue = String();
}
+
+ if (!valueChanged)
+ return;
+
m_inputType->valueChanged();
if (sendChangeEvent) {
Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.cpp (89623 => 89624)
--- trunk/Source/WebCore/html/HTMLTextAreaElement.cpp 2011-06-23 22:11:50 UTC (rev 89623)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.cpp 2011-06-23 22:13:30 UTC (rev 89624)
@@ -303,7 +303,6 @@
setValueCommon(value);
m_isDirty = true;
setNeedsValidityCheck();
- setTextAsOfLastFormControlChangeEvent(value);
}
void HTMLTextAreaElement::setNonDirtyValue(const String& value)
@@ -311,7 +310,6 @@
setValueCommon(value);
m_isDirty = false;
setNeedsValidityCheck();
- setTextAsOfLastFormControlChangeEvent(value);
}
void HTMLTextAreaElement::setValueCommon(const String& value)
@@ -340,6 +338,7 @@
}
notifyFormStateChanged(this);
+ setTextAsOfLastFormControlChangeEvent(normalizedValue);
}
String HTMLTextAreaElement::defaultValue() const