Index: chrome/browser/resources/file_manager/js/file_manager.js |
diff --git a/chrome/browser/resources/file_manager/js/file_manager.js b/chrome/browser/resources/file_manager/js/file_manager.js |
index 256ad2de5cfeab1bbb05e04dc6d7c0a017dc716c..1163e927b85186faa4db0e26694600822cb2184c 100644 |
--- a/chrome/browser/resources/file_manager/js/file_manager.js |
+++ b/chrome/browser/resources/file_manager/js/file_manager.js |
@@ -2215,6 +2215,7 @@ FileManager.prototype = { |
directoryCount: 0, |
bytes: 0, |
showBytes: false, |
+ allGDataFilesPresent: this.isOnGData(), |
iconType: null, |
indexes: this.currentList_.selectionModel.selectedIndexes |
}; |
@@ -2232,6 +2233,7 @@ FileManager.prototype = { |
var fileCount = 0; |
var byteCount = 0; |
var pendingFiles = []; |
+ var pendingGDataFiles = []; |
var thumbnailCount = 0; |
var thumbnailLoaded = -1; |
var forcedShowTimeout = null; |
@@ -2305,8 +2307,21 @@ FileManager.prototype = { |
selection.bytes += entry.cachedSize_; |
selection.showBytes |= this.getFileType(entry).type != 'hosted'; |
} |
+ |
+ // Only keep checking if allGDataFilesPresent is not already false. |
+ if (selection.allGDataFilesPresent) { |
+ if (!('gdata_' in entry)) { |
+ pendingGDataFiles.push(entry); |
+ } else { |
+ selection.allGDataFilesPresent = |
+ FileManager.isAvaliableOffline_(entry.gdata_); |
+ } |
+ } |
} else { |
selection.directoryCount += 1; |
+ // We cannot afford checking every file under this directory so |
+ // we conservatively assume that some files are not present. |
+ selection.allGDataFilesPresent = false; |
} |
} |
@@ -2316,6 +2331,15 @@ FileManager.prototype = { |
forcedShowTimeout = setTimeout(showThumbnails, 100); |
onThumbnailLoaded(); |
+ if (this.fileTransferController_) { |
+ this.fileTransferController_.selectionAvailable = false; |
+ } |
+ |
+ function maybeFireSummarized() { |
+ if (pendingFiles.length == 0 && pendingGDataFiles.length == 0) |
+ self.dispatchEvent(new cr.Event('selection-summarized')); |
+ } |
+ |
function cacheNextFile(fileEntry) { |
if (fileEntry) { |
// We're careful to modify the 'selection', rather than 'self.selection' |
@@ -2328,7 +2352,21 @@ FileManager.prototype = { |
if (pendingFiles.length) { |
cacheEntryDateAndSize(pendingFiles.pop(), cacheNextFile); |
} else { |
- self.dispatchEvent(new cr.Event('selection-summarized')); |
+ maybeFireSummarized(); |
+ } |
+ } |
+ |
+ function cacheNextGDataFile(fileEntry) { |
+ // If selection.allGDataFilesPresent is already false we stop checking. |
+ if (selection.allGDataFilesPresent && fileEntry) { |
+ selection.allGDataFilesPresent = |
+ FileManager.isAvaliableOffline_(fileEntry.gdata_); |
+ } |
+ if (selection.allGDataFilesPresent && pendingGDataFiles.length) { |
+ cacheGDataProps(pendingGDataFiles.pop(), cacheNextGDataFile); |
+ } else { |
+ pendingGDataFiles = []; |
+ maybeFireSummarized(); |
} |
} |
@@ -2347,6 +2385,8 @@ FileManager.prototype = { |
} |
cacheNextFile(); |
+ if (selection.allGDataFilesPresent) |
+ cacheNextGDataFile(); |
}; |
/** |
@@ -2695,6 +2735,16 @@ FileManager.prototype = { |
return this.isOnGData() && this.isOffline(); |
}; |
+ /** |
+ * Check if all the files in the current selection are available. The only |
+ * case when files might be not available is when the selection contains |
+ * uncached GData files and the browser is offline. |
+ * @return {boolean} True if all files in the current selection are available. |
+ */ |
+ FileManager.prototype.isSelectionAvailable = function() { |
+ return !this.isOnGDataOffline() || this.selection.allGDataFilesPresent; |
+ }; |
+ |
FileManager.prototype.isOnReadonlyDirectory = function() { |
return this.directoryModel_.readonly; |
}; |
@@ -3233,6 +3283,12 @@ FileManager.prototype = { |
if (!selection.showBytes) text = text.substring(0, text.lastIndexOf(',')); |
} |
this.previewSummary_.textContent = text; |
+ |
+ this.updateOkButton_(); |
+ if (this.fileTransferController_) { |
+ this.fileTransferController_.selectionAvailable = |
+ this.isSelectionAvailable(); |
+ } |
}; |
/** |
@@ -3378,11 +3434,13 @@ FileManager.prototype = { |
selectable = this.selection.directoryCount == 1 && |
this.selection.fileCount == 0; |
} else if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_FILE) { |
- selectable = (this.selection.directoryCount == 0 && |
+ selectable = (this.isSelectionAvailable() && |
+ this.selection.directoryCount == 0 && |
this.selection.fileCount == 1); |
} else if (this.dialogType_ == |
FileManager.DialogType.SELECT_OPEN_MULTI_FILE) { |
- selectable = (this.selection.directoryCount == 0 && |
+ selectable = (this.isSelectionAvailable() && |
+ this.selection.directoryCount == 0 && |
this.selection.fileCount >= 1); |
} else if (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE) { |
if (this.isOnReadonlyDirectory()) { |