Bug 852478 - Store the date and time of downloads. r=paolo

This commit is contained in:
Raymond Lee 2013-05-10 20:26:10 +08:00
Родитель 0d48310a84
Коммит a8d07a4b9a
3 изменённых файлов: 56 добавлений и 0 удалений

Просмотреть файл

@ -128,6 +128,13 @@ Download.prototype = {
*/ */
error: null, error: null,
/**
* Indicates the start time of the download. When the download starts,
* this property is set to a valid Date object. The default value is null
* before the download starts.
*/
startTime: null,
/** /**
* Indicates whether this download's "progress" property is able to report * Indicates whether this download's "progress" property is able to report
* partial progress while the download proceeds, and whether the value in * partial progress while the download proceeds, and whether the value in
@ -237,6 +244,7 @@ Download.prototype = {
this.progress = 0; this.progress = 0;
this.totalBytes = 0; this.totalBytes = 0;
this.currentBytes = 0; this.currentBytes = 0;
this.startTime = new Date();
// Create a new deferred object and an associated promise before starting // Create a new deferred object and an associated promise before starting
// the actual download. We store it on the download as the current attempt. // the actual download. We store it on the download as the current attempt.

Просмотреть файл

@ -127,6 +127,20 @@ function promiseExecuteSoon()
return deferred.promise; return deferred.promise;
} }
/**
* Waits for a pending events to be processed after a timeout.
*
* @return {Promise}
* @resolves When pending events have been processed.
* @rejects Never.
*/
function promiseTimeout(aTime)
{
let deferred = Promise.defer();
do_timeout(aTime, deferred.resolve);
return deferred.promise;
}
/** /**
* Creates a new Download object, setting a temporary file as the target. * Creates a new Download object, setting a temporary file as the target.
* *
@ -296,6 +310,16 @@ function registerInterruptibleHandler(aPath, aFirstPartFn, aSecondPartFn)
}); });
} }
/**
* Ensure the given date object is valid.
*
* @param aDate
* The date object to be checked. This value can be null.
*/
function isValidDate(aDate) {
return aDate && aDate.getTime && !isNaN(aDate.getTime());
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
//// Initialization functions common to all tests //// Initialization functions common to all tests

Просмотреть файл

@ -47,6 +47,7 @@ add_task(function test_download_initial_final_state()
do_check_false(download.canceled); do_check_false(download.canceled);
do_check_true(download.error === null); do_check_true(download.error === null);
do_check_eq(download.progress, 0); do_check_eq(download.progress, 0);
do_check_true(download.startTime === null);
// Starts the download and waits for completion. // Starts the download and waits for completion.
yield download.start(); yield download.start();
@ -56,6 +57,7 @@ add_task(function test_download_initial_final_state()
do_check_false(download.canceled); do_check_false(download.canceled);
do_check_true(download.error === null); do_check_true(download.error === null);
do_check_eq(download.progress, 100); do_check_eq(download.progress, 100);
do_check_true(isValidDate(download.startTime));
}); });
/** /**
@ -674,3 +676,25 @@ add_task(function test_download_error_restart()
yield promiseVerifyContents(download.target.file, TEST_DATA_SHORT); yield promiseVerifyContents(download.target.file, TEST_DATA_SHORT);
}); });
/**
* Checks the startTime gets updated even after a restart.
*/
add_task(function test_download_cancel_immediately_restart_and_check_startTime()
{
let download = yield promiseSimpleDownload();
download.start();
let startTime = download.startTime;
do_check_true(isValidDate(download.startTime));
yield download.cancel();
do_check_eq(download.startTime.getTime(), startTime.getTime());
// Wait for a timeout.
yield promiseTimeout(10);
yield download.start();
do_check_true(download.startTime.getTime() > startTime.getTime());
});