Bug 1462937: Update callers to use nsIFile::GetDirectoryEntries as a nsIDirectoryEnumerator. r?froydnj draft
authorKris Maglione <maglione.k@gmail.com>
Sat, 19 May 2018 20:17:45 -0700
changeset 797525 331b71f9fc33b10f7a9236685af82af728a31588
parent 797524 ccfe668f71ffded4b72485805b56fe8040bc0d9c
child 797531 a97ee65471569f6e285cdf998b13d1b241099b37
push id110502
push usermaglione.k@gmail.com
push dateSun, 20 May 2018 03:18:40 +0000
reviewersfroydnj
bugs1462937
milestone62.0a1
Bug 1462937: Update callers to use nsIFile::GetDirectoryEntries as a nsIDirectoryEnumerator. r?froydnj MozReview-Commit-ID: Iv4T1MVAF5
browser/components/migration/FirefoxProfileMigrator.js
browser/components/migration/MSMigrationUtils.jsm
browser/extensions/mortar/host/common/ppapi-runtime.jsm
browser/modules/test/browser/browser_UnsubmittedCrashHandler.js
dom/asmjscache/AsmJSCache.cpp
dom/cache/FileUtils.cpp
dom/cache/QuotaClient.cpp
dom/cache/test/xpcshell/make_profile.js
dom/filesystem/GetDirectoryListingTask.cpp
dom/filesystem/GetFilesHelper.cpp
dom/indexedDB/ActorsParent.cpp
dom/indexedDB/test/unit/xpcshell-head-parent-process.js
dom/media/gtest/TestCDMStorage.cpp
dom/plugins/base/nsPluginHost.cpp
dom/quota/ActorsParent.cpp
dom/webbrowserpersist/nsWebBrowserPersist.cpp
extensions/spellcheck/hunspell/glue/mozHunspell.cpp
gfx/thebes/gfxGDIFontList.cpp
intl/hyphenation/glue/nsHyphenationManager.cpp
layout/style/nsLayoutStylesheetCache.cpp
layout/tools/reftest/reftest.jsm
modules/libjar/zipwriter/test/unit/test_bug446708.js
modules/libpref/Preferences.cpp
netwerk/base/nsDirectoryIndexStream.cpp
netwerk/cache/nsDeleteDir.cpp
netwerk/cache2/CacheFileContextEvictor.cpp
netwerk/cache2/CacheFileIOManager.cpp
netwerk/cache2/CacheIndex.cpp
netwerk/test/httpserver/httpd.js
testing/mochitest/browser-test.js
testing/mochitest/server.js
testing/specialpowers/content/SpecialPowersObserverAPI.js
toolkit/components/extensions/test/xpcshell/test_ext_downloads_download.js
toolkit/components/extensions/test/xpcshell/test_ext_downloads_private.js
toolkit/components/feeds/test/head.js
toolkit/components/osfile/tests/mochi/main_test_osfile_async.js
toolkit/components/places/tests/bookmarks/test_477583_json-backup-in-future.js
toolkit/components/places/tests/head_common.js
toolkit/components/places/tests/unit/test_utils_backups_create.js
toolkit/components/search/nsSearchService.js
toolkit/components/telemetry/Telemetry.cpp
toolkit/components/url-classifier/Classifier.cpp
toolkit/content/tests/chrome/RegisterUnregisterChrome.js
toolkit/crashreporter/CrashReports.jsm
toolkit/crashreporter/test/browser/browser_clearReports.js
toolkit/crashreporter/test/unit/head_crashreporter.js
toolkit/mozapps/installer/precompile_cache.js
toolkit/mozapps/update/nsUpdateService.js
toolkit/mozapps/update/tests/data/shared.js
toolkit/mozapps/update/tests/data/xpcshellUtilsAUS.js
widget/tests/test_bug1123480.xul
widget/tests/test_transferable_overflow.xul
widget/windows/JumpListBuilder.cpp
widget/windows/WinUtils.cpp
xpcom/io/nsLocalFileUnix.cpp
xpcom/io/nsLocalFileWin.cpp
xpcom/tests/unit/test_bug478086.js
xpcom/tests/unit/test_symlinks.js
--- a/browser/components/migration/FirefoxProfileMigrator.js
+++ b/browser/components/migration/FirefoxProfileMigrator.js
@@ -243,17 +243,17 @@ FirefoxProfileMigrator.prototype._getRes
       let dataReportingDir = this._getFileObject(sourceProfileDir, "datareporting");
       if (dataReportingDir && dataReportingDir.isDirectory()) {
         // Copy only specific files.
         let toCopy = ["state.json", "session-state.json"];
 
         let dest = createSubDir("datareporting");
         let enumerator = dataReportingDir.directoryEntries;
         while (enumerator.hasMoreElements()) {
-          let file = enumerator.getNext().QueryInterface(Ci.nsIFile);
+          let file = enumerator.nextFile;
           if (file.isDirectory() || !toCopy.includes(file.leafName)) {
             continue;
           }
           file.copyTo(dest, "");
         }
       }
 
       aCallback(true);
--- a/browser/components/migration/MSMigrationUtils.jsm
+++ b/browser/components/migration/MSMigrationUtils.jsm
@@ -286,18 +286,17 @@ function getEdgeLocalDataFolder() {
     if (edgeDir.exists() && edgeDir.isReadable() && edgeDir.isDirectory()) {
       gEdgeDir = edgeDir;
       return edgeDir.clone();
     }
 
     // Let's try the long way:
     let dirEntries = packages.directoryEntries;
     while (dirEntries.hasMoreElements()) {
-      let subDir = dirEntries.getNext();
-      subDir.QueryInterface(Ci.nsIFile);
+      let subDir = dirEntries.nextFile;
       if (subDir.leafName.startsWith("Microsoft.MicrosoftEdge") && subDir.isReadable() &&
           subDir.isDirectory()) {
         gEdgeDir = subDir;
         return subDir.clone();
       }
     }
   } catch (ex) {
     Cu.reportError("Exception trying to find the Edge favorites directory: " + ex);
@@ -383,17 +382,17 @@ Bookmarks.prototype = {
   async _getBookmarksInFolder(aSourceFolder) {
     // TODO (bug 741993): the favorites order is stored in the Registry, at
     // HCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites
     // for IE, and in a similar location for Edge.
     // Until we support it, bookmarks are imported in alphabetical order.
     let entries = aSourceFolder.directoryEntries;
     let rv = [];
     while (entries.hasMoreElements()) {
-      let entry = entries.getNext().QueryInterface(Ci.nsIFile);
+      let entry = entries.nextFile;
       try {
         // Make sure that entry.path == entry.target to not follow .lnk folder
         // shortcuts which could lead to infinite cycles.
         // Don't use isSymlink(), since it would throw for invalid
         // lnk files pointing to URLs or to unresolvable paths.
         if (entry.path == entry.target && entry.isDirectory()) {
           let isBookmarksFolder = entry.leafName == this._toolbarFolderName &&
                                   entry.parent.equals(this._favoritesFolder);
@@ -504,17 +503,17 @@ Cookies.prototype = {
 
     let cookiesGenerator = (function* genCookie() {
       let success = false;
       let folders = this._migrationType == MSMigrationUtils.MIGRATION_TYPE_EDGE ?
                       this.__cookiesFolders : [this.__cookiesFolder];
       for (let folder of folders) {
         let entries = folder.directoryEntries;
         while (entries.hasMoreElements()) {
-          let entry = entries.getNext().QueryInterface(Ci.nsIFile);
+          let entry = entries.nextFile;
           // Skip eventual bogus entries.
           if (!entry.isFile() || !/\.(cookie|txt)$/.test(entry.leafName))
             continue;
 
           this._readCookieFile(entry, function(aSuccess) {
             // Importing even a single cookie file is considered a success.
             if (aSuccess)
               success = true;
--- a/browser/extensions/mortar/host/common/ppapi-runtime.jsm
+++ b/browser/extensions/mortar/host/common/ppapi-runtime.jsm
@@ -2843,17 +2843,17 @@ dump(`callFromJSON: < ${JSON.stringify(c
       json.path.split("/").forEach((pathItem) => directory.appendRelativePath(pathItem));
       if (!directory.exists() || !directory.isDirectory()) {
         return [PP_ERROR_FILENOTFOUND, { contents: null }];
       }
 
       let entries = [];
       let enumerator = directory.directoryEntries;
       while (enumerator.hasMoreElements()) {
-        let file = enumerator.getNext().QueryInterface(Ci.nsIFile);
+        let file = enumerator.nextFile;
         entries.push({ name: file.leafName, is_dir: file.isDirectory() });
       }
       return [PP_OK, { contents: { count: entries.length, entries } }];
     },
 
     /**
      * int32_t CreateTemporaryFile(
      *     [in] PP_Instance instance,
--- a/browser/modules/test/browser/browser_UnsubmittedCrashHandler.js
+++ b/browser/modules/test/browser/browser_UnsubmittedCrashHandler.js
@@ -37,17 +37,17 @@ function getPendingCrashReportDir() {
  * Synchronously deletes all entries inside the pending
  * crash report directory.
  */
 function clearPendingCrashReports() {
   let dir = getPendingCrashReportDir();
   let entries = dir.directoryEntries;
 
   while (entries.hasMoreElements()) {
-    let entry = entries.getNext().QueryInterface(Ci.nsIFile);
+    let entry = entries.nextFile;
     if (entry.isFile()) {
       entry.remove(false);
     }
   }
 }
 
 /**
  * Randomly generates howMany crash report .dmp and .extra files
--- a/dom/asmjscache/AsmJSCache.cpp
+++ b/dom/asmjscache/AsmJSCache.cpp
@@ -1869,36 +1869,25 @@ Client::GetUsageForOrigin(PersistenceTyp
   rv = directory->Append(NS_LITERAL_STRING(ASMJSCACHE_DIRECTORY_NAME));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   DebugOnly<bool> exists;
   MOZ_ASSERT(NS_SUCCEEDED(directory->Exists(&exists)) && exists);
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) &&
-         hasMore && !aCanceled) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    if (NS_WARN_IF(!file)) {
-      return NS_NOINTERFACE;
-    }
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
+         file && !aCanceled) {
     int64_t fileSize;
     rv = file->GetFileSize(&fileSize);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     MOZ_ASSERT(fileSize >= 0, "Negative size?!");
 
--- a/dom/cache/FileUtils.cpp
+++ b/dom/cache/FileUtils.cpp
@@ -445,54 +445,42 @@ BodyDeleteOrphanedFiles(const QuotaInfo&
   nsCOMPtr<nsIFile> dir;
   nsresult rv = aBaseDir->Clone(getter_AddRefs(dir));
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
   // Add the root morgue directory
   rv = dir->Append(NS_LITERAL_STRING("morgue"));
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = dir->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
   // Iterate over all the intermediate morgue subdirs
-  bool hasMore = false;
-  while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
-
-    nsCOMPtr<nsIFile> subdir = do_QueryInterface(entry);
-
+  nsCOMPtr<nsIFile> subdir;
+  while (NS_SUCCEEDED(rv = entries->GetNextFile(getter_AddRefs(subdir))) && subdir) {
     bool isDir = false;
     rv = subdir->IsDirectory(&isDir);
     if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
     // If a file got in here somehow, try to remove it and move on
     if (NS_WARN_IF(!isDir)) {
       rv = RemoveNsIFile(aQuotaInfo, subdir);
       MOZ_ASSERT(NS_SUCCEEDED(rv));
       continue;
     }
 
-    nsCOMPtr<nsISimpleEnumerator> subEntries;
+    nsCOMPtr<nsIDirectoryEnumerator> subEntries;
     rv = subdir->GetDirectoryEntries(getter_AddRefs(subEntries));
     if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
     // Now iterate over all the files in the subdir
-    bool subHasMore = false;
-    while(NS_SUCCEEDED(rv = subEntries->HasMoreElements(&subHasMore)) &&
-          subHasMore) {
-      nsCOMPtr<nsISupports> subEntry;
-      rv = subEntries->GetNext(getter_AddRefs(subEntry));
-      if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
-
-      nsCOMPtr<nsIFile> file = do_QueryInterface(subEntry);
-
+    nsCOMPtr<nsIFile> file;
+    while(NS_SUCCEEDED(rv = subEntries->GetNextFile(getter_AddRefs(file))) &&
+          file) {
       nsAutoCString leafName;
       rv = file->GetNativeLeafName(leafName);
       if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
       // Delete all tmp files regardless of known bodies.  These are
       // all considered orphans.
       if (StringEndsWith(leafName, NS_LITERAL_CSTRING(".tmp"))) {
         // remove recursively in case its somehow a directory
@@ -620,29 +608,22 @@ RemoveNsIFileRecursively(const QuotaInfo
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
   if (!isDirectory) {
     return RemoveNsIFile(aQuotaInfo, aFile);
   }
 
   // Unfortunately, we need to traverse all the entries and delete files one by
   // one to update their usages to the QuotaManager.
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = aFile->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
-  bool hasMore = false;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    MOZ_ASSERT(file);
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) && file) {
     rv = RemoveNsIFileRecursively(aQuotaInfo, file);
     if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
   }
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
   // In the end, remove the folder
   rv = aFile->Remove(/* recursive */ false);
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
--- a/dom/cache/QuotaClient.cpp
+++ b/dom/cache/QuotaClient.cpp
@@ -34,29 +34,23 @@ using mozilla::MutexAutoLock;
 using mozilla::Unused;
 
 static nsresult
 GetBodyUsage(nsIFile* aDir, const Atomic<bool>& aCanceled,
              UsageInfo* aUsageInfo)
 {
   AssertIsOnIOThread();
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv = aDir->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
-  bool hasMore;
-  while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore &&
-         !aCanceled) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED(rv = entries->GetNextFile(getter_AddRefs(file))) &&
+         file && !aCanceled) {
     bool isDir;
     rv = file->IsDirectory(&isDir);
     if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
     if (isDir) {
       rv = GetBodyUsage(file, aCanceled, aUsageInfo);
       if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
       continue;
@@ -182,29 +176,23 @@ public:
                                                          &paddingSize)))) {
         rv = LockedGetPaddingSizeFromDB(dir, aGroup, aOrigin, &paddingSize);
         if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
       }
     }
 
     aUsageInfo->AppendToFileUsage(paddingSize);
 
-    nsCOMPtr<nsISimpleEnumerator> entries;
+    nsCOMPtr<nsIDirectoryEnumerator> entries;
     rv = dir->GetDirectoryEntries(getter_AddRefs(entries));
     if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
-    bool hasMore;
-    while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore &&
-           !aCanceled) {
-      nsCOMPtr<nsISupports> entry;
-      rv = entries->GetNext(getter_AddRefs(entry));
-      if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
-
-      nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-
+    nsCOMPtr<nsIFile> file;
+    while (NS_SUCCEEDED(rv = entries->GetNextFile(getter_AddRefs(file))) &&
+           file && !aCanceled) {
       nsAutoString leafName;
       rv = file->GetLeafName(leafName);
       if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
       bool isDir;
       rv = file->IsDirectory(&isDir);
       if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
 
--- a/dom/cache/test/xpcshell/make_profile.js
+++ b/dom/cache/test/xpcshell/make_profile.js
@@ -14,17 +14,17 @@
 function enumerate_tree(entryList) {
   for (var index = 0; index < entryList.length; ++index) {
     var path = entryList[index].path;
     var file = entryList[index].file;
 
     if (file.isDirectory()) {
       var dirList = file.directoryEntries;
       while (dirList.hasMoreElements()) {
-        var dirFile = dirList.getNext().QueryInterface(Ci.nsIFile);
+        var dirFile = dirList.nextFile;
         entryList.push({ path: path + '/' + dirFile.leafName, file: dirFile });
       }
     }
   }
 }
 
 function zip_profile(zipFile, profileDir) {
   var zipWriter = Cc['@mozilla.org/zipwriter;1']
--- a/dom/filesystem/GetDirectoryListingTask.cpp
+++ b/dom/filesystem/GetDirectoryListingTask.cpp
@@ -303,17 +303,17 @@ GetDirectoryListingTaskParent::IOWork()
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   if (!isDir) {
     return NS_ERROR_DOM_FILESYSTEM_TYPE_MISMATCH_ERR;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = mTargetPath->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   bool filterOutSensitive = false;
   {
     HTMLSplitOnSpacesTokenizer tokenizer(mFilters, ';');
@@ -324,28 +324,20 @@ GetDirectoryListingTaskParent::IOWork()
         filterOutSensitive = true;
       } else {
         MOZ_CRASH("Unrecognized filter");
       }
     }
   }
 
   for (;;) {
-    bool hasMore = false;
-    if (NS_WARN_IF(NS_FAILED(entries->HasMoreElements(&hasMore))) || !hasMore) {
+    nsCOMPtr<nsIFile> currFile;
+    if (NS_WARN_IF(NS_FAILED(entries->GetNextFile(getter_AddRefs(currFile)))) || !currFile) {
       break;
     }
-    nsCOMPtr<nsISupports> supp;
-    if (NS_WARN_IF(NS_FAILED(entries->GetNext(getter_AddRefs(supp))))) {
-      break;
-    }
-
-    nsCOMPtr<nsIFile> currFile = do_QueryInterface(supp);
-    MOZ_ASSERT(currFile);
-
     bool isSpecial, isFile;
     if (NS_WARN_IF(NS_FAILED(currFile->IsSpecial(&isSpecial))) ||
         isSpecial) {
       continue;
     }
     if (NS_WARN_IF(NS_FAILED(currFile->IsFile(&isFile)) ||
                    NS_FAILED(currFile->IsDirectory(&isDir))) ||
         !(isFile || isDir)) {
--- a/dom/filesystem/GetFilesHelper.cpp
+++ b/dom/filesystem/GetFilesHelper.cpp
@@ -333,36 +333,27 @@ GetFilesHelperBase::ExploreDirectory(con
     return NS_OK;
   }
 
   nsresult rv = AddExploredDirectory(aFile);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = aFile->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   for (;;) {
-    bool hasMore = false;
-    if (NS_WARN_IF(NS_FAILED(entries->HasMoreElements(&hasMore))) || !hasMore) {
+    nsCOMPtr<nsIFile> currFile;
+    if (NS_WARN_IF(NS_FAILED(entries->GetNextFile(getter_AddRefs(currFile)))) || !currFile) {
       break;
     }
-
-    nsCOMPtr<nsISupports> supp;
-    if (NS_WARN_IF(NS_FAILED(entries->GetNext(getter_AddRefs(supp))))) {
-      break;
-    }
-
-    nsCOMPtr<nsIFile> currFile = do_QueryInterface(supp);
-    MOZ_ASSERT(currFile);
-
     bool isLink, isSpecial, isFile, isDir;
     if (NS_WARN_IF(NS_FAILED(currFile->IsSymlink(&isLink)) ||
                    NS_FAILED(currFile->IsSpecial(&isSpecial))) ||
         isSpecial) {
       continue;
     }
 
     if (NS_WARN_IF(NS_FAILED(currFile->IsFile(&isFile)) ||
--- a/dom/indexedDB/ActorsParent.cpp
+++ b/dom/indexedDB/ActorsParent.cpp
@@ -17399,35 +17399,26 @@ FileManager::GetUsage(nsIFile* aDirector
     return rv;
   }
 
   if (!exists) {
     *aUsage = 0;
     return NS_OK;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   uint64_t usage = 0;
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    MOZ_ASSERT(file);
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) && file) {
     nsString leafName;
     rv = file->GetLeafName(leafName);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     if (leafName.EqualsLiteral(JOURNAL_DIRECTORY_NAME)) {
       continue;
@@ -17979,45 +17970,36 @@ QuotaClient::GetDatabaseFilenames(
                               const AtomicBool& aCanceled,
                               bool aForUpgrade,
                               nsTArray<nsString>& aSubdirsToProcess,
                               nsTHashtable<nsStringHashKey>& aDatabaseFilenames)
 {
   AssertIsOnIOThread();
   MOZ_ASSERT(aDirectory);
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   const NS_ConvertASCIItoUTF16 sqliteSuffix(kSQLiteSuffix,
                                             LiteralStringLength(kSQLiteSuffix));
   const NS_ConvertASCIItoUTF16 journalSuffix(
     kSQLiteJournalSuffix,
     LiteralStringLength(kSQLiteJournalSuffix));
   const NS_ConvertASCIItoUTF16 shmSuffix(kSQLiteSHMSuffix,
                                          LiteralStringLength(kSQLiteSHMSuffix));
   const NS_ConvertASCIItoUTF16 walSuffix(kSQLiteWALSuffix,
                                          LiteralStringLength(kSQLiteWALSuffix));
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) &&
-         hasMore &&
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
+         file &&
          !aCanceled) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    MOZ_ASSERT(file);
-
     nsString leafName;
     rv = file->GetLeafName(leafName);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     bool isDirectory;
     rv = file->IsDirectory(&isDirectory);
@@ -18082,45 +18064,36 @@ QuotaClient::GetUsageForDirectoryInterna
                                           const AtomicBool& aCanceled,
                                           UsageInfo* aUsageInfo,
                                           bool aDatabaseFiles)
 {
   AssertIsOnIOThread();
   MOZ_ASSERT(aDirectory);
   MOZ_ASSERT(aUsageInfo);
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   if (!entries) {
     return NS_OK;
   }
 
   const NS_ConvertASCIItoUTF16 journalSuffix(
     kSQLiteJournalSuffix,
     LiteralStringLength(kSQLiteJournalSuffix));
   const NS_ConvertASCIItoUTF16 shmSuffix(kSQLiteSHMSuffix,
                                          LiteralStringLength(kSQLiteSHMSuffix));
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) &&
-         hasMore &&
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
+         file &&
          !aCanceled) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    MOZ_ASSERT(file);
-
     nsString leafName;
     rv = file->GetLeafName(leafName);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     // Journal files and sqlite-shm files don't count towards usage.
     if (StringEndsWith(leafName, journalSuffix) ||
@@ -18433,53 +18406,43 @@ Maintenance::DirectoryWork()
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     if (NS_WARN_IF(!isDirectory)) {
       continue;
     }
 
-    nsCOMPtr<nsISimpleEnumerator> persistenceDirEntries;
+    nsCOMPtr<nsIDirectoryEnumerator> persistenceDirEntries;
     rv = persistenceDir->GetDirectoryEntries(
                                          getter_AddRefs(persistenceDirEntries));
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     if (!persistenceDirEntries) {
       continue;
     }
 
     while (true) {
       // Loop over "<origin>/idb" directories.
       if (IsAborted()) {
         return NS_ERROR_ABORT;
       }
 
-      bool persistenceDirHasMoreEntries;
-      rv = persistenceDirEntries->HasMoreElements(
-                                                 &persistenceDirHasMoreEntries);
-      if (NS_WARN_IF(NS_FAILED(rv))) {
-        return rv;
-      }
-
-      if (!persistenceDirHasMoreEntries) {
+      nsCOMPtr<nsIFile> originDir;
+      rv = persistenceDirEntries->GetNextFile(getter_AddRefs(originDir));
+      if (NS_WARN_IF(NS_FAILED(rv))) {
+        return rv;
+      }
+
+      if (!originDir) {
         break;
       }
 
-      nsCOMPtr<nsISupports> persistenceDirEntry;
-      rv = persistenceDirEntries->GetNext(getter_AddRefs(persistenceDirEntry));
-      if (NS_WARN_IF(NS_FAILED(rv))) {
-        return rv;
-      }
-
-      nsCOMPtr<nsIFile> originDir = do_QueryInterface(persistenceDirEntry);
-      MOZ_ASSERT(originDir);
-
       rv = originDir->Exists(&exists);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
 
       MOZ_ASSERT(exists);
 
       rv = originDir->IsDirectory(&isDirectory);
@@ -18515,17 +18478,17 @@ Maintenance::DirectoryWork()
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
 
       if (NS_WARN_IF(!isDirectory)) {
         continue;
       }
 
-      nsCOMPtr<nsISimpleEnumerator> idbDirEntries;
+      nsCOMPtr<nsIDirectoryEnumerator> idbDirEntries;
       rv = idbDir->GetDirectoryEntries(getter_AddRefs(idbDirEntries));
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
 
       if (!idbDirEntries) {
         continue;
       }
@@ -18536,35 +18499,26 @@ Maintenance::DirectoryWork()
       nsTArray<nsString> databasePaths;
 
       while (true) {
         // Loop over files in the "idb" directory.
         if (IsAborted()) {
           return NS_ERROR_ABORT;
         }
 
-        bool idbDirHasMoreEntries;
-        rv = idbDirEntries->HasMoreElements(&idbDirHasMoreEntries);
+        nsCOMPtr<nsIFile> idbDirFile;
+        rv = idbDirEntries->GetNextFile(getter_AddRefs(idbDirFile));
         if (NS_WARN_IF(NS_FAILED(rv))) {
           return rv;
         }
 
-        if (!idbDirHasMoreEntries) {
+        if (!idbDirFile) {
           break;
         }
 
-        nsCOMPtr<nsISupports> idbDirEntry;
-        rv = idbDirEntries->GetNext(getter_AddRefs(idbDirEntry));
-        if (NS_WARN_IF(NS_FAILED(rv))) {
-          return rv;
-        }
-
-        nsCOMPtr<nsIFile> idbDirFile = do_QueryInterface(idbDirEntry);
-        MOZ_ASSERT(idbDirFile);
-
         nsString idbFilePath;
         rv = idbDirFile->GetPath(idbFilePath);
         if (NS_WARN_IF(NS_FAILED(rv))) {
           return rv;
         }
 
         if (!StringEndsWith(idbFilePath, sqliteExtension)) {
           continue;
--- a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js
+++ b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js
@@ -335,18 +335,17 @@ function getChromeFilesDir()
   let idbDir = profileDir.clone();
   idbDir.append("storage");
   idbDir.append("permanent");
   idbDir.append("chrome");
   idbDir.append("idb");
 
   let idbEntries = idbDir.directoryEntries;
   while (idbEntries.hasMoreElements()) {
-    let entry = idbEntries.getNext();
-    let file = entry.QueryInterface(Ci.nsIFile);
+    let file = idbEntries.nextFile;
     if (file.isDirectory()) {
       return file;
     }
   }
 
   throw new Error("files directory doesn't exist!");
 }
 
--- a/dom/media/gtest/TestCDMStorage.cpp
+++ b/dom/media/gtest/TestCDMStorage.cpp
@@ -39,35 +39,24 @@ GetAbstractGMPThread()
 }
 /**
  * Enumerate files under |aPath| (non-recursive).
  */
 template<typename T>
 static nsresult
 EnumerateDir(nsIFile* aPath, T&& aDirIter)
 {
-  nsCOMPtr<nsISimpleEnumerator> iter;
+  nsCOMPtr<nsIDirectoryEnumerator> iter;
   nsresult rv = aPath->GetDirectoryEntries(getter_AddRefs(iter));
   if (NS_FAILED(rv)) {
     return rv;
   }
 
-  bool hasMore = false;
-  while (NS_SUCCEEDED(iter->HasMoreElements(&hasMore)) && hasMore) {
-    nsCOMPtr<nsISupports> supports;
-    rv = iter->GetNext(getter_AddRefs(supports));
-    if (NS_FAILED(rv)) {
-      continue;
-    }
-
-    nsCOMPtr<nsIFile> entry(do_QueryInterface(supports, &rv));
-    if (NS_FAILED(rv)) {
-      continue;
-    }
-
+  nsCOMPtr<nsIFile> entry;
+  while (NS_SUCCEEDED(iter->GetNextFile(getter_AddRefs(entry))) && entry) {
     aDirIter(entry);
   }
   return NS_OK;
 }
 
 /**
  * Enumerate files under $profileDir/gmp/$platform/gmp-fake/$aDir/ (non-recursive).
  */
--- a/dom/plugins/base/nsPluginHost.cpp
+++ b/dom/plugins/base/nsPluginHost.cpp
@@ -2089,33 +2089,25 @@ nsresult nsPluginHost::ScanPluginsDirect
   nsAutoCString dirPath;
   pluginsDir->GetNativePath(dirPath);
   PLUGIN_LOG(PLUGIN_LOG_BASIC,
   ("nsPluginHost::ScanPluginsDirectory dir=%s\n", dirPath.get()));
 #endif
 
   bool flashOnly = Preferences::GetBool("plugin.load_flash_only", true);
 
-  nsCOMPtr<nsISimpleEnumerator> iter;
+  nsCOMPtr<nsIDirectoryEnumerator> iter;
   rv = pluginsDir->GetDirectoryEntries(getter_AddRefs(iter));
   if (NS_FAILED(rv))
     return rv;
 
   AutoTArray<nsCOMPtr<nsIFile>, 6> pluginFiles;
 
-  bool hasMore;
-  while (NS_SUCCEEDED(iter->HasMoreElements(&hasMore)) && hasMore) {
-    nsCOMPtr<nsISupports> supports;
-    rv = iter->GetNext(getter_AddRefs(supports));
-    if (NS_FAILED(rv))
-      continue;
-    nsCOMPtr<nsIFile> dirEntry(do_QueryInterface(supports, &rv));
-    if (NS_FAILED(rv))
-      continue;
-
+  nsCOMPtr<nsIFile> dirEntry;
+  while (NS_SUCCEEDED(iter->GetNextFile(getter_AddRefs(dirEntry))) && dirEntry) {
     // Sun's JRE 1.3.1 plugin must have symbolic links resolved or else it'll crash.
     // See bug 197855.
     dirEntry->Normalize();
 
     if (nsPluginsDir::IsPluginFile(dirEntry)) {
       pluginFiles.AppendElement(dirEntry);
     }
   }
--- a/dom/quota/ActorsParent.cpp
+++ b/dom/quota/ActorsParent.cpp
@@ -1966,33 +1966,24 @@ GetLastModifiedTime(nsIFile* aFile, bool
         timestamp *= int64_t(PR_USEC_PER_MSEC);
 
         if (timestamp > *aTimestamp) {
           *aTimestamp = timestamp;
         }
         return NS_OK;
       }
 
-      nsCOMPtr<nsISimpleEnumerator> entries;
+      nsCOMPtr<nsIDirectoryEnumerator> entries;
       rv = aFile->GetDirectoryEntries(getter_AddRefs(entries));
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
 
-      bool hasMore;
-      while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-        nsCOMPtr<nsISupports> entry;
-        rv = entries->GetNext(getter_AddRefs(entry));
-        if (NS_WARN_IF(NS_FAILED(rv))) {
-          return rv;
-        }
-
-        nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-        MOZ_ASSERT(file);
-
+      nsCOMPtr<nsIFile> file;
+      while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) && file) {
         rv = GetLastModifiedTime(file, aTimestamp);
         if (NS_WARN_IF(NS_FAILED(rv))) {
           return rv;
         }
       }
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
@@ -4223,33 +4214,24 @@ QuotaManager::InitializeRepository(Persi
   }
 
   bool created;
   rv = EnsureDirectory(directory, &created);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> childDirectory = do_QueryInterface(entry);
-    MOZ_ASSERT(childDirectory);
-
+  nsCOMPtr<nsIFile> childDirectory;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(childDirectory)))) && childDirectory) {
     bool isDirectory;
     rv = childDirectory->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     if (!isDirectory) {
       nsString leafName;
@@ -4311,29 +4293,22 @@ QuotaManager::InitializeOrigin(Persisten
 
   // We need to initialize directories of all clients if they exists and also
   // get the total usage to initialize the quota.
   nsAutoPtr<UsageInfo> usageInfo;
   if (trackQuota) {
     usageInfo = new UsageInfo();
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   NS_ENSURE_SUCCESS(rv, rv);
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    NS_ENSURE_SUCCESS(rv, rv);
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    NS_ENSURE_TRUE(file, NS_NOINTERFACE);
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) && file) {
     bool isDirectory;
     rv = file->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     nsString leafName;
     rv = file->GetLeafName(leafName);
@@ -6733,30 +6708,23 @@ QuotaUsageRequestBase::GetUsageForOrigin
     bool initialized;
 
     if (aPersistenceType == PERSISTENCE_TYPE_PERSISTENT) {
       initialized = aQuotaManager->IsOriginInitialized(aOrigin);
     } else {
       initialized = aQuotaManager->IsTemporaryStorageInitialized();
     }
 
-    nsCOMPtr<nsISimpleEnumerator> entries;
+    nsCOMPtr<nsIDirectoryEnumerator> entries;
     rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
     NS_ENSURE_SUCCESS(rv, rv);
 
-    bool hasMore;
-    while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) &&
-           hasMore && !mCanceled) {
-      nsCOMPtr<nsISupports> entry;
-      rv = entries->GetNext(getter_AddRefs(entry));
-      NS_ENSURE_SUCCESS(rv, rv);
-
-      nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-      NS_ENSURE_TRUE(file, NS_NOINTERFACE);
-
+    nsCOMPtr<nsIFile> file;
+    while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
+           file && !mCanceled) {
       bool isDirectory;
       rv = file->IsDirectory(&isDirectory);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
 
       nsString leafName;
       rv = file->GetLeafName(leafName);
@@ -6899,36 +6867,27 @@ GetUsageOp::TraverseRepository(QuotaMana
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   if (!exists) {
     return NS_OK;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   bool persistent = aPersistenceType == PERSISTENCE_TYPE_PERSISTENT;
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) &&
-         hasMore && !mCanceled) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> originDir = do_QueryInterface(entry);
-    MOZ_ASSERT(originDir);
-
+  nsCOMPtr<nsIFile> originDir;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(originDir)))) &&
+         originDir && !mCanceled) {
     bool isDirectory;
     rv = originDir->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     if (!isDirectory) {
       nsString leafName;
@@ -7401,44 +7360,35 @@ ClearRequestBase::DeleteFiles(QuotaManag
 
   nsCOMPtr<nsIFile> directory;
   nsresult rv = NS_NewLocalFile(aQuotaManager->GetStoragePath(aPersistenceType),
                                 false, getter_AddRefs(directory));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   if (NS_WARN_IF(NS_FAILED(
         directory->GetDirectoryEntries(getter_AddRefs(entries)))) || !entries) {
     return;
   }
 
   OriginScope originScope = mOriginScope.Clone();
   if (originScope.IsOrigin()) {
     nsCString originSanitized(originScope.GetOrigin());
     SanitizeOriginString(originSanitized);
     originScope.SetOrigin(originSanitized);
   } else if (originScope.IsPrefix()) {
     nsCString prefixSanitized(originScope.GetPrefix());
     SanitizeOriginString(prefixSanitized);
     originScope.SetPrefix(prefixSanitized);
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    MOZ_ASSERT(file);
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) && file) {
     bool isDirectory;
     rv = file->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return;
     }
 
     nsString leafName;
     rv = file->GetLeafName(leafName);
@@ -8571,33 +8521,25 @@ CreateOrUpgradeDirectoryMetadataHelper::
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   if (!exists) {
     return NS_OK;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = mDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> originDir = do_QueryInterface(entry);
-    MOZ_ASSERT(originDir);
-
+  nsCOMPtr<nsIFile> originDir;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(originDir)))) &&
+         originDir) {
     nsString leafName;
     rv = originDir->GetLeafName(leafName);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     bool isDirectory;
     rv = originDir->IsDirectory(&isDirectory);
@@ -8737,35 +8679,25 @@ CreateOrUpgradeDirectoryMetadataHelper::
       }
     }
     else {
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
     }
 
-    nsCOMPtr<nsISimpleEnumerator> entries;
+    nsCOMPtr<nsIDirectoryEnumerator> entries;
     rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
-    bool hasMore;
-    while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-      nsCOMPtr<nsISupports> entry;
-      rv = entries->GetNext(getter_AddRefs(entry));
-      if (NS_WARN_IF(NS_FAILED(rv))) {
-        return rv;
-      }
-
-      nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-      if (NS_WARN_IF(!file)) {
-        return rv;
-      }
-
+    nsCOMPtr<nsIFile> file;
+    while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
+           file) {
       nsString leafName;
       rv = file->GetLeafName(leafName);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
 
       if (!leafName.Equals(idbDirectoryName)) {
         rv = file->MoveTo(idbDirectory, EmptyString());
@@ -8903,33 +8835,25 @@ UpgradeStorageFrom0_0To1_0Helper::DoUpgr
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   if (!exists) {
     return NS_OK;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = mDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> originDir = do_QueryInterface(entry);
-    MOZ_ASSERT(originDir);
-
+  nsCOMPtr<nsIFile> originDir;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(originDir)))) &&
+         originDir) {
     bool isDirectory;
     rv = originDir->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     if (!isDirectory) {
       nsString leafName;
@@ -9036,33 +8960,24 @@ nsresult
 UpgradeStorageFrom1_0To2_0Helper::DoUpgrade()
 {
   AssertIsOnIOThread();
 
   DebugOnly<bool> exists;
   MOZ_ASSERT(NS_SUCCEEDED(mDirectory->Exists(&exists)));
   MOZ_ASSERT(exists);
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv = mDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> originDir = do_QueryInterface(entry);
-    MOZ_ASSERT(originDir);
-
+  nsCOMPtr<nsIFile> originDir;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(originDir)))) && originDir) {
     bool isDirectory;
     rv = originDir->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     if (!isDirectory) {
       nsString leafName;
@@ -9148,36 +9063,25 @@ UpgradeStorageFrom1_0To2_0Helper::MaybeU
                                                 const OriginProps& aOriginProps)
 {
   AssertIsOnIOThread();
   MOZ_ASSERT(aOriginProps.mDirectory);
 
   QuotaManager* quotaManager = QuotaManager::Get();
   MOZ_ASSERT(quotaManager);
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv =
     aOriginProps.mDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    if (NS_WARN_IF(!file)) {
-      return rv;
-    }
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) && file) {
     bool isDirectory;
     rv = file->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     nsString leafName;
     rv = file->GetLeafName(leafName);
@@ -9374,33 +9278,24 @@ nsresult
 UpgradeStorageFrom2_0To2_1Helper::DoUpgrade()
 {
   AssertIsOnIOThread();
 
   DebugOnly<bool> exists;
   MOZ_ASSERT(NS_SUCCEEDED(mDirectory->Exists(&exists)));
   MOZ_ASSERT(exists);
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv = mDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> originDir = do_QueryInterface(entry);
-    MOZ_ASSERT(originDir);
-
+  nsCOMPtr<nsIFile> originDir;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(originDir)))) && originDir) {
     bool isDirectory;
     rv = originDir->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     if (!isDirectory) {
       nsString leafName;
@@ -9478,36 +9373,25 @@ UpgradeStorageFrom2_0To2_1Helper::MaybeU
                                                 const OriginProps& aOriginProps)
 {
   AssertIsOnIOThread();
   MOZ_ASSERT(aOriginProps.mDirectory);
 
   QuotaManager* quotaManager = QuotaManager::Get();
   MOZ_ASSERT(quotaManager);
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv =
     aOriginProps.mDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  bool hasMore;
-  while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
-    nsCOMPtr<nsISupports> entry;
-    rv = entries->GetNext(getter_AddRefs(entry));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    if (NS_WARN_IF(!file)) {
-      return rv;
-    }
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) && file) {
     bool isDirectory;
     rv = file->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     nsString leafName;
     rv = file->GetLeafName(leafName);
--- a/dom/webbrowserpersist/nsWebBrowserPersist.cpp
+++ b/dom/webbrowserpersist/nsWebBrowserPersist.cpp
@@ -1881,63 +1881,51 @@ void nsWebBrowserPersist::CleanupLocalFi
                 // children looking for files. Any files created by the
                 // persist object would have been deleted by the first
                 // pass so if there are any there at this stage, the dir
                 // cannot be deleted because it has someone else's files
                 // in it. Empty child dirs are deleted but they must be
                 // recursed through to ensure they are actually empty.
 
                 bool isEmptyDirectory = true;
-                nsCOMArray<nsISimpleEnumerator> dirStack;
+                nsCOMArray<nsIDirectoryEnumerator> dirStack;
                 int32_t stackSize = 0;
 
                 // Push the top level enum onto the stack
-                nsCOMPtr<nsISimpleEnumerator> pos;
+                nsCOMPtr<nsIDirectoryEnumerator> pos;
                 if (NS_SUCCEEDED(file->GetDirectoryEntries(getter_AddRefs(pos))))
                     dirStack.AppendObject(pos);
 
                 while (isEmptyDirectory && (stackSize = dirStack.Count()))
                 {
                     // Pop the last element
-                    nsCOMPtr<nsISimpleEnumerator> curPos;
+                    nsCOMPtr<nsIDirectoryEnumerator> curPos;
                     curPos = dirStack[stackSize-1];
                     dirStack.RemoveObjectAt(stackSize - 1);
 
-                    // Test if the enumerator has any more files in it
-                    bool hasMoreElements = false;
-                    curPos->HasMoreElements(&hasMoreElements);
-                    if (!hasMoreElements)
+                    nsCOMPtr<nsIFile> child;
+                    if (NS_FAILED(curPos->GetNextFile(getter_AddRefs(child))) || !child)
                     {
                         continue;
                     }
 
-                    // Child files automatically make this code drop out,
-                    // while child dirs keep the loop going.
-                    nsCOMPtr<nsISupports> child;
-                    curPos->GetNext(getter_AddRefs(child));
-                    NS_ASSERTION(child, "No child element, but hasMoreElements says otherwise");
-                    if (!child)
-                        continue;
-                    nsCOMPtr<nsIFile> childAsFile = do_QueryInterface(child);
-                    NS_ASSERTION(childAsFile, "This should be a file but isn't");
-
                     bool childIsSymlink = false;
-                    childAsFile->IsSymlink(&childIsSymlink);
+                    child->IsSymlink(&childIsSymlink);
                     bool childIsDir = false;
-                    childAsFile->IsDirectory(&childIsDir);
+                    child->IsDirectory(&childIsDir);
                     if (!childIsDir || childIsSymlink)
                     {
                         // Some kind of file or symlink which means dir
                         // is not empty so just drop out.
                         isEmptyDirectory = false;
                         break;
                     }
                     // Push parent enumerator followed by child enumerator
-                    nsCOMPtr<nsISimpleEnumerator> childPos;
-                    childAsFile->GetDirectoryEntries(getter_AddRefs(childPos));
+                    nsCOMPtr<nsIDirectoryEnumerator> childPos;
+                    child->GetDirectoryEntries(getter_AddRefs(childPos));
                     dirStack.AppendObject(curPos);
                     if (childPos)
                         dirStack.AppendObject(childPos);
 
                 }
                 dirStack.Clear();
 
                 // If after all that walking the dir is deemed empty, delete it
--- a/extensions/spellcheck/hunspell/glue/mozHunspell.cpp
+++ b/extensions/spellcheck/hunspell/glue/mozHunspell.cpp
@@ -416,25 +416,21 @@ mozHunspell::LoadDictionariesFromDir(nsI
   rv = aDir->Exists(&check);
   if (NS_FAILED(rv) || !check)
     return NS_ERROR_UNEXPECTED;
 
   rv = aDir->IsDirectory(&check);
   if (NS_FAILED(rv) || !check)
     return NS_ERROR_UNEXPECTED;
 
-  nsCOMPtr<nsISimpleEnumerator> e;
-  rv = aDir->GetDirectoryEntries(getter_AddRefs(e));
+  nsCOMPtr<nsIDirectoryEnumerator> files;
+  rv = aDir->GetDirectoryEntries(getter_AddRefs(files));
   if (NS_FAILED(rv))
     return NS_ERROR_UNEXPECTED;
 
-  nsCOMPtr<nsIDirectoryEnumerator> files(do_QueryInterface(e));
-  if (!files)
-    return NS_ERROR_UNEXPECTED;
-
   nsCOMPtr<nsIFile> file;
   while (NS_SUCCEEDED(files->GetNextFile(getter_AddRefs(file))) && file) {
     nsAutoString leafName;
     file->GetLeafName(leafName);
     if (!StringEndsWith(leafName, NS_LITERAL_STRING(".dic")))
       continue;
 
     nsAutoString dict(leafName);
--- a/gfx/thebes/gfxGDIFontList.cpp
+++ b/gfx/thebes/gfxGDIFontList.cpp
@@ -1157,32 +1157,24 @@ gfxGDIFontList::ActivateBundledFonts()
     if (NS_FAILED(localDir->Append(NS_LITERAL_STRING("fonts")))) {
         return;
     }
     bool isDir;
     if (NS_FAILED(localDir->IsDirectory(&isDir)) || !isDir) {
         return;
     }
 
-    nsCOMPtr<nsISimpleEnumerator> e;
+    nsCOMPtr<nsIDirectoryEnumerator> e;
     rv = localDir->GetDirectoryEntries(getter_AddRefs(e));
     if (NS_FAILED(rv)) {
         return;
     }
 
-    bool hasMore;
-    while (NS_SUCCEEDED(e->HasMoreElements(&hasMore)) && hasMore) {
-        nsCOMPtr<nsISupports> entry;
-        if (NS_FAILED(e->GetNext(getter_AddRefs(entry)))) {
-            break;
-        }
-        nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-        if (!file) {
-            continue;
-        }
+    nsCOMPtr<nsIFile> file;
+    while (NS_SUCCEEDED(e->GetNextFile(getter_AddRefs(file))) && file) {
         nsAutoString path;
         if (NS_FAILED(file->GetPath(path))) {
             continue;
         }
         AddFontResourceExW(path.get(), FR_PRIVATE, nullptr);
     }
 }
 
--- a/intl/hyphenation/glue/nsHyphenationManager.cpp
+++ b/intl/hyphenation/glue/nsHyphenationManager.cpp
@@ -246,27 +246,22 @@ nsHyphenationManager::LoadPatternListFro
     return;
   }
 
   rv = aDir->IsDirectory(&check);
   if (NS_FAILED(rv) || !check) {
     return;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> e;
-  rv = aDir->GetDirectoryEntries(getter_AddRefs(e));
+  nsCOMPtr<nsIDirectoryEnumerator> files;
+  rv = aDir->GetDirectoryEntries(getter_AddRefs(files));
   if (NS_FAILED(rv)) {
     return;
   }
 
-  nsCOMPtr<nsIDirectoryEnumerator> files(do_QueryInterface(e));
-  if (!files) {
-    return;
-  }
-
   nsCOMPtr<nsIFile> file;
   while (NS_SUCCEEDED(files->GetNextFile(getter_AddRefs(file))) && file){
     nsAutoString dictName;
     file->GetLeafName(dictName);
     NS_ConvertUTF16toUTF8 locale(dictName);
     ToLowerCase(locale);
     if (!StringEndsWith(locale, NS_LITERAL_CSTRING(".dic"))) {
       continue;
--- a/layout/style/nsLayoutStylesheetCache.cpp
+++ b/layout/style/nsLayoutStylesheetCache.cpp
@@ -506,42 +506,32 @@ ListInterestingFiles(nsString& aAnnotati
 
   bool isDir = false;
   aFile->IsDirectory(&isDir);
 
   if (!isDir) {
     return;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   if (NS_FAILED(aFile->GetDirectoryEntries(getter_AddRefs(entries)))) {
     aAnnotation.AppendLiteral("  (failed to enumerated directory)\n");
     return;
   }
 
   for (;;) {
-    bool hasMore = false;
-    if (NS_FAILED(entries->HasMoreElements(&hasMore))) {
+    nsCOMPtr<nsIFile> file;
+    if (NS_FAILED(entries->GetNextFile(getter_AddRefs(file)))) {
       aAnnotation.AppendLiteral("  (failed during directory enumeration)\n");
       return;
     }
-    if (!hasMore) {
+    if (!file) {
       break;
     }
-
-    nsCOMPtr<nsISupports> entry;
-    if (NS_FAILED(entries->GetNext(getter_AddRefs(entry)))) {
-      aAnnotation.AppendLiteral("  (failed during directory enumeration)\n");
-      return;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(entry);
-    if (file) {
-      ListInterestingFiles(aAnnotation, file, aInterestingFilenames);
-    }
+    ListInterestingFiles(aAnnotation, file, aInterestingFilenames);
   }
 }
 
 // Generate a crash report annotation to help debug issues with style
 // sheets failing to load (bug 1194856).
 static void
 AnnotateCrashReport(nsIURI* aURI)
 {
--- a/layout/tools/reftest/reftest.jsm
+++ b/layout/tools/reftest/reftest.jsm
@@ -1251,17 +1251,17 @@ function FindUnexpectedCrashDumpFiles()
 
     let entries = g.crashDumpDir.directoryEntries;
     if (!entries) {
         return;
     }
 
     let foundCrashDumpFile = false;
     while (entries.hasMoreElements()) {
-        let file = entries.getNext().QueryInterface(Ci.nsIFile);
+        let file = entries.nextFile;
         let path = String(file.path);
         if (path.match(/\.(dmp|extra)$/) && !g.unexpectedCrashDumpFiles[path]) {
             if (!foundCrashDumpFile) {
                 ++g.testResults.UnexpectedFail;
                 foundCrashDumpFile = true;
                 if (g.currentURL) {
                     logger.testStatus(g.urls[0].identifier, "crash-check", "FAIL", "PASS", "This test left crash dumps behind, but we weren't expecting it to!");
                 } else {
@@ -1277,17 +1277,17 @@ function FindUnexpectedCrashDumpFiles()
 function RemovePendingCrashDumpFiles()
 {
     if (!g.pendingCrashDumpDir.exists()) {
         return;
     }
 
     let entries = g.pendingCrashDumpDir.directoryEntries;
     while (entries.hasMoreElements()) {
-        let file = entries.getNext().QueryInterface(Ci.nsIFile);
+        let file = entries.nextFile;
         if (file.isFile()) {
           file.remove(false);
           logger.info("This test left pending crash dumps; deleted "+file.path);
         }
     }
 }
 
 function CleanUpCrashDumpFiles()
--- a/modules/libjar/zipwriter/test/unit/test_bug446708.js
+++ b/modules/libjar/zipwriter/test/unit/test_bug446708.js
@@ -15,17 +15,17 @@ function AddToZip(zipWriter, path, file)
   
   // THIS IS WHERE THE ERROR OCCURS, FOR THE FILE "st14-1.tiff" IN "test_bug446708"
   zipWriter.addEntryFile(currentPath, Ci.nsIZipWriter.COMPRESSION_DEFAULT, file, false);
   
   // if it's a dir, continue adding its contents recursively...
   if (file.isDirectory()) {
     var entries = file.QueryInterface(Ci.nsIFile).directoryEntries;
     while (entries.hasMoreElements()) {
-      var entry = entries.getNext().QueryInterface(Ci.nsIFile);
+      var entry = entries.nextFile;
       AddToZip(zipWriter, currentPath, entry);
     }
   }
   
   // ...otherwise, we're done
 }
 
 function RecursivelyZipDirectory(bundle)
--- a/modules/libpref/Preferences.cpp
+++ b/modules/libpref/Preferences.cpp
@@ -3982,48 +3982,38 @@ pref_CompareFileNames(nsIFile* aFile1, n
 // sorted reverse-alphabetically; a set of "special file names" may be
 // specified which are loaded after all the others.
 static nsresult
 pref_LoadPrefsInDir(nsIFile* aDir,
                     char const* const* aSpecialFiles,
                     uint32_t aSpecialFilesCount)
 {
   nsresult rv, rv2;
-  bool hasMoreElements;
-
-  nsCOMPtr<nsISimpleEnumerator> dirIterator;
+
+  nsCOMPtr<nsIDirectoryEnumerator> dirIterator;
 
   // This may fail in some normal cases, such as embedders who do not use a
   // GRE.
   rv = aDir->GetDirectoryEntries(getter_AddRefs(dirIterator));
   if (NS_FAILED(rv)) {
     // If the directory doesn't exist, then we have no reason to complain. We
     // loaded everything (and nothing) successfully.
     if (rv == NS_ERROR_FILE_NOT_FOUND ||
         rv == NS_ERROR_FILE_TARGET_DOES_NOT_EXIST) {
       rv = NS_OK;
     }
     return rv;
   }
 
-  rv = dirIterator->HasMoreElements(&hasMoreElements);
-  NS_ENSURE_SUCCESS(rv, rv);
-
   nsCOMArray<nsIFile> prefFiles(INITIAL_PREF_FILES);
   nsCOMArray<nsIFile> specialFiles(aSpecialFilesCount);
   nsCOMPtr<nsIFile> prefFile;
 
-  while (hasMoreElements && NS_SUCCEEDED(rv)) {
-    nsCOMPtr<nsISupports> supports;
-    rv = dirIterator->GetNext(getter_AddRefs(supports));
-    prefFile = do_QueryInterface(supports);
-    if (NS_FAILED(rv)) {
-      break;
-    }
-
+  while (NS_SUCCEEDED(dirIterator->GetNextFile(getter_AddRefs(prefFile))) &&
+         prefFile) {
     nsAutoCString leafName;
     prefFile->GetNativeLeafName(leafName);
     MOZ_ASSERT(
       !leafName.IsEmpty(),
       "Failure in default prefs: directory enumerator returned empty file?");
 
     // Skip non-js files.
     if (StringEndsWith(leafName,
@@ -4040,18 +4030,16 @@ pref_LoadPrefsInDir(nsIFile* aDir,
           specialFiles.ReplaceObjectAt(prefFile, i);
         }
       }
 
       if (shouldParse) {
         prefFiles.AppendObject(prefFile);
       }
     }
-
-    rv = dirIterator->HasMoreElements(&hasMoreElements);
   }
 
   if (prefFiles.Count() + specialFiles.Count() == 0) {
     NS_WARNING("No default pref files found.");
     if (NS_SUCCEEDED(rv)) {
       rv = NS_SUCCESS_FILE_DIRECTORY_EMPTY;
     }
     return rv;
--- a/netwerk/base/nsDirectoryIndexStream.cpp
+++ b/netwerk/base/nsDirectoryIndexStream.cpp
@@ -91,33 +91,27 @@ nsDirectoryIndexStream::Init(nsIFile* aD
     if (MOZ_LOG_TEST(gLog, LogLevel::Debug)) {
         MOZ_LOG(gLog, LogLevel::Debug,
                ("nsDirectoryIndexStream[%p]: initialized on %s",
                 this, aDir->HumanReadablePath().get()));
     }
 
     // Sigh. We have to allocate on the heap because there are no
     // assignment operators defined.
-    nsCOMPtr<nsISimpleEnumerator> iter;
+    nsCOMPtr<nsIDirectoryEnumerator> iter;
     rv = aDir->GetDirectoryEntries(getter_AddRefs(iter));
     if (NS_FAILED(rv)) return rv;
 
     // Now lets sort, because clients expect it that way
     // XXX - should we do so here, or when the first item is requested?
     // XXX - use insertion sort instead?
 
-    bool more;
-    nsCOMPtr<nsISupports> elem;
-    while (NS_SUCCEEDED(iter->HasMoreElements(&more)) && more) {
-        rv = iter->GetNext(getter_AddRefs(elem));
-        if (NS_SUCCEEDED(rv)) {
-            nsCOMPtr<nsIFile> file = do_QueryInterface(elem);
-            if (file)
-                mArray.AppendObject(file); // addrefs
-        }
+    nsCOMPtr<nsIFile> file;
+    while (NS_SUCCEEDED(iter->GetNextFile(getter_AddRefs(file))) && file) {
+        mArray.AppendObject(file); // addrefs
     }
 
 #ifdef THREADSAFE_I18N
     nsCOMPtr<nsICollationFactory> cf = do_CreateInstance(NS_COLLATIONFACTORY_CONTRACTID,
                                                          &rv);
     if (NS_FAILED(rv)) return rv;
 
     nsCOMPtr<nsICollation> coll;
--- a/netwerk/cache/nsDeleteDir.cpp
+++ b/netwerk/cache/nsDeleteDir.cpp
@@ -327,34 +327,25 @@ nsDeleteDir::RemoveOldTrashes(nsIFile *c
 #if defined(MOZ_WIDGET_ANDROID)
   rv = trash->GetParent(getter_AddRefs(parent));
 #else
   rv = cacheDir->GetParent(getter_AddRefs(parent));
 #endif
   if (NS_FAILED(rv))
     return rv;
 
-  nsCOMPtr<nsISimpleEnumerator> iter;
+  nsCOMPtr<nsIDirectoryEnumerator> iter;
   rv = parent->GetDirectoryEntries(getter_AddRefs(iter));
   if (NS_FAILED(rv))
     return rv;
 
-  bool more;
-  nsCOMPtr<nsISupports> elem;
   nsAutoPtr<nsCOMArray<nsIFile> > dirList;
 
-  while (NS_SUCCEEDED(iter->HasMoreElements(&more)) && more) {
-    rv = iter->GetNext(getter_AddRefs(elem));
-    if (NS_FAILED(rv))
-      continue;
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(elem);
-    if (!file)
-      continue;
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED(iter->GetNextFile(getter_AddRefs(file))) && file) {
     nsAutoString leafName;
     rv = file->GetLeafName(leafName);
     if (NS_FAILED(rv))
       continue;
 
     // match all names that begin with the trash name (i.e. "Cache.Trash")
     if (Substring(leafName, 0, trashName.Length()).Equals(trashName)) {
       if (!dirList)
@@ -411,36 +402,23 @@ nsDeleteDir::RemoveDir(nsIFile *file, bo
     return NS_ERROR_UNEXPECTED;
 
   bool isDir;
   rv = file->IsDirectory(&isDir);
   if (NS_FAILED(rv))
     return rv;
 
   if (isDir) {
-    nsCOMPtr<nsISimpleEnumerator> iter;
+    nsCOMPtr<nsIDirectoryEnumerator> iter;
     rv = file->GetDirectoryEntries(getter_AddRefs(iter));
     if (NS_FAILED(rv))
       return rv;
 
-    bool more;
-    nsCOMPtr<nsISupports> elem;
-    while (NS_SUCCEEDED(iter->HasMoreElements(&more)) && more) {
-      rv = iter->GetNext(getter_AddRefs(elem));
-      if (NS_FAILED(rv)) {
-        NS_WARNING("Unexpected failure in nsDeleteDir::RemoveDir");
-        continue;
-      }
-
-      nsCOMPtr<nsIFile> file2 = do_QueryInterface(elem);
-      if (!file2) {
-        NS_WARNING("Unexpected failure in nsDeleteDir::RemoveDir");
-        continue;
-      }
-
+    nsCOMPtr<nsIFile> file2;
+    while (NS_SUCCEEDED(iter->GetNextFile(getter_AddRefs(file2))) && file2) {
       RemoveDir(file2, stopDeleting);
       // No check for errors to remove as much as possible
 
       if (*stopDeleting)
         return NS_OK;
     }
   }
 
--- a/netwerk/cache2/CacheFileContextEvictor.cpp
+++ b/netwerk/cache2/CacheFileContextEvictor.cpp
@@ -335,23 +335,18 @@ CacheFileContextEvictor::LoadEvictInfoFr
   LOG(("CacheFileContextEvictor::LoadEvictInfoFromDisk() [this=%p]", this));
 
   nsresult rv;
 
   MOZ_ASSERT(CacheFileIOManager::IsOnIOThread());
 
   sDiskAlreadySearched = true;
 
-  nsCOMPtr<nsISimpleEnumerator> enumerator;
-  rv = mCacheDirectory->GetDirectoryEntries(getter_AddRefs(enumerator));
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  nsCOMPtr<nsIDirectoryEnumerator> dirEnum = do_QueryInterface(enumerator, &rv);
+  nsCOMPtr<nsIDirectoryEnumerator> dirEnum;
+  rv = mCacheDirectory->GetDirectoryEntries(getter_AddRefs(dirEnum));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   while (true) {
     nsCOMPtr<nsIFile> file;
     rv = dirEnum->GetNextFile(getter_AddRefs(file));
     if (!file) {
--- a/netwerk/cache2/CacheFileIOManager.cpp
+++ b/netwerk/cache2/CacheFileIOManager.cpp
@@ -3491,22 +3491,18 @@ CacheFileIOManager::RemoveTrashInternal(
       rv = FindTrashDirToRemove();
       if (rv == NS_ERROR_NOT_AVAILABLE) {
         LOG(("CacheFileIOManager::RemoveTrashInternal() - No trash directory "
              "found."));
         return NS_OK;
       }
       NS_ENSURE_SUCCESS(rv, rv);
 
-      nsCOMPtr<nsISimpleEnumerator> enumerator;
-      rv = mTrashDir->GetDirectoryEntries(getter_AddRefs(enumerator));
-      if (NS_SUCCEEDED(rv)) {
-        mTrashDirEnumerator = do_QueryInterface(enumerator, &rv);
-        NS_ENSURE_SUCCESS(rv, rv);
-      }
+      rv = mTrashDir->GetDirectoryEntries(getter_AddRefs(mTrashDirEnumerator));
+      NS_ENSURE_SUCCESS(rv, rv);
 
       continue; // check elapsed time
     }
 
     // We null out mTrashDirEnumerator once we remove all files in the
     // directory, so remove the trash directory if we don't have enumerator.
     if (!mTrashDirEnumerator) {
       rv = mTrashDir->Remove(false);
@@ -3556,34 +3552,22 @@ CacheFileIOManager::FindTrashDirToRemove
   LOG(("CacheFileIOManager::FindTrashDirToRemove()"));
 
   nsresult rv;
 
   // We call this method on the main thread during shutdown when user wants to
   // remove all cache files.
   MOZ_ASSERT(mIOThread->IsCurrentThread() || mShuttingDown);
 
-  nsCOMPtr<nsISimpleEnumerator> iter;
+  nsCOMPtr<nsIDirectoryEnumerator> iter;
   rv = mCacheDirectory->GetDirectoryEntries(getter_AddRefs(iter));
   NS_ENSURE_SUCCESS(rv, rv);
 
-  bool more;
-  nsCOMPtr<nsISupports> elem;
-
-  while (NS_SUCCEEDED(iter->HasMoreElements(&more)) && more) {
-    rv = iter->GetNext(getter_AddRefs(elem));
-    if (NS_FAILED(rv)) {
-      continue;
-    }
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(elem);
-    if (!file) {
-      continue;
-    }
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED(iter->GetNextFile(getter_AddRefs(file))) && file) {
     bool isDir = false;
     file->IsDirectory(&isDir);
     if (!isDir) {
       continue;
     }
 
     nsAutoCString leafName;
     rv = file->GetNativeLeafName(leafName);
--- a/netwerk/cache2/CacheIndex.cpp
+++ b/netwerk/cache2/CacheIndex.cpp
@@ -2683,21 +2683,17 @@ CacheIndex::SetupDirectoryEnumerator()
   if (!exists) {
     NS_WARNING("CacheIndex::SetupDirectoryEnumerator() - Entries directory "
                "doesn't exist!");
     LOG(("CacheIndex::SetupDirectoryEnumerator() - Entries directory doesn't "
           "exist!" ));
     return NS_ERROR_UNEXPECTED;
   }
 
-  nsCOMPtr<nsISimpleEnumerator> enumerator;
-  rv = file->GetDirectoryEntries(getter_AddRefs(enumerator));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  mDirEnumerator = do_QueryInterface(enumerator, &rv);
+  rv = file->GetDirectoryEntries(getter_AddRefs(mDirEnumerator));
   NS_ENSURE_SUCCESS(rv, rv);
 
   return NS_OK;
 }
 
 nsresult
 CacheIndex::InitEntryFromDiskData(CacheIndexEntry *aEntry,
                                   CacheFileMetadata *aMetaData,
--- a/netwerk/test/httpserver/httpd.js
+++ b/netwerk/test/httpserver/httpd.js
@@ -2096,17 +2096,17 @@ function defaultIndexHandler(metadata, r
 
   var directory = metadata.getProperty("directory");
   NS_ASSERT(directory && directory.isDirectory());
 
   var fileList = [];
   var files = directory.directoryEntries;
   while (files.hasMoreElements())
   {
-    var f = files.getNext().QueryInterface(Ci.nsIFile);
+    var f = files.nextFile;
     var name = f.leafName;
     if (!f.isHidden() &&
         (name.charAt(name.length - 1) != HIDDEN_CHAR ||
          name.charAt(name.length - 2) == HIDDEN_CHAR))
       fileList.push(f);
   }
 
   fileList.sort(fileSort);
--- a/testing/mochitest/browser-test.js
+++ b/testing/mochitest/browser-test.js
@@ -754,17 +754,17 @@ Tester.prototype = {
 
       if (gConfig.cleanupCrashes) {
         let gdir = Services.dirsvc.get("UAppData", Ci.nsIFile);
         gdir.append("Crash Reports");
         gdir.append("pending");
         if (gdir.exists()) {
           let entries = gdir.directoryEntries;
           while (entries.hasMoreElements()) {
-            let entry = entries.getNext().QueryInterface(Ci.nsIFile);
+            let entry = entries.nextFile;
             if (entry.isFile()) {
               let msg = "this test left a pending crash report; ";
               try {
                 entry.remove(false);
                 msg += "deleted " + entry.path;
               } catch (e) {
                 msg += "could not delete " + entry.path;
               }
--- a/testing/mochitest/server.js
+++ b/testing/mochitest/server.js
@@ -376,18 +376,17 @@ function serverDebug(metadata, response)
 
 /**
  * Creates a generator that iterates over the contents of
  * an nsIFile directory.
  */
 function* dirIter(dir) {
   var en = dir.directoryEntries;
   while (en.hasMoreElements()) {
-    var file = en.getNext();
-    yield file.QueryInterface(Ci.nsIFile);
+    yield en.nextFile;
   }
 }
 
 /**
  * Builds an optionally nested object containing links to the
  * files and directories within dir.
  */
 function list(requestPath, directory, recurse) {
--- a/testing/specialpowers/content/SpecialPowersObserverAPI.js
+++ b/testing/specialpowers/content/SpecialPowersObserverAPI.js
@@ -175,32 +175,32 @@ SpecialPowersObserverAPI.prototype = {
     var crashDumpDir = this._getCrashDumpDir();
     var entries = crashDumpDir.exists() && crashDumpDir.directoryEntries;
     if (!entries) {
       return [];
     }
 
     var crashDumpFiles = [];
     while (entries.hasMoreElements()) {
-      var file = entries.getNext().QueryInterface(Ci.nsIFile);
+      var file = entries.nextFile;
       var path = String(file.path);
       if (path.match(/\.(dmp|extra)$/) && !aToIgnore[path]) {
         crashDumpFiles.push(path);
       }
     }
     return crashDumpFiles.concat();
   },
 
   _deletePendingCrashDumpFiles() {
     var crashDumpDir = this._getPendingCrashDumpDir();
     var removed = false;
     if (crashDumpDir.exists()) {
       let entries = crashDumpDir.directoryEntries;
       while (entries.hasMoreElements()) {
-        let file = entries.getNext().QueryInterface(Ci.nsIFile);
+        let file = entries.nextFile;
         if (file.isFile()) {
           file.remove(false);
           removed = true;
         }
       }
     }
     return removed;
   },
--- a/toolkit/components/extensions/test/xpcshell/test_ext_downloads_download.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_downloads_download.js
@@ -29,17 +29,17 @@ function setup() {
   Services.prefs.setComplexValue("browser.download.dir", Ci.nsIFile, downloadDir);
 
   registerCleanupFunction(() => {
     Services.prefs.clearUserPref("browser.download.folderList");
     Services.prefs.clearUserPref("browser.download.dir");
 
     let entries = downloadDir.directoryEntries;
     while (entries.hasMoreElements()) {
-      let entry = entries.getNext().QueryInterface(Ci.nsIFile);
+      let entry = entries.nextFile;
       ok(false, `Leftover file ${entry.path} in download directory`);
       entry.remove(false);
     }
 
     downloadDir.remove(false);
   });
 }
 
--- a/toolkit/components/extensions/test/xpcshell/test_ext_downloads_private.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_downloads_private.js
@@ -20,17 +20,17 @@ function setup() {
   Services.prefs.setComplexValue("browser.download.dir", Ci.nsIFile, downloadDir);
 
   registerCleanupFunction(() => {
     Services.prefs.clearUserPref("browser.download.folderList");
     Services.prefs.clearUserPref("browser.download.dir");
 
     let entries = downloadDir.directoryEntries;
     while (entries.hasMoreElements()) {
-      let entry = entries.getNext().QueryInterface(Ci.nsIFile);
+      let entry = entries.nextFile;
       ok(false, `Leftover file ${entry.path} in download directory`);
       entry.remove(false);
     }
 
     downloadDir.remove(false);
   });
 }
 
--- a/toolkit/components/feeds/test/head.js
+++ b/toolkit/components/feeds/test/head.js
@@ -47,18 +47,17 @@ function readTestData(testFile) {
 }
 
 function iterateDir(dir, recurse, callback) {
   info("Iterate " + dir.leafName);
   let entries = dir.directoryEntries;
 
   // Loop over everything in this dir. If its a dir
   while (entries.hasMoreElements()) {
-    let entry = entries.getNext();
-    entry.QueryInterface(Ci.nsIFile);
+    let entry = entries.nextFile;
 
     if (entry.isDirectory()) {
       if (recurse) {
         iterateDir(entry, recurse, callback);
       }
     } else {
       callback(entry);
     }
--- a/toolkit/components/osfile/tests/mochi/main_test_osfile_async.js
+++ b/toolkit/components/osfile/tests/mochi/main_test_osfile_async.js
@@ -111,17 +111,17 @@ var reference_fetch_file = function refe
 
   });
 };
 
 var reference_dir_contents = function reference_dir_contents(path) {
   let result = [];
   let entries = new FileUtils.File(path).directoryEntries;
   while (entries.hasMoreElements()) {
-    let entry = entries.getNext().QueryInterface(Ci.nsIFile);
+    let entry = entries.nextFile;
     result.push(entry.path);
   }
   return result;
 };
 
 // Set/Unset OS.Shared.DEBUG, OS.Shared.TEST and a console listener.
 function toggleDebugTest(pref, consoleListener) {
   Services.prefs.setBoolPref("toolkit.osfile.log", pref);
--- a/toolkit/components/places/tests/bookmarks/test_477583_json-backup-in-future.js
+++ b/toolkit/components/places/tests/bookmarks/test_477583_json-backup-in-future.js
@@ -5,28 +5,28 @@
 "use strict";
 
 add_task(async function test_json_backup_in_future() {
   let backupFolder = await PlacesBackups.getBackupFolder();
   let bookmarksBackupDir = new FileUtils.File(backupFolder);
   // Remove all files from backups folder.
   let files = bookmarksBackupDir.directoryEntries;
   while (files.hasMoreElements()) {
-    let entry = files.getNext().QueryInterface(Ci.nsIFile);
+    let entry = files.nextFile;
     entry.remove(false);
   }
 
   // Create a json dummy backup in the future.
   let dateObj = new Date();
   dateObj.setYear(dateObj.getFullYear() + 1);
   let name = PlacesBackups.getFilenameForDate(dateObj);
   Assert.equal(name, "bookmarks-" + PlacesBackups.toISODateString(dateObj) + ".json");
   files = bookmarksBackupDir.directoryEntries;
   while (files.hasMoreElements()) {
-    let entry = files.getNext().QueryInterface(Ci.nsIFile);
+    let entry = files.nextFile;
     if (PlacesBackups.filenamesRegex.test(entry.leafName))
       entry.remove(false);
   }
 
   let futureBackupFile = bookmarksBackupDir.clone();
   futureBackupFile.append(name);
   futureBackupFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o600);
   Assert.ok(futureBackupFile.exists());
--- a/toolkit/components/places/tests/head_common.js
+++ b/toolkit/components/places/tests/head_common.js
@@ -496,17 +496,17 @@ function remove_all_JSON_backups() {
  */
 function check_JSON_backup(aIsAutomaticBackup) {
   let profileBookmarksJSONFile;
   if (aIsAutomaticBackup) {
     let bookmarksBackupDir = gProfD.clone();
     bookmarksBackupDir.append("bookmarkbackups");
     let files = bookmarksBackupDir.directoryEntries;
     while (files.hasMoreElements()) {
-      let entry = files.getNext().QueryInterface(Ci.nsIFile);
+      let entry = files.nextFile;
       if (PlacesBackups.filenamesRegex.test(entry.leafName)) {
         profileBookmarksJSONFile = entry;
         break;
       }
     }
   } else {
     profileBookmarksJSONFile = gProfD.clone();
     profileBookmarksJSONFile.append("bookmarkbackups");
--- a/toolkit/components/places/tests/unit/test_utils_backups_create.js
+++ b/toolkit/components/places/tests/unit/test_utils_backups_create.js
@@ -50,17 +50,17 @@ add_task(async function() {
   // oldest backup should have been removed.
   for (let i = 0; i < dates.length; i++) {
     let backupFilename;
     let shouldExist;
     let backupFile;
     if (i > 0) {
       let files = bookmarksBackupDir.directoryEntries;
       while (files.hasMoreElements()) {
-        let entry = files.getNext().QueryInterface(Ci.nsIFile);
+        let entry = files.nextFile;
         if (PlacesBackups.filenamesRegex.test(entry.leafName)) {
           backupFilename = entry.leafName;
           backupFile = entry;
           break;
         }
       }
       shouldExist = true;
     } else {
@@ -73,13 +73,13 @@ add_task(async function() {
       do_throw("Backup should " + (shouldExist ? "" : "not") + " exist: " + backupFilename);
   }
 
   // Cleanup backups folder.
   // XXX: Can't use bookmarksBackupDir.remove(true) because file lock happens
   // on WIN XP.
   let files = bookmarksBackupDir.directoryEntries;
   while (files.hasMoreElements()) {
-    let entry = files.getNext().QueryInterface(Ci.nsIFile);
+    let entry = files.nextFile;
     entry.remove(false);
   }
   Assert.ok(!bookmarksBackupDir.directoryEntries.hasMoreElements());
 });
--- a/toolkit/components/search/nsSearchService.js
+++ b/toolkit/components/search/nsSearchService.js
@@ -2846,17 +2846,17 @@ SearchService.prototype = {
       locations = getDir(NS_APP_DISTRIBUTION_SEARCH_DIR_LIST,
                          Ci.nsISimpleEnumerator);
     } catch (e) {
       // NS_APP_DISTRIBUTION_SEARCH_DIR_LIST is defined by each app
       // so this throws during unit tests (but not xpcshell tests).
       locations = {hasMoreElements: () => false};
     }
     while (locations.hasMoreElements()) {
-      let dir = locations.getNext().QueryInterface(Ci.nsIFile);
+      let dir = locations.nextFile;
       if (dir.directoryEntries.hasMoreElements())
         distDirs.push(dir);
     }
 
     function notInCacheVisibleEngines(aEngineName) {
       return !cache.visibleDefaultEngines.includes(aEngineName);
     }
 
@@ -3202,19 +3202,17 @@ SearchService.prototype = {
       LOG("Failed to load " + json._name + " from cache: " + ex);
       LOG("Engine JSON: " + json.toSource());
     }
   },
 
   _loadEnginesFromDir: function SRCH_SVC__loadEnginesFromDir(aDir) {
     LOG("_loadEnginesFromDir: Searching in " + aDir.path + " for search engines.");
 
-    var files = aDir.directoryEntries
-                    .QueryInterface(Ci.nsIDirectoryEnumerator);
-
+    var files = aDir.directoryEntries;
     while (files.hasMoreElements()) {
       var file = files.nextFile;
 
       // Ignore hidden and empty files, and directories
       if (!file.isFile() || file.fileSize == 0 || file.isHidden())
         continue;
 
       var fileURL = Services.io.newFileURI(file).QueryInterface(Ci.nsIURL);
--- a/toolkit/components/telemetry/Telemetry.cpp
+++ b/toolkit/components/telemetry/Telemetry.cpp
@@ -1095,22 +1095,18 @@ ReadStack(PathCharPtr aFileName, Telemet
   }
 
   aStack = stack;
 }
 
 void
 TelemetryImpl::ReadLateWritesStacks(nsIFile* aProfileDir)
 {
-  nsCOMPtr<nsISimpleEnumerator> e;
-  if (NS_FAILED(aProfileDir->GetDirectoryEntries(getter_AddRefs(e)))) {
-    return;
-  }
-  nsCOMPtr<nsIDirectoryEnumerator> files(do_QueryInterface(e));
-  if (!files) {
+  nsCOMPtr<nsIDirectoryEnumerator> files;
+  if (NS_FAILED(aProfileDir->GetDirectoryEntries(getter_AddRefs(files)))) {
     return;
   }
 
   NS_NAMED_LITERAL_STRING(prefix, "Telemetry.LateWriteFinal-");
   nsCOMPtr<nsIFile> file;
   while (NS_SUCCEEDED(files->GetNextFile(getter_AddRefs(file))) && file) {
     nsAutoString leafName;
     if (NS_FAILED(file->GetLeafName(leafName)) ||
--- a/toolkit/components/url-classifier/Classifier.cpp
+++ b/toolkit/components/url-classifier/Classifier.cpp
@@ -328,29 +328,22 @@ Classifier::ResetTables(ClearType aType,
 
     RegenActiveTables();
   }
 }
 
 void
 Classifier::DeleteTables(nsIFile* aDirectory, const nsTArray<nsCString>& aTables)
 {
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   NS_ENSURE_SUCCESS_VOID(rv);
 
-  bool hasMore;
-  while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore) {
-    nsCOMPtr<nsISupports> supports;
-    rv = entries->GetNext(getter_AddRefs(supports));
-    NS_ENSURE_SUCCESS_VOID(rv);
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(supports);
-    NS_ENSURE_TRUE_VOID(file);
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED(rv = entries->GetNextFile(getter_AddRefs(file))) && file) {
     // If |file| is a directory, recurse to find its entries as well.
     bool isDirectory;
     if (NS_FAILED(file->IsDirectory(&isDirectory))) {
       continue;
     }
     if (isDirectory) {
       DeleteTables(file, aTables);
       continue;
@@ -965,28 +958,22 @@ Classifier::RegenActiveTables()
   }
 
   return NS_OK;
 }
 
 nsresult
 Classifier::ScanStoreDir(nsIFile* aDirectory, nsTArray<nsCString>& aTables)
 {
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   NS_ENSURE_SUCCESS(rv, rv);
 
-  bool hasMore;
-  while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore) {
-    nsCOMPtr<nsISupports> supports;
-    rv = entries->GetNext(getter_AddRefs(supports));
-    NS_ENSURE_SUCCESS(rv, rv);
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(supports);
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED(rv = entries->GetNextFile(getter_AddRefs(file))) && file) {
     // If |file| is a directory, recurse to find its entries as well.
     bool isDirectory;
     if (NS_FAILED(file->IsDirectory(&isDirectory))) {
       continue;
     }
     if (isDirectory) {
       ScanStoreDir(file, aTables);
       continue;
@@ -1559,29 +1546,23 @@ Classifier::ReadNoiseEntries(const Prefi
   }
 
   return NS_OK;
 }
 
 nsresult
 Classifier::LoadMetadata(nsIFile* aDirectory, nsACString& aResult)
 {
-  nsCOMPtr<nsISimpleEnumerator> entries;
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   nsresult rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
   NS_ENSURE_SUCCESS(rv, rv);
   NS_ENSURE_ARG_POINTER(entries);
 
-  bool hasMore;
-  while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore) {
-    nsCOMPtr<nsISupports> supports;
-    rv = entries->GetNext(getter_AddRefs(supports));
-    NS_ENSURE_SUCCESS(rv, rv);
-
-    nsCOMPtr<nsIFile> file = do_QueryInterface(supports);
-
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED(rv = entries->GetNextFile(getter_AddRefs(file))) && file) {
     // If |file| is a directory, recurse to find its entries as well.
     bool isDirectory;
     if (NS_FAILED(file->IsDirectory(&isDirectory))) {
       continue;
     }
     if (isDirectory) {
       LoadMetadata(file, aResult);
       continue;
--- a/toolkit/content/tests/chrome/RegisterUnregisterChrome.js
+++ b/toolkit/content/tests/chrome/RegisterUnregisterChrome.js
@@ -21,18 +21,17 @@ function copyToTemporaryFile(f) {
 }
 
 function* dirIter(directory) {
   var testsDir = Services.io.newURI(directory)
                   .QueryInterface(Ci.nsIFileURL).file;
 
   let en = testsDir.directoryEntries;
   while (en.hasMoreElements()) {
-    let file = en.getNext();
-    yield file.QueryInterface(Ci.nsIFile);
+    yield en.nextFile;
   }
 }
 
 function getParent(path) {
   let lastSlash = path.lastIndexOf("/");
   if (lastSlash == -1) {
     lastSlash = path.lastIndexOf("\\");
     if (lastSlash == -1) {
--- a/toolkit/crashreporter/CrashReports.jsm
+++ b/toolkit/crashreporter/CrashReports.jsm
@@ -19,17 +19,17 @@ var CrashReports = {
       // Ignore any non http/https urls
       if (!/^https?:/i.test(Services.prefs.getCharPref("breakpad.reportURL")))
         return reports;
     } catch (e) { }
 
     if (this.submittedDir.exists() && this.submittedDir.isDirectory()) {
       let entries = this.submittedDir.directoryEntries;
       while (entries.hasMoreElements()) {
-        let file = entries.getNext().QueryInterface(Ci.nsIFile);
+        let file = entries.nextFile;
         let leaf = file.leafName;
         if (leaf.startsWith("bp-") &&
             leaf.endsWith(".txt")) {
           let entry = {
             id: leaf.slice(0, -4),
             date: file.lastModifiedTime,
             pending: false
           };
@@ -37,17 +37,17 @@ var CrashReports = {
         }
       }
     }
 
     if (this.pendingDir.exists() && this.pendingDir.isDirectory()) {
       let uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
       let entries = this.pendingDir.directoryEntries;
       while (entries.hasMoreElements()) {
-        let file = entries.getNext().QueryInterface(Ci.nsIFile);
+        let file = entries.nextFile;
         let leaf = file.leafName;
         let id = leaf.slice(0, -4);
         if (leaf.endsWith(".dmp") && uuidRegex.test(id)) {
           let entry = {
             id,
             date: file.lastModifiedTime,
             pending: true
           };
--- a/toolkit/crashreporter/test/browser/browser_clearReports.js
+++ b/toolkit/crashreporter/test/browser/browser_clearReports.js
@@ -103,17 +103,17 @@ add_task(async function test() {
       let existing = [ file1.path, file2.path, report1.path, report2.path,
                        report3.path, submitdir.path, pendingdir.path ];
 
       await ContentTask.spawn(browser, null, clickClearReports);
 
       for (let dir of dirs) {
         let entries = dir.directoryEntries;
         while (entries.hasMoreElements()) {
-          let file = entries.getNext().QueryInterface(Ci.nsIFile);
+          let file = entries.nextFile;
           let index = existing.indexOf(file.path);
           isnot(index, -1, file.leafName + " exists");
 
           if (index != -1) {
             existing.splice(index, 1);
           }
         }
       }
--- a/toolkit/crashreporter/test/unit/head_crashreporter.js
+++ b/toolkit/crashreporter/test/unit/head_crashreporter.js
@@ -85,17 +85,17 @@ function do_crash(setup, callback, canRe
   }
 
   handleMinidump(callback);
 }
 
 function getMinidump() {
   let en = do_get_tempdir().directoryEntries;
   while (en.hasMoreElements()) {
-    let f = en.getNext().QueryInterface(Ci.nsIFile);
+    let f = en.nextFile;
     if (f.leafName.substr(-4) == ".dmp") {
       return f;
     }
   }
 
   return null;
 }
 
--- a/toolkit/mozapps/installer/precompile_cache.js
+++ b/toolkit/mozapps/installer/precompile_cache.js
@@ -28,17 +28,17 @@ function dir_entries(baseDir, subpath, e
     var dir = baseDir.clone();
     dir.append(subpath);
     var enumerator = dir.directoryEntries;
   } catch (e) {
     return [];
   }
   var entries = [];
   while (enumerator.hasMoreElements()) {
-    var file = enumerator.getNext().QueryInterface(Ci.nsIFile);
+    var file = enumerator.nextFile;
     if (file.isDirectory()) {
       entries = entries.concat(dir_entries(dir, file.leafName, ext).map(p => subpath + "/" + p));
     } else if (endsWith(file.leafName, ext)) {
       entries.push(subpath + "/" + file.leafName);
     }
   }
   return entries;
 }
--- a/toolkit/mozapps/update/nsUpdateService.js
+++ b/toolkit/mozapps/update/nsUpdateService.js
@@ -333,17 +333,17 @@ function hasUpdateMutex() {
  * Determines whether or not all descendants of a directory are writeable.
  * Note: Does not check the root directory itself for writeability.
  *
  * @return true if all descendants are writeable, false otherwise
  */
 function areDirectoryEntriesWriteable(aDir) {
   let items = aDir.directoryEntries;
   while (items.hasMoreElements()) {
-    let item = items.getNext().QueryInterface(Ci.nsIFile);
+    let item = items.nextFile;
     if (!item.isWritable()) {
       LOG("areDirectoryEntriesWriteable - unable to write to " + item.path);
       return false;
     }
     if (item.isDirectory() && !areDirectoryEntriesWriteable(item)) {
       return false;
     }
   }
@@ -810,17 +810,17 @@ function cleanUpUpdatesDir(aRemovePatchF
       LOG("cleanUpUpdatesDir - failed to rename file " + updateLogFile.path +
           " to " + FILE_LAST_UPDATE_LOG);
     }
   }
 
   if (aRemovePatchFiles) {
     let dirEntries = updateDir.directoryEntries;
     while (dirEntries.hasMoreElements()) {
-      let file = dirEntries.getNext().QueryInterface(Ci.nsIFile);
+      let file = dirEntries.nextFile;
       // Now, recursively remove this file.  The recursive removal is needed for
       // Mac OSX because this directory will contain a copy of updater.app,
       // which is itself a directory and the MozUpdater directory on platforms
       // other than Windows.
       try {
         file.remove(true);
       } catch (e) {
         LOG("cleanUpUpdatesDir - failed to remove file " + file.path);
--- a/toolkit/mozapps/update/tests/data/shared.js
+++ b/toolkit/mozapps/update/tests/data/shared.js
@@ -447,17 +447,17 @@ function removeUpdateDirsAndFiles() {
  */
 function cleanUpdatesDir(aDir) {
   if (!aDir.exists()) {
     return;
   }
 
   let dirEntries = aDir.directoryEntries;
   while (dirEntries.hasMoreElements()) {
-    let entry = dirEntries.getNext().QueryInterface(Ci.nsIFile);
+    let entry = dirEntries.nextFile;
 
     if (entry.isDirectory()) {
       if (entry.leafName == DIR_PATCH && entry.parent.leafName == DIR_UPDATES) {
         cleanUpdatesDir(entry);
         entry.permissions = PERMS_DIRECTORY;
       } else {
         try {
           entry.remove(true);
@@ -505,17 +505,17 @@ function removeDirRecursive(aDir) {
     aDir.remove(true);
     return;
   } catch (e) {
     logTestInfo("non-fatal error removing directory. Exception: " + e);
   }
 
   let dirEntries = aDir.directoryEntries;
   while (dirEntries.hasMoreElements()) {
-    let entry = dirEntries.getNext().QueryInterface(Ci.nsIFile);
+    let entry = dirEntries.nextFile;
 
     if (entry.isDirectory()) {
       removeDirRecursive(entry);
     } else {
       entry.permissions = PERMS_FILE;
       try {
         debugDump("attempting to remove file. Path: " + entry.path);
         entry.remove(false);
--- a/toolkit/mozapps/update/tests/data/xpcshellUtilsAUS.js
+++ b/toolkit/mozapps/update/tests/data/xpcshellUtilsAUS.js
@@ -3668,17 +3668,17 @@ function checkForBackupFiles(aFile) {
  */
 function checkFilesInDirRecursive(aDir, aCallback) {
   if (!aDir.exists()) {
     do_throw("Directory must exist!");
   }
 
   let dirEntries = aDir.directoryEntries;
   while (dirEntries.hasMoreElements()) {
-    let entry = dirEntries.getNext().QueryInterface(Ci.nsIFile);
+    let entry = dirEntries.nextFile;
 
     if (entry.exists()) {
       if (entry.isDirectory()) {
         checkFilesInDirRecursive(entry, aCallback);
       } else {
         aCallback(entry);
       }
     }
--- a/widget/tests/test_bug1123480.xul
+++ b/widget/tests/test_bug1123480.xul
@@ -50,17 +50,17 @@ https://bugzilla.mozilla.org/show_bug.cg
       // Path from nsAnonymousTemporaryFile.cpp, GetTempDir.
       dir = FileUtils.getFile("TmpD", ["mozilla-temp-files"]);
     } else {
       dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
       dir.initWithPath("/dev/fd");
     }
     var count = 0;
     for (var de = dir.directoryEntries; de.hasMoreElements(); ) {
-      var fdFile = de.getNext().QueryInterface(Ci.nsIFile);
+      var fdFile = de.nextFile;
       var fileSize;
       try {
         fileSize = fdFile.fileSize;
       } catch (e) {
         // This can happen on macOS.
         continue;
       }
       if (fileSize === IpsumByteLength) {
--- a/widget/tests/test_transferable_overflow.xul
+++ b/widget/tests/test_transferable_overflow.xul
@@ -55,17 +55,17 @@
     return AppConstants.platform !== 'win';
   }
 
   function getClipboardCacheFDCount() {
     var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
     dir.initWithPath("/dev/fd");
     var count = 0;
     for (var de = dir.directoryEntries; de.hasMoreElements(); ) {
-      var fdFile = de.getNext().QueryInterface(Ci.nsIFile);
+      var fdFile = de.nextFile;
       var fileSize;
       try {
         fileSize = fdFile.fileSize;
       } catch (e) {
         // This can happen on macOS.
         continue;
       }
       if (fileSize === BIG_STRING.length * 2 ||
--- a/widget/windows/JumpListBuilder.cpp
+++ b/widget/windows/JumpListBuilder.cpp
@@ -270,31 +270,27 @@ nsresult JumpListBuilder::RemoveIconCach
   // Construct the path of our jump list cache
   nsCOMPtr<nsIFile> jumpListCacheDir;
   nsresult rv = NS_GetSpecialDirectory("ProfLDS",
                                        getter_AddRefs(jumpListCacheDir));
   NS_ENSURE_SUCCESS(rv, rv);
   rv = jumpListCacheDir->AppendNative(nsDependentCString(
                          mozilla::widget::FaviconHelper::kJumpListCacheDir));
   NS_ENSURE_SUCCESS(rv, rv);
-  nsCOMPtr<nsISimpleEnumerator> entries;
+
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = jumpListCacheDir->GetDirectoryEntries(getter_AddRefs(entries));
   NS_ENSURE_SUCCESS(rv, rv);
 
   // Loop through each directory entry and remove all ICO files found
   do {
-    bool hasMore = false;
-    if (NS_FAILED(entries->HasMoreElements(&hasMore)) || !hasMore)
+    nsCOMPtr<nsIFile> currFile;
+    if (NS_FAILED(entries->GetNextFile(getter_AddRefs(currFile))) || !currFile)
       break;
 
-    nsCOMPtr<nsISupports> supp;
-    if (NS_FAILED(entries->GetNext(getter_AddRefs(supp))))
-      break;
-
-    nsCOMPtr<nsIFile> currFile(do_QueryInterface(supp));
     nsAutoString path;
     if (NS_FAILED(currFile->GetPath(path)))
       continue;
 
     if (StringTail(path, 4).LowerCaseEqualsASCII(".ico")) {
       // Check if the cached ICO file exists
       bool exists;
       if (NS_FAILED(currFile->Exists(&exists)) || !exists)
--- a/widget/windows/WinUtils.cpp
+++ b/widget/windows/WinUtils.cpp
@@ -1459,31 +1459,28 @@ NS_IMETHODIMP AsyncDeleteAllFaviconsFrom
 {
   if (!mJumpListCacheDir) {
     return NS_ERROR_FAILURE;
   }
   // Construct the path of our jump list cache
   nsresult rv = mJumpListCacheDir->AppendNative(
       nsDependentCString(FaviconHelper::kJumpListCacheDir));
   NS_ENSURE_SUCCESS(rv, rv);
-  nsCOMPtr<nsISimpleEnumerator> entries;
+
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = mJumpListCacheDir->GetDirectoryEntries(getter_AddRefs(entries));
   NS_ENSURE_SUCCESS(rv, rv);
 
   // Loop through each directory entry and remove all ICO files found
   do {
-    bool hasMore = false;
-    if (NS_FAILED(entries->HasMoreElements(&hasMore)) || !hasMore)
+    nsCOMPtr<nsIFile> currFile;
+    if (NS_FAILED(entries->GetNextFile(getter_AddRefs(currFile))) ||
+        !currFile)
       break;
 
-    nsCOMPtr<nsISupports> supp;
-    if (NS_FAILED(entries->GetNext(getter_AddRefs(supp))))
-      break;
-
-    nsCOMPtr<nsIFile> currFile(do_QueryInterface(supp));
     nsAutoString path;
     if (NS_FAILED(currFile->GetPath(path)))
       continue;
 
     if (StringTail(path, 4).LowerCaseEqualsASCII(".ico")) {
       // Check if the cached ICO file exists
       bool exists;
       if (NS_FAILED(currFile->Exists(&exists)) || !exists)
--- a/xpcom/io/nsLocalFileUnix.cpp
+++ b/xpcom/io/nsLocalFileUnix.cpp
@@ -724,30 +724,23 @@ nsLocalFile::CopyDirectoryTo(nsIFile* aN
     if (dirCheck) {
       return NS_ERROR_FILE_ALREADY_EXISTS;  // dest exists
     }
     if (NS_FAILED(rv = aNewParent->Create(DIRECTORY_TYPE, oldPerms))) {
       return rv;
     }
   }
 
-  nsCOMPtr<nsISimpleEnumerator> dirIterator;
+  nsCOMPtr<nsIDirectoryEnumerator> dirIterator;
   if (NS_FAILED(rv = GetDirectoryEntries(getter_AddRefs(dirIterator)))) {
     return rv;
   }
 
-  bool hasMore = false;
-  while (NS_SUCCEEDED(dirIterator->HasMoreElements(&hasMore)) && hasMore) {
-    nsCOMPtr<nsISupports> supports;
-    nsCOMPtr<nsIFile> entry;
-    rv = dirIterator->GetNext(getter_AddRefs(supports));
-    entry = do_QueryInterface(supports);
-    if (NS_FAILED(rv) || !entry) {
-      continue;
-    }
+  nsCOMPtr<nsIFile> entry;
+  while (NS_SUCCEEDED(dirIterator->GetNextFile(getter_AddRefs(entry))) && entry) {
     if (NS_FAILED(rv = entry->IsSymlink(&isSymlink))) {
       return rv;
     }
     if (NS_FAILED(rv = entry->IsDirectory(&dirCheck))) {
       return rv;
     }
     if (dirCheck && !isSymlink) {
       nsCOMPtr<nsIFile> destClone;
--- a/xpcom/io/nsLocalFileWin.cpp
+++ b/xpcom/io/nsLocalFileWin.cpp
@@ -2005,46 +2005,40 @@ nsLocalFile::CopyMove(nsIFile* aParentDi
     RefPtr<nsDirEnumerator> dirEnum = new nsDirEnumerator();
 
     rv = dirEnum->Init(this);
     if (NS_FAILED(rv)) {
       NS_WARNING("dirEnum initialization failed");
       return rv;
     }
 
-    bool more = false;
-    while (NS_SUCCEEDED(dirEnum->HasMoreElements(&more)) && more) {
-      nsCOMPtr<nsISupports> item;
-      nsCOMPtr<nsIFile> file;
-      dirEnum->GetNext(getter_AddRefs(item));
-      file = do_QueryInterface(item);
-      if (file) {
-        bool isDir, isLink;
-
-        file->IsDirectory(&isDir);
-        file->IsSymlink(&isLink);
-
-        if (move) {
-          if (followSymlinks) {
-            return NS_ERROR_FAILURE;
-          }
-
-          rv = file->MoveTo(target, EmptyString());
-          if (NS_FAILED(rv)) {
-            return rv;
-          }
+    nsCOMPtr<nsIFile> file;
+    while (NS_SUCCEEDED(dirEnum->GetNextFile(getter_AddRefs(file))) && file) {
+      bool isDir, isLink;
+
+      file->IsDirectory(&isDir);
+      file->IsSymlink(&isLink);
+
+      if (move) {
+        if (followSymlinks) {
+          return NS_ERROR_FAILURE;
+        }
+
+        rv = file->MoveTo(target, EmptyString());
+        if (NS_FAILED(rv)) {
+          return rv;
+        }
+      } else {
+        if (followSymlinks) {
+          rv = file->CopyToFollowingLinks(target, EmptyString());
         } else {
-          if (followSymlinks) {
-            rv = file->CopyToFollowingLinks(target, EmptyString());
-          } else {
-            rv = file->CopyTo(target, EmptyString());
-          }
-          if (NS_FAILED(rv)) {
-            return rv;
-          }
+          rv = file->CopyTo(target, EmptyString());
+        }
+        if (NS_FAILED(rv)) {
+          return rv;
         }
       }
     }
     // we've finished moving all the children of this directory
     // in the new directory.  so now delete the directory
     // note, we don't need to do a recursive delete.
     // MoveTo() is recursive.  At this point,
     // we've already moved the children of the current folder
--- a/xpcom/tests/unit/test_bug478086.js
+++ b/xpcom/tests/unit/test_bug478086.js
@@ -13,12 +13,12 @@ function run_test() {
     root.initWithPath("\\\\.");
   } else {
     return; // XXX disabled, since this causes intermittent failures on Mac (bug 481369).
     // root.initWithPath("/");
   }
   var drives = root.directoryEntries;
   Assert.ok(drives.hasMoreElements());
   while (drives.hasMoreElements()) {
-    var newPath = drives.getNext().QueryInterface(nsIFile).path;
+    var newPath = drives.nextFile.path;
     Assert.equal(newPath.indexOf("\0"), -1);
   }
 }
--- a/xpcom/tests/unit/test_symlinks.js
+++ b/xpcom/tests/unit/test_symlinks.js
@@ -113,17 +113,17 @@ function testSymLinks(testDir, relative)
   const files = [FILE_TARGET].concat(fileLinks);
   const links = otherLinks.concat(dirLinks, fileLinks);
 
   const spaces = createSpaces(dirs, files, links);
   const bools = {false: " false", true: " true "};
   print(spaces + " dir   file  symlink");
   var dirEntries = testDir.directoryEntries;
   while (dirEntries.hasMoreElements()) {
-    const file = dirEntries.getNext().QueryInterface(nsIFile);
+    const file = dirEntries.nextFile;
     const name = file.leafName;
     print(name + spaces.substring(name.length) + bools[file.isDirectory()] +
           bools[file.isFile()] + bools[file.isSymlink()]);
     Assert.equal(file.isDirectory(), dirs.includes(name));
     Assert.equal(file.isFile(), files.includes(name));
     Assert.equal(file.isSymlink(), links.includes(name));
   }
 }