browser/components/sessionstore/test/browser_formdata_format.js

changeset 0
6474c204b198
     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 +}

mercurial