summaryrefslogtreecommitdiffstats
path: root/third_party/WebKit/LayoutTests/fast/forms/file/input-file-entries.html
blob: 629c9bdc0a29d61e71a97e9f9135a6573e0736c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<!DOCTYPE html>
<html>
<body>
<input type="file" name="files" id="files">
<pre id="console"></pre>
<script src="../../../resources/js-test.js"></script>
<script>
description('Tests the webkitEntries attribute of &lt;input type="file"&gt;');

var testCases = [
  // Single file.
  ['dir1/UTF8.txt'],
  // Single directory.
  ['dir1'],
  // Multiple files.
  ['apple.gif', 'dir1/UTF8.txt', 'dir2/green.jpg'],
  // Multiple directories.
  ['dir1', 'dir2'],
  // Mixed case.
  ['dir1', 'dir1/UTF8.txt', 'test.txt', 'dir2']
];

// The expected directories/files info in the actual resources directory.
var expectedFileAttributes = {
  'dir1': { 'directory': true, 'files':[ '/dir1/UTF8.txt', '/dir1/UTF8-2.txt' ] },
  'dir2': { 'directory': true, 'files':[ '/dir2/green.jpg' ] },
  'apple.gif':       { 'directory': false, 'size': 3340 },
  'test.txt':        { 'directory': false, 'size': 5 },
  'dir1/UTF8.txt':   { 'directory': false, 'size': 5 },
  'dir1/UTF8-2.txt': { 'directory': false, 'size': 9 },
  'dir2/green.jpg':  { 'directory': false, 'size': 764 }
};

var droppedEntries, verifyingEntry, returnedMetadata, returnedEntries;

var jsTestIsAsync = true;
if (window.testRunner) {
    testRunner.waitUntilDone();
    doTest(0);
}

function doTest(index)
{
    if (index >= testCases.length) {
      finishJSTest();
      return;
    }

    debug('* Testing testCases[' + index + ']');
    var paths = testCases[index];
    var input = document.getElementById('files');
    input.onchange = function() { onInputFileChange(index); };
    if (paths.length > 1)
        input.setAttribute('multiple', 'multiple')
    else
        input.removeAttribute('multiple')
    var testPaths = paths.map(function(path) { return '../resources/' + path });
    eventSender.beginDragWithFiles(testPaths);
    var centerX = input.offsetLeft + input.offsetWidth / 2;
    var centerY = input.offsetTop + input.offsetHeight / 2;
    eventSender.mouseMoveTo(centerX, centerY);
    eventSender.mouseUp();
}

function onInputFileChange(index)
{
    droppedEntries = document.getElementById('files').webkitEntries;
    shouldEvaluateTo('droppedEntries.length', testCases[index].length);
    verifyEntry(index, 0);
}

function verifyEntry(testIndex, entryIndex)
{
    if (entryIndex == testCases[testIndex].length) {
        doTest(testIndex + 1);
        return;
    }

    var entry = verifyingEntry = droppedEntries[entryIndex];
    debug('Verifying entry (' + entryIndex + '/' + testCases[testIndex].length + '):' + entry.fullPath);

    var path = testCases[testIndex][entryIndex];
    var expected = expectedFileAttributes[path];
    var expectedPath = '/' + getBaseName(path);

    shouldBeEqualToString('verifyingEntry.fullPath', expectedPath);
    shouldEvaluateTo('verifyingEntry.isDirectory', expected.directory);

    var callback = function() { verifyEntry(testIndex, entryIndex + 1); };
    if (entry.isFile) {
        entry.getMetadata(verifyFile.bind(this, expected, callback), onError);
    } else {
        var reader = entry.createReader();
        reader.readEntries(verifyDirectory.bind(this, expected, callback), onError);
    }
}

function verifyFile(expected, callback, metadata)
{
    returnedMetadata = metadata;
    shouldEvaluateTo('returnedMetadata.size', expected.size);
    callback();
}

function verifyDirectory(expected, callback, entries)
{
    returnedEntries = [];
    for (var i = 0; i < entries.length; i++) {
        // Skip the entries that start with '.' (so that we do not get '.svn' etc)
        if (entries[i].name.indexOf('.') == 0)
            continue;
        returnedEntries.push(entries[i].fullPath);
    }
    returnedEntries.sort();
    shouldEvaluateTo('returnedEntries.length', expected.files.length);
    for (var i = 0; i < returnedEntries.length; i++)
        debug(returnedEntries[i]);
    callback();
}

function getBaseName(path)
{
    var components = path.split('/');
    return components[components.length - 1];
}

function onError(error)
{
    testFailed('Test finished with unexpected error: ' + error.code);
    finishJSTest();
}

</script>
</body>
</html>