tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }