зеркало из https://github.com/mozilla/gecko-dev.git
Bug 492701 - form history should cap the number of fields saved per form submission. r=dolske, a192=beltzner
This commit is contained in:
Родитель
15b91227ff
Коммит
c22f00184c
|
@ -75,6 +75,8 @@
|
|||
// Limit the length of names and values stored in form history
|
||||
#define MAX_HISTORY_NAME_LEN 200
|
||||
#define MAX_HISTORY_VALUE_LEN 200
|
||||
// Limit the number of fields saved in a form
|
||||
#define MAX_FIELDS_SAVED 100
|
||||
|
||||
// nsFormHistoryResult is a specialized autocomplete result class that knows
|
||||
// how to remove entries from the form history table.
|
||||
|
@ -480,6 +482,7 @@ nsFormHistory::Notify(nsIDOMHTMLFormElement* formElt, nsIDOMWindowInternal* aWin
|
|||
nsCOMPtr<nsIDOMHTMLCollection> elts;
|
||||
formElt->GetElements(getter_AddRefs(elts));
|
||||
|
||||
PRUint32 savedCount = 0;
|
||||
PRUint32 length;
|
||||
elts->GetLength(&length);
|
||||
if (length == 0)
|
||||
|
@ -524,6 +527,8 @@ nsFormHistory::Notify(nsIDOMHTMLFormElement* formElt, nsIDOMWindowInternal* aWin
|
|||
if (name.Length() > MAX_HISTORY_NAME_LEN ||
|
||||
value.Length() > MAX_HISTORY_VALUE_LEN)
|
||||
continue;
|
||||
if (savedCount++ >= MAX_FIELDS_SAVED)
|
||||
break;
|
||||
AddEntry(name, value);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,6 +52,8 @@ XPCSHELL_TESTS = \
|
|||
|
||||
MOCHI_TESTS = \
|
||||
test_form_submission.html \
|
||||
test_form_submission_cap.html \
|
||||
test_form_submission_cap2.html \
|
||||
test_privbrowsing.html \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Satchel Test for Form Submisstion Field Cap</title>
|
||||
<script type="text/javascript" src="/MochiKit/packed.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="text/javascript" src="satchel_common.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
|
||||
<form id="form1" onsubmit="return checkSubmit(1)">
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript">
|
||||
|
||||
/* Test for bug 492701.
|
||||
Save only the first MAX_FIELDS_SAVED changed fields in a form.
|
||||
Generate numInputFields = MAX_FIELDS_SAVED + 1 fields, change all values,
|
||||
and test that only MAX_FIELDS_SAVED are actually saved and that
|
||||
field # numInputFields was not saved.
|
||||
*/
|
||||
|
||||
var numSubmittedForms = 0;
|
||||
var numInputFields = 101;
|
||||
|
||||
function startTest() {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
ok(!fh.hasEntries, "checking for initially empty storage");
|
||||
|
||||
var form = document.getElementById("form1");
|
||||
for (i = 1; i <= numInputFields; i++) {
|
||||
var newField = document.createElement("input");
|
||||
newField.setAttribute("type", "text");
|
||||
newField.setAttribute("name", "test" + i);
|
||||
form.appendChild(newField);
|
||||
}
|
||||
|
||||
// Fill in values for the various fields. We could just set the <input>'s
|
||||
// value attribute, but we don't save default form values (and we want to
|
||||
// ensure unsaved values are because of autocomplete=off or whatever).
|
||||
for (i = 1; i <= numInputFields; i++) {
|
||||
$_(1, "test" + i).value = i;
|
||||
}
|
||||
|
||||
// submit the first form.
|
||||
var button = getFormSubmitButton(1);
|
||||
button.click();
|
||||
}
|
||||
|
||||
|
||||
// Called by each form's onsubmit handler.
|
||||
function checkSubmit(formNum) {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
ok(true, "form " + formNum + " submitted");
|
||||
numSubmittedForms++;
|
||||
|
||||
// check that the first (numInputFields - 1) CHANGED fields are saved
|
||||
for (i = 1; i < numInputFields; i++) { // check all but last
|
||||
ok(fh.entryExists("test" + i, i), "checking saved value " + i);
|
||||
}
|
||||
|
||||
// make sure that the remaining changed fields are not saved
|
||||
ok(!fh.entryExists("test" + numInputFields, numInputFields), "checking unsaved value " + numInputFields);
|
||||
|
||||
|
||||
// End the test at the last form.
|
||||
if (formNum == 1) {
|
||||
is(numSubmittedForms, 1, "Ensuring all forms were submitted.");
|
||||
SimpleTest.finish();
|
||||
return false; // return false to cancel current form submission
|
||||
}
|
||||
|
||||
// submit the next form.
|
||||
var button = getFormSubmitButton(formNum + 1);
|
||||
button.click();
|
||||
|
||||
return false; // cancel current form submission
|
||||
}
|
||||
|
||||
|
||||
function getFormSubmitButton(formNum) {
|
||||
var form = $("form" + formNum); // by id, not name
|
||||
ok(form != null, "getting form " + formNum);
|
||||
|
||||
// we can't just call form.submit(), because that doesn't seem to
|
||||
// invoke the form onsubmit handler.
|
||||
var button = form.firstChild;
|
||||
while (button && button.type != "submit") { button = button.nextSibling; }
|
||||
ok(button != null, "getting form submit button");
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
var fh = Components.classes["@mozilla.org/satchel/form-history;1"].
|
||||
getService(Components.interfaces.nsIFormHistory2);
|
||||
ok(fh != null, "Got formHistory service");
|
||||
|
||||
window.onload = startTest;
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,202 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Satchel Test for Form Submisstion Field Cap</title>
|
||||
<script type="text/javascript" src="/MochiKit/packed.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="text/javascript" src="satchel_common.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
<!--
|
||||
Test for bug 492701.
|
||||
Only change field # numInputFields (= MAX_FIELDS_SAVED + 1)
|
||||
and test that it is actually saved and the other (unmodified) ones are not.
|
||||
-->
|
||||
<form id="form1" onsubmit="return checkSubmit(1)">
|
||||
<input type="text" name="test1" value="1">
|
||||
<input type="text" name="test2" value="2">
|
||||
<input type="text" name="test3" value="3">
|
||||
<input type="text" name="test4" value="4">
|
||||
<input type="text" name="test5" value="5">
|
||||
<input type="text" name="test6" value="6">
|
||||
<input type="text" name="test7" value="7">
|
||||
<input type="text" name="test8" value="8">
|
||||
<input type="text" name="test9" value="9">
|
||||
<input type="text" name="test10" value="10">
|
||||
<input type="text" name="test11" value="11">
|
||||
<input type="text" name="test12" value="12">
|
||||
<input type="text" name="test13" value="13">
|
||||
<input type="text" name="test14" value="14">
|
||||
<input type="text" name="test15" value="15">
|
||||
<input type="text" name="test16" value="16">
|
||||
<input type="text" name="test17" value="17">
|
||||
<input type="text" name="test18" value="18">
|
||||
<input type="text" name="test19" value="19">
|
||||
<input type="text" name="test20" value="20">
|
||||
<input type="text" name="test21" value="21">
|
||||
<input type="text" name="test22" value="22">
|
||||
<input type="text" name="test23" value="23">
|
||||
<input type="text" name="test24" value="24">
|
||||
<input type="text" name="test25" value="25">
|
||||
<input type="text" name="test26" value="26">
|
||||
<input type="text" name="test27" value="27">
|
||||
<input type="text" name="test28" value="28">
|
||||
<input type="text" name="test29" value="29">
|
||||
<input type="text" name="test30" value="30">
|
||||
<input type="text" name="test31" value="31">
|
||||
<input type="text" name="test32" value="32">
|
||||
<input type="text" name="test33" value="33">
|
||||
<input type="text" name="test34" value="34">
|
||||
<input type="text" name="test35" value="35">
|
||||
<input type="text" name="test36" value="36">
|
||||
<input type="text" name="test37" value="37">
|
||||
<input type="text" name="test38" value="38">
|
||||
<input type="text" name="test39" value="39">
|
||||
<input type="text" name="test40" value="40">
|
||||
<input type="text" name="test41" value="41">
|
||||
<input type="text" name="test42" value="42">
|
||||
<input type="text" name="test43" value="43">
|
||||
<input type="text" name="test44" value="44">
|
||||
<input type="text" name="test45" value="45">
|
||||
<input type="text" name="test46" value="46">
|
||||
<input type="text" name="test47" value="47">
|
||||
<input type="text" name="test48" value="48">
|
||||
<input type="text" name="test49" value="49">
|
||||
<input type="text" name="test50" value="50">
|
||||
<input type="text" name="test51" value="51">
|
||||
<input type="text" name="test52" value="52">
|
||||
<input type="text" name="test53" value="53">
|
||||
<input type="text" name="test54" value="54">
|
||||
<input type="text" name="test55" value="55">
|
||||
<input type="text" name="test56" value="56">
|
||||
<input type="text" name="test57" value="57">
|
||||
<input type="text" name="test58" value="58">
|
||||
<input type="text" name="test59" value="59">
|
||||
<input type="text" name="test60" value="60">
|
||||
<input type="text" name="test61" value="61">
|
||||
<input type="text" name="test62" value="62">
|
||||
<input type="text" name="test63" value="63">
|
||||
<input type="text" name="test64" value="64">
|
||||
<input type="text" name="test65" value="65">
|
||||
<input type="text" name="test66" value="66">
|
||||
<input type="text" name="test67" value="67">
|
||||
<input type="text" name="test68" value="68">
|
||||
<input type="text" name="test69" value="69">
|
||||
<input type="text" name="test70" value="70">
|
||||
<input type="text" name="test71" value="71">
|
||||
<input type="text" name="test72" value="72">
|
||||
<input type="text" name="test73" value="73">
|
||||
<input type="text" name="test74" value="74">
|
||||
<input type="text" name="test75" value="75">
|
||||
<input type="text" name="test76" value="76">
|
||||
<input type="text" name="test77" value="77">
|
||||
<input type="text" name="test78" value="78">
|
||||
<input type="text" name="test79" value="79">
|
||||
<input type="text" name="test80" value="80">
|
||||
<input type="text" name="test81" value="81">
|
||||
<input type="text" name="test82" value="82">
|
||||
<input type="text" name="test83" value="83">
|
||||
<input type="text" name="test84" value="84">
|
||||
<input type="text" name="test85" value="85">
|
||||
<input type="text" name="test86" value="86">
|
||||
<input type="text" name="test87" value="87">
|
||||
<input type="text" name="test88" value="88">
|
||||
<input type="text" name="test89" value="89">
|
||||
<input type="text" name="test90" value="90">
|
||||
<input type="text" name="test91" value="91">
|
||||
<input type="text" name="test92" value="92">
|
||||
<input type="text" name="test93" value="93">
|
||||
<input type="text" name="test94" value="94">
|
||||
<input type="text" name="test95" value="95">
|
||||
<input type="text" name="test96" value="96">
|
||||
<input type="text" name="test97" value="97">
|
||||
<input type="text" name="test98" value="98">
|
||||
<input type="text" name="test99" value="99">
|
||||
<input type="text" name="test100" value="100">
|
||||
<input type="text" name="test101" value="101">
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript">
|
||||
|
||||
var numSubmittedForms = 0;
|
||||
var numInputFields = 101;
|
||||
|
||||
function startTest() {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
ok(!fh.hasEntries, "checking for initially empty storage");
|
||||
|
||||
// Fill in values for the various fields. We could just set the <input>'s
|
||||
// value attribute, but we don't save default form values (and we want to
|
||||
// ensure unsaved values are because of autocomplete=off or whatever).
|
||||
$_(1, "test" + numInputFields).value = numInputFields + " changed";
|
||||
|
||||
// submit the first form.
|
||||
var button = getFormSubmitButton(1);
|
||||
button.click();
|
||||
}
|
||||
|
||||
|
||||
// Called by each form's onsubmit handler.
|
||||
function checkSubmit(formNum) {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
ok(true, "form " + formNum + " submitted");
|
||||
numSubmittedForms++;
|
||||
|
||||
// make sure that the first (numInputFields - 1) were not saved (as they were not changed)
|
||||
for (i = 1; i < numInputFields; i++) {
|
||||
ok(!fh.entryExists("test" + i, i), "checking unsaved value " + i);
|
||||
}
|
||||
|
||||
// make sure that the field # numInputFields was saved
|
||||
ok(fh.entryExists("test" + numInputFields, numInputFields + " changed"), "checking saved value " + numInputFields);
|
||||
|
||||
|
||||
// End the test at the last form.
|
||||
if (formNum == 1) {
|
||||
is(numSubmittedForms, 1, "Ensuring all forms were submitted.");
|
||||
SimpleTest.finish();
|
||||
return false; // return false to cancel current form submission
|
||||
}
|
||||
|
||||
// submit the next form.
|
||||
var button = getFormSubmitButton(formNum + 1);
|
||||
button.click();
|
||||
|
||||
return false; // cancel current form submission
|
||||
}
|
||||
|
||||
|
||||
function getFormSubmitButton(formNum) {
|
||||
var form = $("form" + formNum); // by id, not name
|
||||
ok(form != null, "getting form " + formNum);
|
||||
|
||||
// we can't just call form.submit(), because that doesn't seem to
|
||||
// invoke the form onsubmit handler.
|
||||
var button = form.firstChild;
|
||||
while (button && button.type != "submit") { button = button.nextSibling; }
|
||||
ok(button != null, "getting form submit button");
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
var fh = Components.classes["@mozilla.org/satchel/form-history;1"].
|
||||
getService(Components.interfaces.nsIFormHistory2);
|
||||
ok(fh != null, "Got formHistory service");
|
||||
|
||||
window.onload = startTest;
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче