browser/components/sessionstore/test/browser_formdata_xpath.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/ */
     4 "use strict";
     6 const URL = ROOT + "browser_formdata_xpath_sample.html";
     8 /**
     9  * Bug 346337 - Generic form data restoration tests.
    10  */
    11 add_task(function setup() {
    12   // make sure we don't save form data at all (except for tab duplication)
    13   Services.prefs.setIntPref("browser.sessionstore.privacy_level", 2);
    15   registerCleanupFunction(() => {
    16     Services.prefs.clearUserPref("browser.sessionstore.privacy_level");
    17   });
    18 });
    20 const FILE1 = createFilePath("346337_test1.file");
    21 const FILE2 = createFilePath("346337_test2.file");
    23 const FIELDS = {
    24   "//input[@name='input']":     Date.now().toString(),
    25   "//input[@name='spaced 1']":  Math.random().toString(),
    26   "//input[3]":                 "three",
    27   "//input[@type='checkbox']":  true,
    28   "//input[@name='uncheck']":   false,
    29   "//input[@type='radio'][1]":  false,
    30   "//input[@type='radio'][2]":  true,
    31   "//input[@type='radio'][3]":  false,
    32   "//select":                   2,
    33   "//select[@multiple]":        [1, 3],
    34   "//textarea[1]":              "",
    35   "//textarea[2]":              "Some text... " + Math.random(),
    36   "//textarea[3]":              "Some more text\n" + new Date(),
    37   "//input[@type='file'][1]":   [FILE1],
    38   "//input[@type='file'][2]":   [FILE1, FILE2]
    39 };
    41 add_task(function test_form_data_restoration() {
    42   // Load page with some input fields.
    43   let tab = gBrowser.addTab(URL);
    44   let browser = tab.linkedBrowser;
    45   yield promiseBrowserLoaded(browser);
    47   // Fill in some values.
    48   for (let xpath of Object.keys(FIELDS)) {
    49     yield setFormValue(browser, xpath);
    50   }
    52   // Duplicate the tab.
    53   let tab2 = gBrowser.duplicateTab(tab);
    54   let browser2 = tab2.linkedBrowser;
    55   yield promiseTabRestored(tab2);
    57   // Check that all form values have been duplicated.
    58   for (let xpath of Object.keys(FIELDS)) {
    59     let expected = JSON.stringify(FIELDS[xpath]);
    60     let actual = JSON.stringify(yield getFormValue(browser2, xpath));
    61     is(actual, expected, "The value for \"" + xpath + "\" was correctly restored");
    62   }
    64   // Remove all tabs.
    65   gBrowser.removeTab(tab2);
    66   gBrowser.removeTab(tab);
    68   // Restore one of the tabs again.
    69   tab = ss.undoCloseTab(window, 0);
    70   browser = tab.linkedBrowser;
    71   yield promiseTabRestored(tab);
    73   // Check that none of the form values have been restored due to the privacy
    74   // level settings.
    75   for (let xpath of Object.keys(FIELDS)) {
    76     let expected = FIELDS[xpath];
    77     if (expected) {
    78       let actual = yield getFormValue(browser, xpath, expected);
    79       isnot(actual, expected, "The value for \"" + xpath + "\" was correctly discarded");
    80     }
    81   }
    83   // Cleanup.
    84   gBrowser.removeTab(tab);
    85 });
    87 function createFilePath(leaf) {
    88   let file = Services.dirsvc.get("TmpD", Ci.nsIFile);
    89   file.append(leaf);
    90   return file.path;
    91 }
    93 function isArrayOfNumbers(value) {
    94   return Array.isArray(value) && value.every(n => typeof(n) === "number");
    95 }
    97 function isArrayOfStrings(value) {
    98   return Array.isArray(value) && value.every(n => typeof(n) === "string");
    99 }
   101 function getFormValue(browser, xpath) {
   102   let value = FIELDS[xpath];
   104   if (typeof value == "string") {
   105     return getInputValue(browser, {xpath: xpath});
   106   }
   108   if (typeof value == "boolean") {
   109     return getInputChecked(browser, {xpath: xpath});
   110   }
   112   if (typeof value == "number") {
   113     return getSelectedIndex(browser, {xpath: xpath});
   114   }
   116   if (isArrayOfNumbers(value)) {
   117     return getMultipleSelected(browser, {xpath: xpath});
   118   }
   120   if (isArrayOfStrings(value)) {
   121     return getFileNameArray(browser, {xpath: xpath});
   122   }
   124   throw new Error("unknown input type");
   125 }
   127 function setFormValue(browser, xpath) {
   128   let value = FIELDS[xpath];
   130   if (typeof value == "string") {
   131     return setInputValue(browser, {xpath: xpath, value: value});
   132   }
   134   if (typeof value == "boolean") {
   135     return setInputChecked(browser, {xpath: xpath, checked: value});
   136   }
   138   if (typeof value == "number") {
   139     return setSelectedIndex(browser, {xpath: xpath, index: value});
   140   }
   142   if (isArrayOfNumbers(value)) {
   143     return setMultipleSelected(browser, {xpath: xpath, indices: value});
   144   }
   146   if (isArrayOfStrings(value)) {
   147     return setFileNameArray(browser, {xpath: xpath, names: value});
   148   }
   150   throw new Error("unknown input type");
   151 }

mercurial