diff options
Diffstat (limited to 'browser/components/sessionstore/test/browser_formdata_format.js')
-rw-r--r-- | browser/components/sessionstore/test/browser_formdata_format.js | 113 |
1 files changed, 113 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 000000000..6a1b5975d --- /dev/null +++ b/browser/components/sessionstore/test/browser_formdata_format.js @@ -0,0 +1,113 @@ +/* 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 testTabCount = 0; + let callback = function() { + testTabCount--; + if (testTabCount == 0) { + finish(); + } + }; + + for (let i = 0; i < formData.length; i++) { + testTabCount++; + testTabRestoreData(formData[i], expectedValues[i], callback); + } +} + +function testTabRestoreData(aFormData, aExpectedValue, aCallback) { + let URL = ROOT + "browser_formdata_format_sample.html"; + let tab = gBrowser.addTab("about:blank"); + let browser = tab.linkedBrowser; + + aFormData.url = URL; + let tabState = { entries: [{ url: URL }], formdata: aFormData }; + + Task.spawn(function () { + yield promiseBrowserLoaded(tab.linkedBrowser); + yield promiseTabState(tab, tabState); + + yield 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"].indexOf(key) === -1) { + 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); + + // This test might time out if the task fails. + }).then(aCallback); +} |