1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/components/sessionstore/test/browser_formdata_format.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,113 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +"use strict"; 1.8 + 1.9 +function test() { 1.10 + /** Tests formdata format **/ 1.11 + waitForExplicitFinish(); 1.12 + 1.13 + let formData = [ 1.14 + { }, 1.15 + // old format 1.16 + { "#input1" : "value0" }, 1.17 + { "#input1" : "value1", "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value2" }, 1.18 + { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value3" }, 1.19 + // new format 1.20 + { id: { "input1" : "value4" } }, 1.21 + { id: { "input1" : "value5" }, xpath: {} }, 1.22 + { id: { "input1" : "value6" }, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value7" } }, 1.23 + { id: {}, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value8" } }, 1.24 + { xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value9" } }, 1.25 + // combinations 1.26 + { "#input1" : "value10", id: { "input1" : "value11" } }, 1.27 + { "#input1" : "value12", id: { "input1" : "value13" }, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value14" } }, 1.28 + { "#input1" : "value15", xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value16" } }, 1.29 + { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value17", id: { "input1" : "value18" } }, 1.30 + { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value19", id: { "input1" : "value20" }, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value21" } }, 1.31 + { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value22", xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value23" } }, 1.32 + { "#input1" : "value24", "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value25", id: { "input1" : "value26" } }, 1.33 + { "#input1" : "value27", "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value28", id: { "input1" : "value29" }, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value30" } }, 1.34 + { "#input1" : "value31", "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value32", xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value33" } } 1.35 + ] 1.36 + let expectedValues = [ 1.37 + [ "" , "" ], 1.38 + // old format 1.39 + [ "value0", "" ], 1.40 + [ "value1", "value2" ], 1.41 + [ "", "value3" ], 1.42 + // new format 1.43 + [ "value4", "" ], 1.44 + [ "value5", "" ], 1.45 + [ "value6", "value7" ], 1.46 + [ "", "value8" ], 1.47 + [ "", "value9" ], 1.48 + // combinations 1.49 + [ "value11", "" ], 1.50 + [ "value13", "value14" ], 1.51 + [ "", "value16" ], 1.52 + [ "value18", "" ], 1.53 + [ "value20", "value21" ], 1.54 + [ "", "value23" ], 1.55 + [ "value26", "" ], 1.56 + [ "value29", "value30" ], 1.57 + [ "", "value33" ] 1.58 + ]; 1.59 + let testTabCount = 0; 1.60 + let callback = function() { 1.61 + testTabCount--; 1.62 + if (testTabCount == 0) { 1.63 + finish(); 1.64 + } 1.65 + }; 1.66 + 1.67 + for (let i = 0; i < formData.length; i++) { 1.68 + testTabCount++; 1.69 + testTabRestoreData(formData[i], expectedValues[i], callback); 1.70 + } 1.71 +} 1.72 + 1.73 +function testTabRestoreData(aFormData, aExpectedValue, aCallback) { 1.74 + let URL = ROOT + "browser_formdata_format_sample.html"; 1.75 + let tab = gBrowser.addTab("about:blank"); 1.76 + let browser = tab.linkedBrowser; 1.77 + let tabState = { entries: [{ url: URL, formdata: aFormData}] }; 1.78 + 1.79 + Task.spawn(function () { 1.80 + yield promiseBrowserLoaded(tab.linkedBrowser); 1.81 + 1.82 + ss.setTabState(tab, JSON.stringify(tabState)); 1.83 + yield promiseTabRestored(tab); 1.84 + 1.85 + SyncHandlers.get(tab.linkedBrowser).flush(); 1.86 + let restoredTabState = JSON.parse(ss.getTabState(tab)); 1.87 + let restoredFormData = restoredTabState.formdata; 1.88 + 1.89 + if (restoredFormData) { 1.90 + let doc = tab.linkedBrowser.contentDocument; 1.91 + let input1 = doc.getElementById("input1"); 1.92 + let input2 = doc.querySelector("input[name=input2]"); 1.93 + 1.94 + // test format 1.95 + ok("id" in restoredFormData || "xpath" in restoredFormData, 1.96 + "FormData format is valid: " + restoredFormData); 1.97 + // validate that there are no old keys 1.98 + for (let key of Object.keys(restoredFormData)) { 1.99 + if (["id", "xpath", "url"].indexOf(key) === -1) { 1.100 + ok(false, "FormData format is invalid."); 1.101 + } 1.102 + } 1.103 + // test id 1.104 + is(input1.value, aExpectedValue[0], 1.105 + "FormData by 'id' has been restored correctly"); 1.106 + // test xpath 1.107 + is(input2.value, aExpectedValue[1], 1.108 + "FormData by 'xpath' has been restored correctly"); 1.109 + } 1.110 + 1.111 + // clean up 1.112 + gBrowser.removeTab(tab); 1.113 + 1.114 + // This test might time out if the task fails. 1.115 + }).then(aCallback); 1.116 +}