browser_formdata_format.js (4553B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 function test() { 7 /** Tests formdata format */ 8 waitForExplicitFinish(); 9 10 let formData = [ 11 {}, 12 // old format 13 { "#input1": "value0" }, 14 { 15 "#input1": "value1", 16 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value2", 17 }, 18 { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value3" }, 19 // new format 20 { id: { input1: "value4" } }, 21 { id: { input1: "value5" }, xpath: {} }, 22 { 23 id: { input1: "value6" }, 24 xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value7" }, 25 }, 26 { 27 id: {}, 28 xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value8" }, 29 }, 30 { 31 xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value9" }, 32 }, 33 // combinations 34 { "#input1": "value10", id: { input1: "value11" } }, 35 { 36 "#input1": "value12", 37 id: { input1: "value13" }, 38 xpath: { 39 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value14", 40 }, 41 }, 42 { 43 "#input1": "value15", 44 xpath: { 45 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value16", 46 }, 47 }, 48 { 49 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value17", 50 id: { input1: "value18" }, 51 }, 52 { 53 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value19", 54 id: { input1: "value20" }, 55 xpath: { 56 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value21", 57 }, 58 }, 59 { 60 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value22", 61 xpath: { 62 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value23", 63 }, 64 }, 65 { 66 "#input1": "value24", 67 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value25", 68 id: { input1: "value26" }, 69 }, 70 { 71 "#input1": "value27", 72 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value28", 73 id: { input1: "value29" }, 74 xpath: { 75 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value30", 76 }, 77 }, 78 { 79 "#input1": "value31", 80 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value32", 81 xpath: { 82 "/xhtml:html/xhtml:body/xhtml:input[@name='input2']": "value33", 83 }, 84 }, 85 ]; 86 let expectedValues = [ 87 ["", ""], 88 // old format 89 ["value0", ""], 90 ["value1", "value2"], 91 ["", "value3"], 92 // new format 93 ["value4", ""], 94 ["value5", ""], 95 ["value6", "value7"], 96 ["", "value8"], 97 ["", "value9"], 98 // combinations 99 ["value11", ""], 100 ["value13", "value14"], 101 ["", "value16"], 102 ["value18", ""], 103 ["value20", "value21"], 104 ["", "value23"], 105 ["value26", ""], 106 ["value29", "value30"], 107 ["", "value33"], 108 ]; 109 110 let promises = []; 111 for (let i = 0; i < formData.length; i++) { 112 promises.push(testTabRestoreData(formData[i], expectedValues[i])); 113 } 114 115 Promise.all(promises).then( 116 () => finish(), 117 ex => ok(false, ex) 118 ); 119 } 120 121 async function testTabRestoreData(aFormData, aExpectedValue) { 122 let URL = ROOT + "browser_formdata_format_sample.html"; 123 let tab = BrowserTestUtils.addTab(gBrowser, "about:blank"); 124 125 aFormData.url = URL; 126 let tabState = { 127 entries: [{ url: URL, triggeringPrincipal_base64 }], 128 formdata: aFormData, 129 }; 130 131 await BrowserTestUtils.browserLoaded(tab.linkedBrowser, { 132 wantLoad: "about:blank", 133 }); 134 await promiseTabState(tab, tabState); 135 136 await TabStateFlusher.flush(tab.linkedBrowser); 137 let restoredTabState = JSON.parse(ss.getTabState(tab)); 138 let restoredFormData = restoredTabState.formdata; 139 140 if (restoredFormData) { 141 let doc = tab.linkedBrowser.contentDocument; 142 let input1 = doc.getElementById("input1"); 143 let input2 = doc.querySelector("input[name=input2]"); 144 145 // test format 146 ok( 147 "id" in restoredFormData || "xpath" in restoredFormData, 148 "FormData format is valid: " + restoredFormData 149 ); 150 // validate that there are no old keys 151 for (let key of Object.keys(restoredFormData)) { 152 if (!["id", "xpath", "url"].includes(key)) { 153 ok(false, "FormData format is invalid."); 154 } 155 } 156 // test id 157 is( 158 input1.value, 159 aExpectedValue[0], 160 "FormData by 'id' has been restored correctly" 161 ); 162 // test xpath 163 is( 164 input2.value, 165 aExpectedValue[1], 166 "FormData by 'xpath' has been restored correctly" 167 ); 168 } 169 170 // clean up 171 gBrowser.removeTab(tab); 172 }