summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_formdata_format.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_formdata_format.js')
-rw-r--r--browser/components/sessionstore/test/browser_formdata_format.js170
1 files changed, 170 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_formdata_format.js b/browser/components/sessionstore/test/browser_formdata_format.js
new file mode 100644
index 0000000000..d4ac1f6e1b
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_formdata_format.js
@@ -0,0 +1,170 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+function test() {
+ /** Tests formdata format **/
+ waitForExplicitFinish();
+
+ let formData = [
+ {},
+ // old format
+ { "#input1": "value0" },
+ {
+ "#input1": "value1",
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value2",
+ },
+ { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value3" },
+ // new format
+ { id: { input1: "value4" } },
+ { id: { input1: "value5" }, xpath: {} },
+ {
+ id: { input1: "value6" },
+ xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value7" },
+ },
+ {
+ id: {},
+ xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value8" },
+ },
+ {
+ xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value9" },
+ },
+ // combinations
+ { "#input1": "value10", id: { input1: "value11" } },
+ {
+ "#input1": "value12",
+ id: { input1: "value13" },
+ xpath: {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value14",
+ },
+ },
+ {
+ "#input1": "value15",
+ xpath: {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value16",
+ },
+ },
+ {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value17",
+ id: { input1: "value18" },
+ },
+ {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value19",
+ id: { input1: "value20" },
+ xpath: {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value21",
+ },
+ },
+ {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value22",
+ xpath: {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value23",
+ },
+ },
+ {
+ "#input1": "value24",
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value25",
+ id: { input1: "value26" },
+ },
+ {
+ "#input1": "value27",
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value28",
+ id: { input1: "value29" },
+ xpath: {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value30",
+ },
+ },
+ {
+ "#input1": "value31",
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value32",
+ xpath: {
+ "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value33",
+ },
+ },
+ ];
+ let expectedValues = [
+ ["", ""],
+ // old format
+ ["value0", ""],
+ ["value1", "value2"],
+ ["", "value3"],
+ // new format
+ ["value4", ""],
+ ["value5", ""],
+ ["value6", "value7"],
+ ["", "value8"],
+ ["", "value9"],
+ // combinations
+ ["value11", ""],
+ ["value13", "value14"],
+ ["", "value16"],
+ ["value18", ""],
+ ["value20", "value21"],
+ ["", "value23"],
+ ["value26", ""],
+ ["value29", "value30"],
+ ["", "value33"],
+ ];
+
+ let promises = [];
+ for (let i = 0; i < formData.length; i++) {
+ promises.push(testTabRestoreData(formData[i], expectedValues[i]));
+ }
+
+ Promise.all(promises).then(
+ () => finish(),
+ ex => ok(false, ex)
+ );
+}
+
+async function testTabRestoreData(aFormData, aExpectedValue) {
+ let URL = ROOT + "browser_formdata_format_sample.html";
+ let tab = BrowserTestUtils.addTab(gBrowser, "about:blank");
+
+ aFormData.url = URL;
+ let tabState = {
+ entries: [{ url: URL, triggeringPrincipal_base64 }],
+ formdata: aFormData,
+ };
+
+ await promiseBrowserLoaded(tab.linkedBrowser);
+ await promiseTabState(tab, tabState);
+
+ await TabStateFlusher.flush(tab.linkedBrowser);
+ let restoredTabState = JSON.parse(ss.getTabState(tab));
+ let restoredFormData = restoredTabState.formdata;
+
+ if (restoredFormData) {
+ let doc = tab.linkedBrowser.contentDocument;
+ let input1 = doc.getElementById("input1");
+ let input2 = doc.querySelector("input[name=input2]");
+
+ // test format
+ ok(
+ "id" in restoredFormData || "xpath" in restoredFormData,
+ "FormData format is valid: " + restoredFormData
+ );
+ // validate that there are no old keys
+ for (let key of Object.keys(restoredFormData)) {
+ if (!["id", "xpath", "url"].includes(key)) {
+ ok(false, "FormData format is invalid.");
+ }
+ }
+ // test id
+ is(
+ input1.value,
+ aExpectedValue[0],
+ "FormData by 'id' has been restored correctly"
+ );
+ // test xpath
+ is(
+ input2.value,
+ aExpectedValue[1],
+ "FormData by 'xpath' has been restored correctly"
+ );
+ }
+
+ // clean up
+ gBrowser.removeTab(tab);
+}