Bug 230474 - Bug 829606 - No longer scroll to the beginning of the editor when the value is changed in a text field. r=bz

This commit is contained in:
Mounir Lamouri 2013-02-27 14:08:49 +00:00
parent 6bcee6bb6d
commit 22e270dcf4
3 changed files with 123 additions and 13 deletions

View File

@ -1899,19 +1899,6 @@ nsTextEditorState::SetValue(const nsAString& aValue, bool aUserInput,
selPriv->EndBatchChanges(); selPriv->EndBatchChanges();
} }
} }
// This second check _shouldn't_ be necessary, but let's be safe.
if (!weakFrame.IsAlive()) {
return;
}
nsIScrollableFrame* scrollableFrame = do_QueryFrame(mBoundFrame->GetFirstPrincipalChild());
if (scrollableFrame)
{
// Scroll the upper left corner of the text control's
// content area back into view.
scrollableFrame->ScrollTo(nsPoint(0, 0), nsIScrollableFrame::INSTANT);
}
} else { } else {
if (!mValue) { if (!mValue) {
mValue = new nsCString; mValue = new nsCString;

View File

@ -52,6 +52,7 @@ MOCHITEST_FILES = \
test_input_sanitization.html \ test_input_sanitization.html \
test_valueasdate_attribute.html \ test_valueasdate_attribute.html \
test_input_file_b2g_disabled.html \ test_input_file_b2g_disabled.html \
test_input_textarea_set_value_no_scroll.html \
$(NULL) $(NULL)
include $(topsrcdir)/config/rules.mk include $(topsrcdir)/config/rules.mk

View File

@ -0,0 +1,122 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=829606
-->
<head>
<meta charset="utf-8">
<title>Test for Bug 829606</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/WindowSnapshot.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript;version=1.7">
/** Test for Bug 829606 **/
/*
* This test checks that setting .value on an text field (input or textarea)
* doesn't scroll the field to its beginning.
*/
SimpleTest.waitForExplicitFinish();
var gTestRunner = null;
function test(aElementName)
{
var element = document.getElementsByTagName(aElementName)[0];
element.focus();
var baseSnapshot = snapshotWindow(window);
// This is a sanity check.
var s2 = snapshotWindow(window);
var results = compareSnapshots(baseSnapshot, snapshotWindow(window), true);
ok(results[0], "sanity check: screenshots should be the same");
element.selectionStart = element.selectionEnd = element.value.length;
setTimeout(function() {
synthesizeKey('f', {});
var selectionAtTheEndSnapshot = snapshotWindow(window);
results = compareSnapshots(baseSnapshot, selectionAtTheEndSnapshot, false);
ok(results[0], "after appending a character, string should have changed");
element.value = element.value;
var tmpSnapshot = snapshotWindow(window);
results = compareSnapshots(baseSnapshot, tmpSnapshot, false);
ok(results[0], "re-settig the value should change nothing");
results = compareSnapshots(selectionAtTheEndSnapshot, tmpSnapshot, true);
ok(results[0], "re-settig the value should change nothing");
element.selectionStart = element.selectionEnd = 0;
element.blur();
gTestRunner.next();
}, 0);
}
// This test checks that when a textarea has a long list of values and the
// textarea's value is then changed, the values are shown correctly.
function testCorrectUpdateOnScroll()
{
var textarea = document.createElement('textarea');
textarea.rows = 5;
textarea.cols = 10;
textarea.value = 'a\nb\nc\nd';
document.getElementById('content').appendChild(textarea);
var baseSnapshot = snapshotWindow(window);
textarea.value = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n';
textarea.selectionStart = textarea.selectionEnd = textarea.value.length;
var fullSnapshot = snapshotWindow(window);
var results = compareSnapshots(baseSnapshot, fullSnapshot, false);
ok(results[0], "sanity check: screenshots should not be the same");
textarea.value = 'a\nb\nc\nd';
var tmpSnapshot = snapshotWindow(window);
results = compareSnapshots(baseSnapshot, tmpSnapshot, true);
ok(results[0], "textarea view should look like the beginning");
setTimeout(function() {
gTestRunner.next();
}, 0);
}
function runTest()
{
test('input');
yield;
test('textarea');
yield;
testCorrectUpdateOnScroll();
yield;
SimpleTest.finish();
yield;
}
gTestRunner = runTest();
SimpleTest.waitForFocus(function() {
gTestRunner.next();
});;
</script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=829606">Mozilla Bug 829606</a>
<p id="display"></p>
<div id="content">
<textarea rows='1' cols='5'>this is a \n long text</textarea>
<input size='5' value="this is a very long text">
</div>
<pre id="test">
</pre>
</body>
</html>