dom/filesystem/tests/test_webkitdirectory.html
author Adam Pucciano <aspucciano@myseneca.ca>
Wed, 05 Dec 2018 02:24:58 +0000
changeset 449368 3930f1e2fc9e26f09c9722a941cb77bb28956d0d
parent 417743 a3ebab26f0d9e962f1f892335838ee1b51335378
child 469658 ba6f655fd68963530c866d0d4a48c3db3d307777
permissions -rw-r--r--
Bug 1508989 - Enable ESLint for dom/filesystem / (automatic changes) r=Standard8 Differential Revision: https://phabricator.services.mozilla.com/D13770

<!DOCTYPE HTML>
<html>
<head>
  <title>Test for webkitdirectory and webkitRelativePath</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>

<body>
<input id="inputFileWebkitDirectory" type="file" webkitdirectory></input>
<input id="inputFileWebkitDirectoryAndDirectory" type="file" webkitdirectory allowdirs></input>
<input id="inputFileDirectory" type="file" allowdirs></input>
<input id="inputFileDirectoryChange" type="file" webkitdirectory></input>

<script type="application/javascript">

function populateInputFile(aInputFile) {
  var url = SimpleTest.getTestFileURL("script_fileList.js");
  var script = SpecialPowers.loadChromeScript(url);

  var MockFilePicker = SpecialPowers.MockFilePicker;
  MockFilePicker.init(window, "A Mock File Picker", SpecialPowers.Ci.nsIFilePicker.modeOpen);

  function onOpened(message) {
    MockFilePicker.useDirectory(message.dir);

    var input = document.getElementById(aInputFile);
    input.setAttribute("data-name", message.name);
    input.addEventListener("change", function() {
      MockFilePicker.cleanup();
      script.destroy();
      next();
    }, {once: true});

    input.click();
  }

  script.addMessageListener("dir.opened", onOpened);
  script.sendAsyncMessage("dir.open", { path: "test" });
}

function checkFile(file, fileList, dirName) {
  for (var i = 0; i < fileList.length; ++i) {
    ok(fileList[i] instanceof File, "We want just files.");
    if (fileList[i].name == file.name) {
      is(fileList[i].webkitRelativePath, dirName + file.path, "Path matches");
      return;
    }
  }

  ok(false, "File not found.");
}

function test_fileList(aInputFile, aWhat) {
  var input = document.getElementById(aInputFile);
  var fileList = input.files;

  if (aWhat == null) {
    is(fileList, null, "We want a null fileList for " + aInputFile);
    next();
    return;
  }

  is(fileList.length, aWhat.length, "We want just " + aWhat.length + " elements for " + aInputFile);
  for (var i = 0; i < aWhat.length; ++i) {
    checkFile(aWhat[i], fileList, input.dataset.name);
  }

  next();
}

function test_webkitdirectory_attribute() {
  var a = document.createElement("input");
  a.setAttribute("type", "file");

  ok("webkitdirectory" in a, "HTMLInputElement.webkitdirectory exists");

  ok(!a.hasAttribute("webkitdirectory"), "No webkitdirectory DOM attribute by default");
  ok(!a.webkitdirectory, "No webkitdirectory attribute by default");

  a.webkitdirectory = true;

  ok(a.hasAttribute("webkitdirectory"), "Webkitdirectory DOM attribute is set");
  ok(a.webkitdirectory, "Webkitdirectory attribute is set");

  next();
}

function test_changeDataWhileWorking() {
  var url = SimpleTest.getTestFileURL("script_fileList.js");
  var script = SpecialPowers.loadChromeScript(url);

  var MockFilePicker = SpecialPowers.MockFilePicker;
  MockFilePicker.init(window, "A Mock File Picker", SpecialPowers.Ci.nsIFilePicker.modeOpen);

  // Let's start retrieving the root nsIFile object
  new Promise(function(resolve) {
    function onOpened(message) {
      script.removeMessageListener("dir.opened", onOpened);
      resolve(message.dir);
    }

    script.addMessageListener("dir.opened", onOpened);
    script.sendAsyncMessage("dir.open", { path: "root" });
  })

  // input.click() pointing to the root dir
  .then(function(aDir) {
    MockFilePicker.cleanup();
    MockFilePicker.init(window, "A Mock File Picker", SpecialPowers.Ci.nsIFilePicker.modeOpen);
    MockFilePicker.useDirectory(aDir);
    var input = document.getElementById("inputFileDirectoryChange");
    input.click();
  })

  // Before onchange, let's take the 'test' directory
  .then(function() {
    return new Promise(function(resolve) {
      function onOpened(message) {
        script.removeMessageListener("dir.opened", onOpened);
        script.destroy();
        resolve(message.dir);
      }

      script.addMessageListener("dir.opened", onOpened);
      script.sendAsyncMessage("dir.open", { path: "test" });
    });
  })

  // Now let's click again and wait for onchange.
  .then(function(aDir) {
    return new Promise(function(resolve) {
      MockFilePicker.cleanup();
      MockFilePicker.init(window, "A Mock File Picker", SpecialPowers.Ci.nsIFilePicker.modeOpen);
      MockFilePicker.useDirectory(aDir);

      var input = document.getElementById("inputFileDirectoryChange");
      input.addEventListener("change", function() {
        MockFilePicker.cleanup();
        resolve();
      });

      input.click();
    });
  })

  .then(function() {
    test_fileList("inputFileWebkitDirectory", testDirData);
  });
}

function test_setup() {
  SpecialPowers.pushPrefEnv({"set": [["dom.input.dirpicker", true],
                                     ["dom.filesystem.pathcheck.disabled", true],
                                     ["dom.webkitBlink.dirPicker.enabled", true]]}, next);
}

var testDirData = [ { name: "foo.txt", path: "/foo.txt" },
                    { name: "bar.txt", path: "/subdir/bar.txt" }];

var tests = [
  test_setup,

  function() { populateInputFile("inputFileWebkitDirectory"); },
  function() { populateInputFile("inputFileWebkitDirectoryAndDirectory"); },
  function() { populateInputFile("inputFileDirectory"); },

  function() { test_fileList("inputFileWebkitDirectory", testDirData); },
  function() { test_fileList("inputFileWebkitDirectoryAndDirectory", testDirData); },
  function() { test_fileList("inputFileDirectory", null); },

  test_webkitdirectory_attribute,

  test_changeDataWhileWorking,
];

function next() {
  if (!tests.length) {
    SimpleTest.finish();
    return;
  }

  var test = tests.shift();
  test();
}

SimpleTest.waitForExplicitFinish();
next();
</script>
</body>
</html>