diff --git a/src/webapp/components/uploader/js/FileQueueView.js b/src/webapp/components/uploader/js/FileQueueView.js index 58b88f30ac..ccd6917124 100644 --- a/src/webapp/components/uploader/js/FileQueueView.js +++ b/src/webapp/components/uploader/js/FileQueueView.js @@ -294,23 +294,10 @@ var fluid_1_4 = fluid_1_4 || {}; that.rowProgressorTemplate = that.locate("rowProgressorTemplate", that.options.uploaderContainer).remove(); }; - // TODO: Delete this when we have a viable way of declaratively registering listeners. - var bindModelEvents = function (that) { - that.events.afterFileQueued.addListener(that.addFile); - that.events.onUploadStart.addListener(that.prepareForUpload); - that.events.onFileStart.addListener(that.showFileProgress); - that.events.onFileProgress.addListener(that.updateFileProgress); - that.events.onFileSuccess.addListener(that.markFileComplete); - that.events.onFileError.addListener(that.showErrorForFile); - that.events.afterFileComplete.addListener(that.hideFileProgress); - that.events.afterUploadComplete.addListener(that.refreshAfterUpload); - }; - var setupFileQueue = function (that) { fluid.initDependents(that); prepareTemplateElements(that); addKeyboardNavigation(that); - bindModelEvents(that); }; /** @@ -383,6 +370,10 @@ var fluid_1_4 = fluid_1_4 || {}; components: { scroller: { type: "fluid.scrollableTable" + }, + + eventBinder: { + type: "fluid.uploader.fileQueueView.eventBinder" } }, @@ -435,17 +426,6 @@ var fluid_1_4 = fluid_1_4 || {}; events: { onFileRemoved: "{multiFileUploader}.events.onFileRemoved", - - // TODO: FileQueueView only listens for these events. Move them - // somewhere more sensible when such a place exists. - afterFileQueued: "{multiFileUploader}.events.afterFileQueued", - onUploadStart: "{multiFileUploader}.events.onUploadStart", - onFileStart: "{multiFileUploader}.events.onFileStart", - onFileProgress: "{multiFileUploader}.events.onFileProgress", - onFileSuccess: "{multiFileUploader}.events.onFileSuccess", - onFileError: "{multiFileUploader}.events.onFileError", - afterFileComplete: "{multiFileUploader}.events.afterFileComplete", - afterUploadComplete: "{multiFileUploader}.events.afterUploadComplete" }, mergePolicy: { @@ -453,6 +433,30 @@ var fluid_1_4 = fluid_1_4 || {}; } }); + /** + * EventBinder declaratively binds FileQueueView's methods as listeners to Uploader events using IoC. + */ + fluid.defaults("fluid.uploader.fileQueueView.eventBinder", { + gradeNames: ["fluid.eventedComponent", "autoInit"] + }); + + fluid.demands("fluid.uploader.fileQueueView.eventBinder", [ + "fluid.uploader.multiFileUploader", + "fluid.uploader.fileQueueView" + ], { + options: { + listeners: { + "{multiFileUploader}.events.afterFileQueued": "{fileQueueView}.addFile", + "{multiFileUploader}.events.onUploadStart": "{fileQueueView}.prepareForUpload", + "{multiFileUploader}.events.onFileStart": "{fileQueueView}.showFileProgress", + "{multiFileUploader}.events.onFileProgress": "{fileQueueView}.updateFileProgress", + "{multiFileUploader}.events.onFileSuccess": "{fileQueueView}.markFileComplete", + "{multiFileUploader}.events.onFileError": "{fileQueueView}.showErrorForFile", + "{multiFileUploader}.events.afterFileComplete": "{fileQueueView}.hideFileProgress", + "{multiFileUploader}.events.afterUploadComplete": "{fileQueueView}.refreshAfterUpload" + } + } + }); /************** * Scrollable * diff --git a/src/webapp/tests/component-tests/uploader/js/DemoUploadManagerTests.js b/src/webapp/tests/component-tests/uploader/js/DemoUploadManagerTests.js index 632ac0ea81..cf54473aba 100644 --- a/src/webapp/tests/component-tests/uploader/js/DemoUploadManagerTests.js +++ b/src/webapp/tests/component-tests/uploader/js/DemoUploadManagerTests.js @@ -81,7 +81,6 @@ https://source.fluidproject.org/svn/LICENSE.txt var emptyFunction = function () {}; var listeners = { - onUploadStart: emptyFunction, onFileStart: emptyFunction, onFileProgress: emptyFunction, onFileSuccess: emptyFunction, @@ -102,20 +101,26 @@ https://source.fluidproject.org/svn/LICENSE.txt var uploadFilesAndTest = function (files, testBody) { var tracker = eventTracker(testBody); - fluid.mergeListeners(events, tracker.listeners); var queue = fluid.uploader.fileQueue(); queue.files = files; - var demoEngine = fluid.uploader.demoRemote(queue, events); - - // TODO: Major problem. This code is from the implementation of Uploader.start(), but is required - // before calling an engine's start() method. + var demo = fluid.uploader.demoRemote(queue, { + events: { + onFileProgress: null, + afterFileComplete: null, + afterUploadComplete: null, + onFileSuccess: null, + onFileStart: null, + onFileError: null, + onUploadStop: null + }, + + listeners: tracker.listeners + }); + queue.start(); - events.onUploadStart.fire(queue.currentBatch.files); - // - - demoEngine.uploadNextFile(); + demo.uploadNextFile(); tracker.transcript.files = files; return tracker.transcript; @@ -170,14 +175,8 @@ https://source.fluidproject.org/svn/LICENSE.txt demoUploadTests.asyncTest("Simulated upload flow: sequence of events.", function () { // Test with just one file. uploadFirstFileAndTest(function (transcript) { - jqUnit.assertEquals("We should have received seven upload events.", 7, transcript.length); - - jqUnit.assertEquals("The first event of a batch should be onUploadStart.", - "onUploadStart", transcript[0].name); - jqUnit.assertDeepEq("The argument to onUploadStart should be an array containing the current batch.", - transcript.files, transcript[0].args[0]); - - checkEventSequenceForFile(transcript.slice(1, transcript.length - 1), file1); + jqUnit.assertEquals("We should have received seven upload events.", 6, transcript.length); + checkEventSequenceForFile(transcript.slice(0, transcript.length - 1), file1); jqUnit.assertEquals("The last event of a batch should be afterUploadComplete.", "afterUploadComplete", transcript[transcript.length - 1].name); jqUnit.assertDeepEq("The argument to afterUploadComplete should be an array containing the current batch.", @@ -190,20 +189,16 @@ https://source.fluidproject.org/svn/LICENSE.txt demoUploadTests.asyncTest("Simulated upload flow: sequence of events for multiple files.", function () { // Upload three files. uploadAllFilesAndTest(function (transcript) { - jqUnit.assertEquals("We should have received twenty upload events.", 20, transcript.length); - jqUnit.assertEquals("The first event of a batch should be onUploadStart.", - "onUploadStart", transcript[0].name); - jqUnit.assertDeepEq("The argument to onUploadStart should be an array containing the current batch.", - transcript.files, transcript[0].args[0]); + jqUnit.assertEquals("We should have received nineteen upload events.", 19, transcript.length); // The first file is 400000 bytes, so it should have 2 progress events, for a total of 5 events. - checkEventSequenceForFile(transcript.slice(1, 6), file1); + checkEventSequenceForFile(transcript.slice(0, 5), file1); // The second file is 600000 bytes, so it should have 3 progress events, for a total of 6 events. - checkEventSequenceForFile(transcript.slice(6, 12), file2); + checkEventSequenceForFile(transcript.slice(5, 11), file2); // The second file is 800000 bytes, so it should have 4 progress events, for a total of 7 events. - checkEventSequenceForFile(transcript.slice(12, 19), file3); + checkEventSequenceForFile(transcript.slice(11, transcript.length - 1), file3); jqUnit.assertEquals("The last event of a batch should be afterUploadComplete.", "afterUploadComplete", transcript[transcript.length - 1].name); @@ -217,13 +212,13 @@ https://source.fluidproject.org/svn/LICENSE.txt uploadFirstFileAndTest(function (transcript) { // Check that we're getting valid progress data for the onFileProgress events. jqUnit.assertEquals("The first onFileProgress event should have 200000 bytes complete.", - 200000, transcript[2].args[1]); + 200000, transcript[1].args[1]); jqUnit.assertEquals("The first onFileProgress event should have 400000 bytes in total.", - 400000, transcript[2].args[2]); + 400000, transcript[1].args[2]); jqUnit.assertEquals("The first onFileProgress event should have 400000 bytes complete.", - 400000, transcript[3].args[1]); + 400000, transcript[2].args[1]); jqUnit.assertEquals("The first onFileProgress event should have 400000 bytes in total.", - 400000, transcript[3].args[2]); + 400000, transcript[2].args[2]); start(); }); }); @@ -232,9 +227,9 @@ https://source.fluidproject.org/svn/LICENSE.txt uploadSmallFileAndTest(function (transcript) { // Check that we're getting valid progress data for the onFileProgress events. jqUnit.assertEquals("The only onFileProgress event should have 165432 bytes complete.", - 165432, transcript[2].args[1]); + 165432, transcript[1].args[1]); jqUnit.assertEquals("The only onFileProgress event should have 165432 bytes in total.", - 165432, transcript[2].args[2]); + 165432, transcript[1].args[2]); jqUnit.assertNotEquals("There is only one onFileProgress event in the transcript.", "onFileProgress", transcript[3].name); start(); @@ -245,15 +240,15 @@ https://source.fluidproject.org/svn/LICENSE.txt uploadNotMultipleFileAndTest(function (transcript) { // Check that we're getting valid progress data for the onFileProgress events. jqUnit.assertEquals("The first onFileProgress event should have 200000 bytes complete.", - 200000, transcript[2].args[1]); + 200000, transcript[1].args[1]); jqUnit.assertEquals("The second onFileProgress event should have 200000 more bytes complete.", - 400000, transcript[3].args[1]); + 400000, transcript[2].args[1]); jqUnit.assertEquals("The third onFileProgress event should have 200000 more bytes complete.", - 600000, transcript[4].args[1]); + 600000, transcript[3].args[1]); jqUnit.assertEquals("The fourth onFileProgress event should have 200000 more bytes complete.", - 800000, transcript[5].args[1]); + 800000, transcript[4].args[1]); jqUnit.assertEquals("The last onFileProgress event should have 12345 more bytes complete.", - 812345, transcript[6].args[1]); + 812345, transcript[5].args[1]); start(); }); }); diff --git a/src/webapp/tests/component-tests/uploader/js/FileQueueViewTests.js b/src/webapp/tests/component-tests/uploader/js/FileQueueViewTests.js index 5f615b460b..478e345d53 100644 --- a/src/webapp/tests/component-tests/uploader/js/FileQueueViewTests.js +++ b/src/webapp/tests/component-tests/uploader/js/FileQueueViewTests.js @@ -22,13 +22,38 @@ https://source.fluidproject.org/svn/LICENSE.txt $(function () { var removedFile = null; - var mockEvents = { - onFileRemoved: { - fire: function (file) { + fluid.defaults("fluid.uploader.tests.multiFileUploader", { + gradeNames: ["fluid.eventedComponent", "autoInit"], + components: { + fileQueueView: { + type: "fluid.uploader.fileQueueView", + options: { + model: fluid.uploader.fileQueue().files, + uploaderContainer: "#main" + } + } + }, + events: { + onFileRemoved: null + }, + listeners: { + onFileRemoved: function (file) { removedFile = file; } } - }; + }); + + fluid.demands("fluid.uploader.fileQueueView", "fluid.uploader.tests.multiFileUploader", { + type: "fluid.uploader.fileQueueView", + args: [ + "#main .flc-uploader-queue", + "{options}" + ] + }); + + fluid.demands("fluid.uploader.fileQueueView.eventBinder", "fluid.uploader.tests.multiFileUploader", { + options: {} + }); var mountainTestFile = { id : 0, // SWFUpload file id, used for starting or cancelling and upload @@ -43,12 +68,10 @@ https://source.fluidproject.org/svn/LICENSE.txt name : "Ocean.jpg", // The file name. The path is not included. size : 950000000 // The file size in bytes }; - - var qEl; - + // Useful locate functions. var locateRows = function (q) { - return qEl.find(q.options.selectors.fileRows); + return $("#main .flc-uploader-queue").find(q.options.selectors.fileRows); }; var nameForRow = function (q, rowEl) { @@ -67,7 +90,7 @@ https://source.fluidproject.org/svn/LICENSE.txt // Reusable test functions var checkFileRow = function (q, file, row) { jqUnit.assertEquals("The added row should have the correct id attribute.", - file.id, row.attr("id")); + file.id, parseInt(row.attr("id"), 10)); jqUnit.assertEquals("The added row should have the correct filename.", file.name, nameForRow(q, row)); jqUnit.assertEquals("The added row should have the correct size.", @@ -76,24 +99,20 @@ https://source.fluidproject.org/svn/LICENSE.txt checkARIA(file, row); }; - var createFileQueue = function (qEl) { - var q = fluid.uploader.fileQueueView(qEl, mockEvents, { - model: fluid.uploader.fileQueue().files, - uploaderContainer: $("#main") - }); - return q; + var createFileQueue = function () { + var uploader = fluid.initComponent("fluid.uploader.tests.multiFileUploader"); + return uploader.fileQueueView; }; // File Queue test case var setupFunction = function () { - qEl = $("#main .flc-uploader-queue"); jqUnit.subvertAnimations(); }; var fileQueueViewTests = new jqUnit.TestCase("FileQueueView Tests", setupFunction); fileQueueViewTests.test("Add file", function () { - var q = createFileQueue(qEl); + var q = createFileQueue(); // Add one file. q.addFile(mountainTestFile); @@ -112,7 +131,7 @@ https://source.fluidproject.org/svn/LICENSE.txt }); fileQueueViewTests.test("Remove file", function () { - var q = createFileQueue(qEl); + var q = createFileQueue(); // Add a file, then remove it. q.addFile(mountainTestFile); @@ -155,7 +174,7 @@ https://source.fluidproject.org/svn/LICENSE.txt fileQueueViewTests.test("Prepare for upload/ Refresh for upload", function () { expect(2); - var q = createFileQueue(qEl); + var q = createFileQueue(); q.addFile(mountainTestFile); q.addFile(oceanTestFile); @@ -173,7 +192,7 @@ https://source.fluidproject.org/svn/LICENSE.txt fileQueueViewTests.test("File Progress Percentage test", function () { expect(7); - var q = createFileQueue(qEl); + var q = createFileQueue(); q.addFile(mountainTestFile); q.updateFileProgress(mountainTestFile, "33999.99", mountainTestFile.size); //33999.99/400000 = 8.4999975% ~ 8% @@ -209,7 +228,7 @@ https://source.fluidproject.org/svn/LICENSE.txt fileQueueViewTests.test("Mark file complete test", function () { expect(2); - var q = createFileQueue(qEl); + var q = createFileQueue(); q.addFile(mountainTestFile); q.markFileComplete(mountainTestFile); @@ -224,7 +243,7 @@ https://source.fluidproject.org/svn/LICENSE.txt fileQueueViewTests.test("Show error for files", function () { expect(2); - var q = createFileQueue(qEl); + var q = createFileQueue(); mountainTestFile.filestatus = fluid.uploader.fileStatusConstants.ERROR; //manually add an error to the file q.addFile(mountainTestFile); q.showErrorForFile(mountainTestFile, -250); //fire a UPLOAD_FAILED error @@ -240,7 +259,7 @@ https://source.fluidproject.org/svn/LICENSE.txt fileQueueViewTests.test("Hide file progress", function () { expect(1); - var q = createFileQueue(qEl); + var q = createFileQueue(); mountainTestFile.filestatus = fluid.uploader.fileStatusConstants.COMPLETE; //manually set filestatus to complete q.addFile(mountainTestFile); q.hideFileProgress(mountainTestFile); @@ -250,11 +269,11 @@ https://source.fluidproject.org/svn/LICENSE.txt fileQueueViewTests.test("Keyboard navigation", function () { // Setup the queue. - var q = createFileQueue(qEl); + var q = createFileQueue(); q.addFile(mountainTestFile); q.addFile(oceanTestFile); - qEl.focus(); + $("#main .flc-uploader-queue").focus(); // Ensure that the first item is focussed. jqUnit.assertTrue("The first row should be selected.", locateRows(q).eq(0).hasClass(q.options.styles.selected)); @@ -267,11 +286,9 @@ https://source.fluidproject.org/svn/LICENSE.txt locateRows(q).eq(0).hasClass(q.options.styles.selected)); }); - /******************** * Scrollable tests * ********************/ - fileQueueViewTests.test("fluid.scrollableTable", function () { var table = $("#scrollableTable"); @@ -285,5 +302,4 @@ https://source.fluidproject.org/svn/LICENSE.txt }); }); - })(jQuery); diff --git a/src/webapp/tests/component-tests/uploader/js/HTML5UploaderSupportTests.js b/src/webapp/tests/component-tests/uploader/js/HTML5UploaderSupportTests.js index 29b409b56c..ceddc082d5 100644 --- a/src/webapp/tests/component-tests/uploader/js/HTML5UploaderSupportTests.js +++ b/src/webapp/tests/component-tests/uploader/js/HTML5UploaderSupportTests.js @@ -21,25 +21,22 @@ https://source.fluidproject.org/svn/LICENSE.txt /************************************************ * Utility Functions for setting up an Uploader * ************************************************/ - - var makeUploaderEventFirers = function () { - var mockUploader = {}; - fluid.instantiateFirers(mockUploader, fluid.defaults("fluid.uploader.multiFileUploader")); - return mockUploader.events; - }; - var makeListeners = function () { - return { - afterFileQueued: function () {}, - onQueueError: function () {}, - afterFileDialog: function () {} + var trackLocalListeners = function () { + var tracker = jqUnit.invocationTracker(); + var emptyFn = function () {}; + var listeners = { + afterFileQueued: emptyFn, + onQueueError: emptyFn, + afterFileDialog: emptyFn }; + tracker.interceptAll(listeners); + tracker.listeners = listeners; + return tracker; }; - var getLocalUploader = function (fileUploadLimit, fileSizeLimit, listeners, legacyBrowserFileLimit) { + var getLocalUploader = function (fileUploadLimit, fileSizeLimit, legacyBrowserFileLimit, tracker) { var queue = fluid.uploader.fileQueue(); - var events = makeUploaderEventFirers(); - fluid.mergeListeners(events, listeners); var local = fluid.uploader.html5Strategy.local(queue, legacyBrowserFileLimit, { components: { @@ -52,7 +49,12 @@ https://source.fluidproject.org/svn/LICENSE.txt fileUploadLimit: fileUploadLimit, fileSizeLimit: fileSizeLimit }, - events: events + events: { + afterFileQueued: null, + onQueueError: null, + afterFileDialog: null + }, + listeners: tracker.listeners }); // TODO: This code is tragic. Refactor the FileQueue and it can go. @@ -187,11 +189,8 @@ https://source.fluidproject.org/svn/LICENSE.txt file3 ]; - var tracker = jqUnit.invocationTracker(); - var listeners = makeListeners(); - tracker.interceptAll(listeners); - - var localUploader = getLocalUploader(3, 1, listeners, null); + var tracker = trackLocalListeners(); + var localUploader = getLocalUploader(3, 1, null, tracker); localUploader.addFiles(files); // Test #1: Two out of three files should have been added to the queue. The third is too large. @@ -213,11 +212,8 @@ https://source.fluidproject.org/svn/LICENSE.txt file3 ]; - var tracker = jqUnit.invocationTracker(); - var listeners = makeListeners(); - tracker.interceptAll(listeners); - - var localUploader = getLocalUploader(1, 0, listeners, 100000); + var tracker = trackLocalListeners(); + var localUploader = getLocalUploader(1, 0, 100000, tracker); localUploader.addFiles(files); // Test #1: One out of three files should have been added to the queue. @@ -239,11 +235,8 @@ https://source.fluidproject.org/svn/LICENSE.txt file3 ]; - var tracker = jqUnit.invocationTracker(); - var listeners = makeListeners(); - tracker.interceptAll(listeners); - - var localUploader = getLocalUploader(0, 0, listeners, 100000); + var tracker = trackLocalListeners(); + var localUploader = getLocalUploader(0, 0, 100000, tracker); localUploader.addFiles(files); // Test #1: All three files should have been added to the queue. @@ -265,11 +258,8 @@ https://source.fluidproject.org/svn/LICENSE.txt file3 ]; - var tracker = jqUnit.invocationTracker(); - var listeners = makeListeners(); - tracker.interceptAll(listeners); - - var localUploader = getLocalUploader(null, 0, listeners, 100000); + var tracker = trackLocalListeners(); + var localUploader = getLocalUploader(null, 0, 100000, tracker); localUploader.addFiles(files); // Test #1: All three files should have been added to the queue. @@ -291,11 +281,8 @@ https://source.fluidproject.org/svn/LICENSE.txt file3 ]; - var tracker = jqUnit.invocationTracker(); - var listeners = makeListeners(); - tracker.interceptAll(listeners); - - var localUploader = getLocalUploader(undefined, 0, listeners, 100000); + var tracker = trackLocalListeners(); + var localUploader = getLocalUploader(undefined, 0, 100000, tracker); localUploader.addFiles(files); // Test #1: All three files should have been added to the queue.