|
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 { "#input1" : "value1", "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value2" }, |
|
15 { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value3" }, |
|
16 // new format |
|
17 { id: { "input1" : "value4" } }, |
|
18 { id: { "input1" : "value5" }, xpath: {} }, |
|
19 { id: { "input1" : "value6" }, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value7" } }, |
|
20 { id: {}, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value8" } }, |
|
21 { xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value9" } }, |
|
22 // combinations |
|
23 { "#input1" : "value10", id: { "input1" : "value11" } }, |
|
24 { "#input1" : "value12", id: { "input1" : "value13" }, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value14" } }, |
|
25 { "#input1" : "value15", xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value16" } }, |
|
26 { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value17", id: { "input1" : "value18" } }, |
|
27 { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value19", id: { "input1" : "value20" }, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value21" } }, |
|
28 { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value22", xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value23" } }, |
|
29 { "#input1" : "value24", "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value25", id: { "input1" : "value26" } }, |
|
30 { "#input1" : "value27", "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value28", id: { "input1" : "value29" }, xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value30" } }, |
|
31 { "#input1" : "value31", "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value32", xpath: { "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value33" } } |
|
32 ] |
|
33 let expectedValues = [ |
|
34 [ "" , "" ], |
|
35 // old format |
|
36 [ "value0", "" ], |
|
37 [ "value1", "value2" ], |
|
38 [ "", "value3" ], |
|
39 // new format |
|
40 [ "value4", "" ], |
|
41 [ "value5", "" ], |
|
42 [ "value6", "value7" ], |
|
43 [ "", "value8" ], |
|
44 [ "", "value9" ], |
|
45 // combinations |
|
46 [ "value11", "" ], |
|
47 [ "value13", "value14" ], |
|
48 [ "", "value16" ], |
|
49 [ "value18", "" ], |
|
50 [ "value20", "value21" ], |
|
51 [ "", "value23" ], |
|
52 [ "value26", "" ], |
|
53 [ "value29", "value30" ], |
|
54 [ "", "value33" ] |
|
55 ]; |
|
56 let testTabCount = 0; |
|
57 let callback = function() { |
|
58 testTabCount--; |
|
59 if (testTabCount == 0) { |
|
60 finish(); |
|
61 } |
|
62 }; |
|
63 |
|
64 for (let i = 0; i < formData.length; i++) { |
|
65 testTabCount++; |
|
66 testTabRestoreData(formData[i], expectedValues[i], callback); |
|
67 } |
|
68 } |
|
69 |
|
70 function testTabRestoreData(aFormData, aExpectedValue, aCallback) { |
|
71 let URL = ROOT + "browser_formdata_format_sample.html"; |
|
72 let tab = gBrowser.addTab("about:blank"); |
|
73 let browser = tab.linkedBrowser; |
|
74 let tabState = { entries: [{ url: URL, formdata: aFormData}] }; |
|
75 |
|
76 Task.spawn(function () { |
|
77 yield promiseBrowserLoaded(tab.linkedBrowser); |
|
78 |
|
79 ss.setTabState(tab, JSON.stringify(tabState)); |
|
80 yield promiseTabRestored(tab); |
|
81 |
|
82 SyncHandlers.get(tab.linkedBrowser).flush(); |
|
83 let restoredTabState = JSON.parse(ss.getTabState(tab)); |
|
84 let restoredFormData = restoredTabState.formdata; |
|
85 |
|
86 if (restoredFormData) { |
|
87 let doc = tab.linkedBrowser.contentDocument; |
|
88 let input1 = doc.getElementById("input1"); |
|
89 let input2 = doc.querySelector("input[name=input2]"); |
|
90 |
|
91 // test format |
|
92 ok("id" in restoredFormData || "xpath" in restoredFormData, |
|
93 "FormData format is valid: " + restoredFormData); |
|
94 // validate that there are no old keys |
|
95 for (let key of Object.keys(restoredFormData)) { |
|
96 if (["id", "xpath", "url"].indexOf(key) === -1) { |
|
97 ok(false, "FormData format is invalid."); |
|
98 } |
|
99 } |
|
100 // test id |
|
101 is(input1.value, aExpectedValue[0], |
|
102 "FormData by 'id' has been restored correctly"); |
|
103 // test xpath |
|
104 is(input2.value, aExpectedValue[1], |
|
105 "FormData by 'xpath' has been restored correctly"); |
|
106 } |
|
107 |
|
108 // clean up |
|
109 gBrowser.removeTab(tab); |
|
110 |
|
111 // This test might time out if the task fails. |
|
112 }).then(aCallback); |
|
113 } |