diff --git a/mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp b/mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp index 2ad5ebdc2e0..bf370b1ac0c 100644 --- a/mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp +++ b/mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp @@ -663,9 +663,26 @@ nsDownloadManager::ImportDownloadHistory() nsresult nsDownloadManager::RestoreDatabaseState() { - // Convert supposedly-active downloads into downloads that should auto-resume + // Restore downloads that were in a scanning state. We can assume that they + // have been dealt with by the virus scanner nsCOMPtr stmt; nsresult rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING( + "UPDATE moz_downloads " + "SET state = ?1 " + "WHERE state = ?2"), getter_AddRefs(stmt)); + NS_ENSURE_SUCCESS(rv, rv); + + PRInt32 i = 0; + rv = stmt->BindInt32Parameter(i++, nsIDownloadManager::DOWNLOAD_FINISHED); + NS_ENSURE_SUCCESS(rv, rv); + rv = stmt->BindInt32Parameter(i++, nsIDownloadManager::DOWNLOAD_SCANNING); + NS_ENSURE_SUCCESS(rv, rv); + + rv = stmt->Execute(); + NS_ENSURE_SUCCESS(rv, rv); + + // Convert supposedly-active downloads into downloads that should auto-resume + rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING( "UPDATE moz_downloads " "SET autoResume = ?1 " "WHERE state = ?2 " @@ -673,7 +690,7 @@ nsDownloadManager::RestoreDatabaseState() "OR state = ?4"), getter_AddRefs(stmt)); NS_ENSURE_SUCCESS(rv, rv); - PRInt32 i = 0; + i = 0; rv = stmt->BindInt32Parameter(i++, nsDownload::AUTO_RESUME); NS_ENSURE_SUCCESS(rv, rv); rv = stmt->BindInt32Parameter(i++, nsIDownloadManager::DOWNLOAD_NOTSTARTED); diff --git a/mozilla/toolkit/components/downloads/test/unit/bug_401582_downloads.sqlite b/mozilla/toolkit/components/downloads/test/unit/bug_401582_downloads.sqlite new file mode 100644 index 00000000000..a81e9d65a87 Binary files /dev/null and b/mozilla/toolkit/components/downloads/test/unit/bug_401582_downloads.sqlite differ diff --git a/mozilla/toolkit/components/downloads/test/unit/head_download_manager.js b/mozilla/toolkit/components/downloads/test/unit/head_download_manager.js index 5413be9941a..9a99821302b 100644 --- a/mozilla/toolkit/components/downloads/test/unit/head_download_manager.js +++ b/mozilla/toolkit/components/downloads/test/unit/head_download_manager.js @@ -80,11 +80,24 @@ if (!profileDir) { dirSvc.QueryInterface(Ci.nsIDirectoryService).registerProvider(provider); } + +/** + * Imports a download test file to use. Works with rdf and sqlite files. + * + * @param aFName + * The name of the file to import. This file should be located in the + * same directory as this file. + */ function importDownloadsFile(aFName) { var file = do_get_file("toolkit/components/downloads/test/unit/" + aFName); var newFile = dirSvc.get("ProfD", Ci.nsIFile); - file.copyTo(newFile, "downloads.rdf"); + if (/\.rdf$/i.test(aFName)) + file.copyTo(newFile, "downloads.rdf"); + else if (/\.sqlite$/i.test(aFName)) + file.copyTo(newFile, "downloads.sqlite"); + else + do_throw("Unexpected filename!"); } function cleanup() diff --git a/mozilla/toolkit/components/downloads/test/unit/test_bug_401582.js b/mozilla/toolkit/components/downloads/test/unit/test_bug_401582.js new file mode 100644 index 00000000000..52a20d42b39 --- /dev/null +++ b/mozilla/toolkit/components/downloads/test/unit/test_bug_401582.js @@ -0,0 +1,69 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Download Manager Test Code. + * + * The Initial Developer of the Original Code is + * Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shawn Wilsher (Original Author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// This tests that downloads in the scanning state are set to a completed state +// upon service initialization. + +cleanup(); + +importDownloadsFile("bug_401582_downloads.sqlite"); + +const nsIDownloadManager = Ci.nsIDownloadManager; +const dm = Cc["@mozilla.org/download-manager;1"].getService(nsIDownloadManager); + +function test_noScanningDownloads() +{ + var stmt = dm.DBConnection.createStatement( + "SELECT * " + + "FROM moz_downloads " + + "WHERE state = ?1"); + stmt.bindInt32Parameter(0, nsIDownloadManager.DOWNLOAD_SCANNING); + + do_check_false(stmt.executeStep()); + stmt.reset(); + stmt.finalize(); +} + +var tests = [test_noScanningDownloads]; + +function run_test() +{ + for (var i = 0; i < tests.length; i++) + tests[i](); + + cleanup(); +}