| <html> |
| <body> |
| <script src="resources/fs-test-util.js"></script> |
| <div>This tests basic cross-filesystem operations.</div> |
| |
| <div id="destination" style="min-height:100px; border: solid 1px black">Drop files here if you test this manually</div> |
| |
| <div id="console"></div> |
| |
| <script> |
| var methods = [ 'copyTo', 'moveTo' ]; |
| var sourceTestDirectory, destTestDirectory; |
| |
| var destDirectoryPath = '/test'; |
| var sourceDirectoryPath = '../../editing/pasteboard/resources'; |
| |
| // Actual files in the sourceDirectoryPath. |
| var testFiles = [ |
| { path:'apple.gif' }, |
| { path:'mozilla.gif' }, |
| { path:'drop-file-svg.svg' }, |
| { path:'copy-backslash-euc.html' }, |
| { path:'test_directory', directory:true }, |
| { path:'test_directory/test.txt' } |
| ]; |
| |
| // Note: for now we don't run moveTo test since drag-and-drop isolated |
| // filesystem, which we use for source filesystem, is read-only. |
| // FIXME: allow writing to PERSISTENT filesystem without quota error in |
| // DumpRenderTree so that we can test TEMPORARY <-> PERSISTENT cross operation |
| // checks. |
| var tests = [ |
| testCopyFile, |
| testCopyDirectory, |
| ]; |
| |
| function log(text) |
| { |
| var console = document.getElementById('console'); |
| console.appendChild(document.createTextNode(text)); |
| console.appendChild(document.createElement('br')); |
| } |
| |
| function test(expect, actual) |
| { |
| log((expect == actual ? 'PASS' : 'FAIL') + ': "' + expect + '" == "' + actual + '"'); |
| } |
| |
| |
| function errorCallback(msg) |
| { |
| return function(e) { |
| console.log(e); |
| log('ERROR:' + msg + ': ' + e.name); |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| }; |
| } |
| |
| function setupDestFileSystem(successCallback) { |
| webkitRequestFileSystem(window.TEMPORARY, 1024, function (fs) { |
| removeAllInDirectory(fs.root, function() { |
| fs.root.getDirectory( |
| destDirectoryPath, |
| {create:true}, |
| function (entry) { |
| destTestDirectory = entry; |
| successCallback(); |
| }, |
| errorCallback(`dest: createDirectory(${destDirectoryPath})`)); |
| }, errorCallback('dest: removeAllInDirectory')); |
| }, errorCallback('dest: requestFileSystem for PERSISTENT')); |
| } |
| |
| function runTests(index, successCallback) { |
| if (index >= tests.length) { |
| successCallback(); |
| return; |
| } |
| var next = function() { runTests(index + 1, successCallback); }; |
| resetDirectory(destTestDirectory, function() { tests[index](next); }); |
| } |
| |
| function testCopyFile(successCallback) { |
| testOnFile(0, 'copyTo', successCallback); |
| } |
| |
| function testCopyDirectory(successCallback) { |
| testOnDirectory(0, 'copyTo', successCallback); |
| } |
| |
| function testOnFile(index, method, successCallback) { |
| if (index >= testFiles.length) { |
| successCallback(); |
| return; |
| } |
| var next = function() { testOnFile(index + 1, method, successCallback); }; |
| if (testFiles[index].directory) { |
| next(); |
| return; |
| } |
| var file = testFiles[index]; |
| log('Testing ' + method + ' ' + file.path + ': ' + sourceTestDirectory.fullPath + ' => ' + destTestDirectory.fullPath); |
| sourceTestDirectory.getFile( |
| file.path, {create:false}, function(source) { |
| source[method](destTestDirectory, '', function(dest) { |
| verifyFile(source, dest, next); |
| }, errorCallback('testOnFile: ' + method + ':' + file.path)); |
| }, errorCallback('testOnFile: getFile:' + file.path)); |
| } |
| |
| function testOnDirectory(index, method, successCallback) { |
| if (index >= testFiles.length) { |
| successCallback(); |
| return; |
| } |
| var next = function() { testOnFile(index + 1, method, successCallback); }; |
| if (!testFiles[index].directory) { |
| next(); |
| return; |
| } |
| var file = testFiles[index]; |
| log('Testing ' + method + ' ' + file.path + ': ' + sourceTestDirectory.fullPath + ' => ' + destTestDirectory.fullPath); |
| sourceTestDirectory.getDirectory( |
| file.path, {create:false}, function(source) { |
| source[method](destTestDirectory, '', function(dest) { |
| verifyFile(source, dest, next); |
| }, errorCallback('testOnDirectory: ' + method + ':' + file.path)); |
| }, errorCallback('testOnDirectory: getDirectory:' + file.path)); |
| } |
| |
| function verifyFile(source, dest, successCallback) { |
| test(source.name, dest.name); |
| source.getMetadata(function(sourceMetadata) { |
| var expectedSize = sourceMetadata.size; |
| dest.getMetadata(function(destMetadata) { |
| test(expectedSize, destMetadata.size); |
| successCallback(); |
| }, errorCallback('getMetadata:' + dest.fullPath)); |
| }, errorCallback('getMetadata:' + source.fullPath)); |
| } |
| |
| function verifyDirectory(source, dest, successCallback) { |
| getDirectoryEntries(source, function(sourceEntries) { |
| getDirectoryEntries(dest, function(destEntries) { |
| sourceEntries.sort(); |
| destEntries.sort(); |
| test(sourceEntries.length, destEntries.length); |
| var verifyOne = function(index) { |
| verifyFile(sourceEntries[index], destEntries[index], function() { |
| if (index >= sourceEntries.length) { |
| successCallback(); |
| return; |
| } |
| verifyOne(index + 1); |
| }); |
| }; |
| verifyOne(0); |
| }); |
| }); |
| } |
| |
| function getDirectoryEntries(entry, entriesCallback) { |
| var allEntries = []; |
| var addEntries = function(entries, continueCallback) { |
| if (entries.length == 0) { |
| entriesCallback(allEntries); |
| return; |
| } |
| allEntries.concat(entries); |
| if (entries.length != 0) continueCallback(); |
| }; |
| var entriesCallback = function(entries) { |
| addEntries(entries, successCallback, function() { |
| reader.readDirectory(entriesCallback); |
| }); |
| }; |
| var reader = entry.createReader(); |
| reader.readDirectory(entriesCallback, errorCallback('readDirectory: ' + entry.fullPath)); |
| } |
| |
| function cleanupDirectory(directory, successCallback) { |
| directory.removeRecursively( |
| successCallback, |
| errorCallback('removeRecursively:' + directory.fullPath)); |
| } |
| |
| function resetDirectory(directory, successCallback) { |
| var fs = directory.filesystem; |
| var path = directory.fullPath; |
| cleanupDirectory(directory, function() { |
| fs.root.getDirectory(path, {create:true}, |
| function () { |
| log(fs.name + ': reset ' + path); |
| successCallback(); |
| }, errorCallback('getDirectory(create):' + path)); |
| }); |
| } |
| |
| function setupFiles(root, index, successCallback) |
| { |
| if (index >= testFiles.length) { |
| successCallback(); |
| return; |
| } |
| var file = testFiles[index]; |
| var msg = 'create testFiles[' + index + ']: ' + file.path; |
| var callback = function(entry) { setupFiles(root, index + 1, successCallback); }; |
| if (file.directory) { |
| root.getDirectory(destDirectoryPath + '/' + file.path, {create:true}, callback, errorCallback(msg)); |
| return; |
| } |
| |
| root.getFile(file.path, {create:true}, function(entry) { |
| entry.createWriter(function (writer) { |
| writer.truncate(file.size); |
| writer.onerror = errorCallback('truncate ' + entry.fullPath); |
| writer.onwriteend = callback; |
| }, errorCallback('create writer for ' + entry.fullPath)); |
| }, errorCallback(msg)); |
| } |
| |
| function startTest(e) { |
| e.stopPropagation(e); |
| e.preventDefault(); |
| |
| log('Verifying contents of DataTransferItems...'); |
| var items = e.dataTransfer.items; |
| test(1, items.length); |
| test('file', items[0].kind); |
| |
| var entry = items[0].webkitGetAsEntry(); |
| test(true, entry.isDirectory); |
| sourceTestDirectory = entry; |
| setupDestFileSystem(function() { |
| log('Successfully setup test environment.'); |
| runTests(0, function() { |
| log('Successfully ran ' + tests.length + ' tests.'); |
| cleanupDirectory(destTestDirectory, function() { |
| log('Cleanup done.'); |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| }); |
| }); |
| }); |
| } |
| |
| var destination = document.getElementById('destination'); |
| destination.addEventListener('dragover', function(e) { |
| e.stopPropagation(); |
| e.preventDefault(); |
| }, false); |
| destination.addEventListener('drop', startTest, false); |
| |
| if (window.testRunner) { |
| testRunner.waitUntilDone(); |
| testRunner.dumpAsText(); |
| |
| eventSender.beginDragWithFiles([sourceDirectoryPath]); |
| eventSender.leapForward(100); |
| eventSender.mouseMoveTo(destination.offsetLeft + 10, destination.offsetTop + destination.offsetHeight / 2); |
| eventSender.mouseUp(); |
| } |
| |
| </script> |
| </body> |
| </html> |