| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // If directory files changes too often, don't rescan directory more than once | 5 // If directory files changes too often, don't rescan directory more than once |
| 6 // per specified interval | 6 // per specified interval |
| 7 var SIMULTANEOUS_RESCAN_INTERVAL = 1000; | 7 var SIMULTANEOUS_RESCAN_INTERVAL = 1000; |
| 8 // Used for operations that require almost instant rescan. | 8 // Used for operations that require almost instant rescan. |
| 9 var SHORT_RESCAN_INTERVAL = 100; | 9 var SHORT_RESCAN_INTERVAL = 100; |
| 10 | 10 |
| 11 /** | 11 /** |
| 12 * Data model of the file manager. | 12 * Data model of the file manager. |
| 13 * | 13 * |
| 14 * @constructor | |
| 15 * @param {DirectoryEntry} root File system root. | 14 * @param {DirectoryEntry} root File system root. |
| 16 * @param {boolean} singleSelection True if only one file could be selected | 15 * @param {boolean} singleSelection True if only one file could be selected |
| 17 * at the time. | 16 * at the time. |
| 18 * @param {MetadataCache} metadataCache The metadata cache service. | 17 * @param {MetadataCache} metadataCache The metadata cache service. |
| 19 * @param {VolumeManager} volumeManager The volume manager. | 18 * @param {VolumeManager} volumeManager The volume manager. |
| 20 * @param {boolean} isDriveEnabled True if DRIVE enabled (initial value). | 19 * @param {boolean} isDriveEnabled True if DRIVE enabled (initial value). |
| 20 * @constructor |
| 21 */ | 21 */ |
| 22 function DirectoryModel(root, singleSelection, | 22 function DirectoryModel(root, singleSelection, |
| 23 metadataCache, volumeManager, isDriveEnabled) { | 23 metadataCache, volumeManager, isDriveEnabled) { |
| 24 this.root_ = root; | 24 this.root_ = root; |
| 25 var fileList = new cr.ui.ArrayDataModel([]); | 25 var fileList = new cr.ui.ArrayDataModel([]); |
| 26 this.fileListSelection_ = singleSelection ? | 26 this.fileListSelection_ = singleSelection ? |
| 27 new cr.ui.ListSingleSelectionModel() : new cr.ui.ListSelectionModel(); | 27 new cr.ui.ListSingleSelectionModel() : new cr.ui.ListSelectionModel(); |
| 28 | 28 |
| 29 this.runningScan_ = null; | 29 this.runningScan_ = null; |
| 30 this.pendingScan_ = null; | 30 this.pendingScan_ = null; |
| 31 this.rescanTime_ = null; | 31 this.rescanTime_ = null; |
| 32 this.scanFailures_ = 0; | 32 this.scanFailures_ = 0; |
| 33 this.driveEnabled_ = isDriveEnabled; | 33 this.driveEnabled_ = isDriveEnabled; |
| 34 | 34 |
| 35 this.currentFileListContext_ = new FileListContext( | 35 this.currentFileListContext_ = new FileListContext( |
| 36 metadataCache, fileList, false); | 36 metadataCache, fileList, false); |
| 37 this.currentDirContents_ = new DirectoryContentsBasic( | 37 this.currentDirContents_ = new DirectoryContentsBasic( |
| 38 this.currentFileListContext_, root); | 38 this.currentFileListContext_, root); |
| 39 | 39 |
| 40 this.rootsList_ = new cr.ui.ArrayDataModel([]); | 40 this.rootsList_ = new cr.ui.ArrayDataModel([]); |
| 41 this.rootsListSelection_ = new cr.ui.ListSingleSelectionModel(); | 41 this.rootsListSelection_ = new cr.ui.ListSingleSelectionModel(); |
| 42 this.rootsListSelection_.addEventListener( | 42 this.rootsListSelection_.addEventListener( |
| 43 'change', this.onRootChange_.bind(this)); | 43 'change', this.onRootChange_.bind(this)); |
| 44 | 44 |
| 45 this.rootsListSelection_.addEventListener( | 45 this.rootsListSelection_.addEventListener( |
| 46 'beforeChange', this.onBeforeRootChange_.bind(this)); | 46 'beforeChange', this.onBeforeRootChange_.bind(this)); |
| 47 | 47 |
| 48 /** | 48 /** |
| 49 * A map root.fullPath -> currentDirectory.fullPath. | 49 * A map root.fullPath -> currentDirectory.fullPath. |
| 50 * @type {Object.<string, string>} |
| 50 * @private | 51 * @private |
| 51 * @type {Object.<string, string>} | |
| 52 */ | 52 */ |
| 53 this.currentDirByRoot_ = {}; | 53 this.currentDirByRoot_ = {}; |
| 54 | 54 |
| 55 this.volumeManager_ = volumeManager; | 55 this.volumeManager_ = volumeManager; |
| 56 } | 56 } |
| 57 | 57 |
| 58 /** | 58 /** |
| 59 * Fake entry to be used in currentDirEntry_ when current directory is | 59 * Fake entry to be used in currentDirEntry_ when current directory is |
| 60 * unmounted DRIVE. | 60 * unmounted DRIVE. |
| 61 * @private | 61 * @private |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 }; | 233 }; |
| 234 | 234 |
| 235 /** | 235 /** |
| 236 * @return {string} Path for the current directory. | 236 * @return {string} Path for the current directory. |
| 237 */ | 237 */ |
| 238 DirectoryModel.prototype.getCurrentDirPath = function() { | 238 DirectoryModel.prototype.getCurrentDirPath = function() { |
| 239 return this.currentDirContents_.getPath(); | 239 return this.currentDirContents_.getPath(); |
| 240 }; | 240 }; |
| 241 | 241 |
| 242 /** | 242 /** |
| 243 * @return {Array.<string>} File paths of selected files. |
| 243 * @private | 244 * @private |
| 244 * @return {Array.<string>} File paths of selected files. | |
| 245 */ | 245 */ |
| 246 DirectoryModel.prototype.getSelectedPaths_ = function() { | 246 DirectoryModel.prototype.getSelectedPaths_ = function() { |
| 247 var indexes = this.fileListSelection_.selectedIndexes; | 247 var indexes = this.fileListSelection_.selectedIndexes; |
| 248 var fileList = this.getFileList(); | 248 var fileList = this.getFileList(); |
| 249 if (fileList) { | 249 if (fileList) { |
| 250 return indexes.map(function(i) { | 250 return indexes.map(function(i) { |
| 251 return fileList.item(i).fullPath; | 251 return fileList.item(i).fullPath; |
| 252 }); | 252 }); |
| 253 } | 253 } |
| 254 return []; | 254 return []; |
| 255 }; | 255 }; |
| 256 | 256 |
| 257 /** | 257 /** |
| 258 * @param {Array.<string>} value List of file paths of selected files. |
| 258 * @private | 259 * @private |
| 259 * @param {Array.<string>} value List of file paths of selected files. | |
| 260 */ | 260 */ |
| 261 DirectoryModel.prototype.setSelectedPaths_ = function(value) { | 261 DirectoryModel.prototype.setSelectedPaths_ = function(value) { |
| 262 var indexes = []; | 262 var indexes = []; |
| 263 var fileList = this.getFileList(); | 263 var fileList = this.getFileList(); |
| 264 | 264 |
| 265 var safeKey = function(key) { | 265 var safeKey = function(key) { |
| 266 // The transformation must: | 266 // The transformation must: |
| 267 // 1. Never generate a reserved name ('__proto__') | 267 // 1. Never generate a reserved name ('__proto__') |
| 268 // 2. Keep different keys different. | 268 // 2. Keep different keys different. |
| 269 return '#' + key; | 269 return '#' + key; |
| 270 }; | 270 }; |
| 271 | 271 |
| 272 var hash = {}; | 272 var hash = {}; |
| 273 | 273 |
| 274 for (var i = 0; i < value.length; i++) | 274 for (var i = 0; i < value.length; i++) |
| 275 hash[safeKey(value[i])] = 1; | 275 hash[safeKey(value[i])] = 1; |
| 276 | 276 |
| 277 for (var i = 0; i < fileList.length; i++) { | 277 for (var i = 0; i < fileList.length; i++) { |
| 278 if (hash.hasOwnProperty(safeKey(fileList.item(i).fullPath))) | 278 if (hash.hasOwnProperty(safeKey(fileList.item(i).fullPath))) |
| 279 indexes.push(i); | 279 indexes.push(i); |
| 280 } | 280 } |
| 281 this.fileListSelection_.selectedIndexes = indexes; | 281 this.fileListSelection_.selectedIndexes = indexes; |
| 282 }; | 282 }; |
| 283 | 283 |
| 284 /** | 284 /** |
| 285 * @return {string} Lead item file path. |
| 285 * @private | 286 * @private |
| 286 * @return {string} Lead item file path. | |
| 287 */ | 287 */ |
| 288 DirectoryModel.prototype.getLeadPath_ = function() { | 288 DirectoryModel.prototype.getLeadPath_ = function() { |
| 289 var index = this.fileListSelection_.leadIndex; | 289 var index = this.fileListSelection_.leadIndex; |
| 290 return index >= 0 && this.getFileList().item(index).fullPath; | 290 return index >= 0 && this.getFileList().item(index).fullPath; |
| 291 }; | 291 }; |
| 292 | 292 |
| 293 /** | 293 /** |
| 294 * @param {string} value The name of new lead index. |
| 294 * @private | 295 * @private |
| 295 * @param {string} value The name of new lead index. | |
| 296 */ | 296 */ |
| 297 DirectoryModel.prototype.setLeadPath_ = function(value) { | 297 DirectoryModel.prototype.setLeadPath_ = function(value) { |
| 298 var fileList = this.getFileList(); | 298 var fileList = this.getFileList(); |
| 299 for (var i = 0; i < fileList.length; i++) { | 299 for (var i = 0; i < fileList.length; i++) { |
| 300 if (fileList.item(i).fullPath === value) { | 300 if (fileList.item(i).fullPath === value) { |
| 301 this.fileListSelection_.leadIndex = i; | 301 this.fileListSelection_.leadIndex = i; |
| 302 return; | 302 return; |
| 303 } | 303 } |
| 304 } | 304 } |
| 305 }; | 305 }; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 | 387 |
| 388 this.scan_(dirContents, successCallback); | 388 this.scan_(dirContents, successCallback); |
| 389 }; | 389 }; |
| 390 | 390 |
| 391 /** | 391 /** |
| 392 * Run scan on the current DirectoryContents. The active fileList is cleared and | 392 * Run scan on the current DirectoryContents. The active fileList is cleared and |
| 393 * the entries are added directly. | 393 * the entries are added directly. |
| 394 * | 394 * |
| 395 * This should be used when changing directory or initiating a new search. | 395 * This should be used when changing directory or initiating a new search. |
| 396 * | 396 * |
| 397 * @private | |
| 398 * @param {DirectoryContentes} newDirContents New DirectoryContents instance to | 397 * @param {DirectoryContentes} newDirContents New DirectoryContents instance to |
| 399 * replace currentDirContents_. | 398 * replace currentDirContents_. |
| 400 * @param {Function} opt_callback Called on success. | 399 * @param {Function} opt_callback Called on success. |
| 400 * @private |
| 401 */ | 401 */ |
| 402 DirectoryModel.prototype.clearAndScan_ = function(newDirContents, | 402 DirectoryModel.prototype.clearAndScan_ = function(newDirContents, |
| 403 opt_callback) { | 403 opt_callback) { |
| 404 if (this.currentDirContents_.isScanning()) | 404 if (this.currentDirContents_.isScanning()) |
| 405 this.currentDirContents_.cancelScan(); | 405 this.currentDirContents_.cancelScan(); |
| 406 this.currentDirContents_ = newDirContents; | 406 this.currentDirContents_ = newDirContents; |
| 407 this.clearRescanTimeout_(); | 407 this.clearRescanTimeout_(); |
| 408 | 408 |
| 409 if (this.pendingScan_) | 409 if (this.pendingScan_) |
| 410 this.pendingScan_ = false; | 410 this.pendingScan_ = false; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 424 var fileList = this.getFileList(); | 424 var fileList = this.getFileList(); |
| 425 fileList.splice(0, fileList.length); | 425 fileList.splice(0, fileList.length); |
| 426 cr.dispatchSimpleEvent(this, 'scan-started'); | 426 cr.dispatchSimpleEvent(this, 'scan-started'); |
| 427 this.scan_(this.currentDirContents_, onDone); | 427 this.scan_(this.currentDirContents_, onDone); |
| 428 }; | 428 }; |
| 429 | 429 |
| 430 /** | 430 /** |
| 431 * Perform a directory contents scan. Should be called only from rescan() and | 431 * Perform a directory contents scan. Should be called only from rescan() and |
| 432 * clearAndScan_(). | 432 * clearAndScan_(). |
| 433 * | 433 * |
| 434 * @private | |
| 435 * @param {DirectoryContents} dirContents DirectoryContents instance on which | 434 * @param {DirectoryContents} dirContents DirectoryContents instance on which |
| 436 * the scan will be run. | 435 * the scan will be run. |
| 437 * @param {function} successCallback Callback on success. | 436 * @param {function} successCallback Callback on success. |
| 437 * @private |
| 438 */ | 438 */ |
| 439 DirectoryModel.prototype.scan_ = function(dirContents, successCallback) { | 439 DirectoryModel.prototype.scan_ = function(dirContents, successCallback) { |
| 440 var self = this; | 440 var self = this; |
| 441 | 441 |
| 442 /** | 442 /** |
| 443 * Runs pending scan if there is one. | 443 * Runs pending scan if there is one. |
| 444 * | 444 * |
| 445 * @return {boolean} Did pending scan exist. | 445 * @return {boolean} Did pending scan exist. |
| 446 */ | 446 */ |
| 447 var maybeRunPendingRescan = function() { | 447 var maybeRunPendingRescan = function() { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 473 | 473 |
| 474 this.runningScan_ = dirContents; | 474 this.runningScan_ = dirContents; |
| 475 | 475 |
| 476 dirContents.addEventListener('scan-completed', onSuccess); | 476 dirContents.addEventListener('scan-completed', onSuccess); |
| 477 dirContents.addEventListener('scan-failed', onFailure); | 477 dirContents.addEventListener('scan-failed', onFailure); |
| 478 dirContents.addEventListener('scan-cancelled', this.dispatchEvent.bind(this)); | 478 dirContents.addEventListener('scan-cancelled', this.dispatchEvent.bind(this)); |
| 479 dirContents.scan(); | 479 dirContents.scan(); |
| 480 }; | 480 }; |
| 481 | 481 |
| 482 /** | 482 /** |
| 483 * @param {DirectoryContents} dirContents DirectoryContents instance. |
| 483 * @private | 484 * @private |
| 484 * @param {DirectoryContents} dirContents DirectoryContents instance. | |
| 485 */ | 485 */ |
| 486 DirectoryModel.prototype.replaceDirectoryContents_ = function(dirContents) { | 486 DirectoryModel.prototype.replaceDirectoryContents_ = function(dirContents) { |
| 487 cr.dispatchSimpleEvent(this, 'begin-update-files'); | 487 cr.dispatchSimpleEvent(this, 'begin-update-files'); |
| 488 this.fileListSelection_.beginChange(); | 488 this.fileListSelection_.beginChange(); |
| 489 | 489 |
| 490 var selectedPaths = this.getSelectedPaths_(); | 490 var selectedPaths = this.getSelectedPaths_(); |
| 491 var selectedIndices = this.fileListSelection_.selectedIndexes; | 491 var selectedIndices = this.fileListSelection_.selectedIndexes; |
| 492 | 492 |
| 493 // Restore leadIndex in case leadName no longer exists. | 493 // Restore leadIndex in case leadName no longer exists. |
| 494 var leadIndex = this.fileListSelection_.leadIndex; | 494 var leadIndex = this.fileListSelection_.leadIndex; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 | 547 |
| 548 var index = self.findIndexByName_(name); | 548 var index = self.findIndexByName_(name); |
| 549 if (index >= 0) | 549 if (index >= 0) |
| 550 fileList.splice(index, 1); | 550 fileList.splice(index, 1); |
| 551 }; | 551 }; |
| 552 | 552 |
| 553 util.resolvePath(currentEntry, name, onEntryFound, onError); | 553 util.resolvePath(currentEntry, name, onEntryFound, onError); |
| 554 }; | 554 }; |
| 555 | 555 |
| 556 /** | 556 /** |
| 557 * @private | |
| 558 * @param {string} name Filename. | 557 * @param {string} name Filename. |
| 559 * @return {number} The index in the fileList. | 558 * @return {number} The index in the fileList. |
| 559 * @private |
| 560 */ | 560 */ |
| 561 DirectoryModel.prototype.findIndexByName_ = function(name) { | 561 DirectoryModel.prototype.findIndexByName_ = function(name) { |
| 562 var fileList = this.getFileList(); | 562 var fileList = this.getFileList(); |
| 563 for (var i = 0; i < fileList.length; i++) | 563 for (var i = 0; i < fileList.length; i++) |
| 564 if (fileList.item(i).name == name) | 564 if (fileList.item(i).name == name) |
| 565 return i; | 565 return i; |
| 566 return -1; | 566 return -1; |
| 567 }; | 567 }; |
| 568 | 568 |
| 569 /** | 569 /** |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 if (path == '/') { | 700 if (path == '/') { |
| 701 successCallback(this.root_); | 701 successCallback(this.root_); |
| 702 return; | 702 return; |
| 703 } | 703 } |
| 704 | 704 |
| 705 this.root_.getDirectory(path, {create: false}, | 705 this.root_.getDirectory(path, {create: false}, |
| 706 successCallback, errorCallback); | 706 successCallback, errorCallback); |
| 707 }; | 707 }; |
| 708 | 708 |
| 709 /** | 709 /** |
| 710 * @return {Entry} Directory entry of the root selected in rootsList. |
| 710 * @private | 711 * @private |
| 711 * @return {Entry} Directory entry of the root selected in rootsList. | |
| 712 */ | 712 */ |
| 713 DirectoryModel.prototype.getSelectedRootDirEntry_ = function() { | 713 DirectoryModel.prototype.getSelectedRootDirEntry_ = function() { |
| 714 return this.rootsList_.item(this.rootsListSelection_.selectedIndex); | 714 return this.rootsList_.item(this.rootsListSelection_.selectedIndex); |
| 715 }; | 715 }; |
| 716 | 716 |
| 717 /** | 717 /** |
| 718 * Handler before root item change. | 718 * Handler before root item change. |
| 719 * @param {Event} event The event. | 719 * @param {Event} event The event. |
| 720 * @private | 720 * @private |
| 721 */ | 721 */ |
| 722 DirectoryModel.prototype.onBeforeRootChange_ = function(event) { | 722 DirectoryModel.prototype.onBeforeRootChange_ = function(event) { |
| 723 if (event.changes.length == 1 && !event.changes[0].selected) | 723 if (event.changes.length == 1 && !event.changes[0].selected) |
| 724 event.preventDefault(); | 724 event.preventDefault(); |
| 725 }; | 725 }; |
| 726 | 726 |
| 727 /** | 727 /** |
| 728 * Handler for root item being clicked. | 728 * Handler for root item being clicked. |
| 729 * @param {Event} event The event. |
| 729 * @private | 730 * @private |
| 730 * @param {Event} event The event. | |
| 731 */ | 731 */ |
| 732 DirectoryModel.prototype.onRootChange_ = function(event) { | 732 DirectoryModel.prototype.onRootChange_ = function(event) { |
| 733 var newRootDir = this.getSelectedRootDirEntry_(); | 733 var newRootDir = this.getSelectedRootDirEntry_(); |
| 734 if (newRootDir) | 734 if (newRootDir) |
| 735 this.changeRoot(newRootDir.fullPath); | 735 this.changeRoot(newRootDir.fullPath); |
| 736 }; | 736 }; |
| 737 | 737 |
| 738 /** | 738 /** |
| 739 * Changes directory. If path points to a root (except current one) | 739 * Changes directory. If path points to a root (except current one) |
| 740 * then directory changed to the last used one for the root. | 740 * then directory changed to the last used one for the root. |
| 741 * | 741 * |
| 742 * @param {string} path New current directory path or new root. | 742 * @param {string} path New current directory path or new root. |
| 743 */ | 743 */ |
| 744 DirectoryModel.prototype.changeRoot = function(path) { | 744 DirectoryModel.prototype.changeRoot = function(path) { |
| 745 var currentDir = this.currentDirByRoot_[path] || path; | 745 var currentDir = this.currentDirByRoot_[path] || path; |
| 746 if (currentDir == this.getCurrentDirPath()) | 746 if (currentDir == this.getCurrentDirPath()) |
| 747 return; | 747 return; |
| 748 var onError = path != currentDir && path != this.getCurrentDirPath() ? | 748 var onError = path != currentDir && path != this.getCurrentDirPath() ? |
| 749 this.changeDirectory.bind(this, path) : null; | 749 this.changeDirectory.bind(this, path) : null; |
| 750 this.resolveDirectory( | 750 this.resolveDirectory( |
| 751 currentDir, | 751 currentDir, |
| 752 this.changeDirectoryEntry_.bind(this, false), | 752 this.changeDirectoryEntry_.bind(this, false), |
| 753 onError); | 753 onError); |
| 754 }; | 754 }; |
| 755 | 755 |
| 756 /** | 756 /** |
| 757 * @private | |
| 758 * @param {DirectoryEntry} dirEntry The absolute path to the new directory. | 757 * @param {DirectoryEntry} dirEntry The absolute path to the new directory. |
| 759 * @param {function} opt_callback Executed if the directory loads successfully. | 758 * @param {function} opt_callback Executed if the directory loads successfully. |
| 759 * @private |
| 760 */ | 760 */ |
| 761 DirectoryModel.prototype.changeDirectoryEntrySilent_ = function(dirEntry, | 761 DirectoryModel.prototype.changeDirectoryEntrySilent_ = function(dirEntry, |
| 762 opt_callback) { | 762 opt_callback) { |
| 763 var onScanComplete = function() { | 763 var onScanComplete = function() { |
| 764 if (opt_callback) | 764 if (opt_callback) |
| 765 opt_callback(); | 765 opt_callback(); |
| 766 // For tests that open the dialog to empty directories, everything | 766 // For tests that open the dialog to empty directories, everything |
| 767 // is loaded at this point. | 767 // is loaded at this point. |
| 768 chrome.test.sendMessage('directory-change-complete'); | 768 chrome.test.sendMessage('directory-change-complete'); |
| 769 }; | 769 }; |
| 770 this.clearAndScan_(new DirectoryContentsBasic(this.currentFileListContext_, | 770 this.clearAndScan_(new DirectoryContentsBasic(this.currentFileListContext_, |
| 771 dirEntry), | 771 dirEntry), |
| 772 onScanComplete.bind(this)); | 772 onScanComplete.bind(this)); |
| 773 this.currentDirByRoot_[this.getCurrentRootPath()] = dirEntry.fullPath; | 773 this.currentDirByRoot_[this.getCurrentRootPath()] = dirEntry.fullPath; |
| 774 this.updateRootsListSelection_(); | 774 this.updateRootsListSelection_(); |
| 775 }; | 775 }; |
| 776 | 776 |
| 777 /** | 777 /** |
| 778 * Change the current directory to the directory represented by a | 778 * Change the current directory to the directory represented by a |
| 779 * DirectoryEntry. | 779 * DirectoryEntry. |
| 780 * | 780 * |
| 781 * Dispatches the 'directory-changed' event when the directory is successfully | 781 * Dispatches the 'directory-changed' event when the directory is successfully |
| 782 * changed. | 782 * changed. |
| 783 * | 783 * |
| 784 * @private | |
| 785 * @param {boolean} initial True if it comes from setupPath and | 784 * @param {boolean} initial True if it comes from setupPath and |
| 786 * false if caused by an user action. | 785 * false if caused by an user action. |
| 787 * @param {DirectoryEntry} dirEntry The absolute path to the new directory. | 786 * @param {DirectoryEntry} dirEntry The absolute path to the new directory. |
| 788 * @param {function} opt_callback Executed if the directory loads successfully. | 787 * @param {function} opt_callback Executed if the directory loads successfully. |
| 788 * @private |
| 789 */ | 789 */ |
| 790 DirectoryModel.prototype.changeDirectoryEntry_ = function(initial, dirEntry, | 790 DirectoryModel.prototype.changeDirectoryEntry_ = function(initial, dirEntry, |
| 791 opt_callback) { | 791 opt_callback) { |
| 792 if (dirEntry == DirectoryModel.fakeDriveEntry_ && | 792 if (dirEntry == DirectoryModel.fakeDriveEntry_ && |
| 793 this.volumeManager_.getDriveStatus() == | 793 this.volumeManager_.getDriveStatus() == |
| 794 VolumeManager.DriveStatus.UNMOUNTED) { | 794 VolumeManager.DriveStatus.UNMOUNTED) { |
| 795 this.volumeManager_.mountDrive(function() {}, function() {}); | 795 this.volumeManager_.mountDrive(function() {}, function() {}); |
| 796 } | 796 } |
| 797 | 797 |
| 798 this.clearSearch_(); | 798 this.clearSearch_(); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 // this.focusCurrentList_(); | 984 // this.focusCurrentList_(); |
| 985 if (index >= this.getFileList().length) | 985 if (index >= this.getFileList().length) |
| 986 return; | 986 return; |
| 987 | 987 |
| 988 // If a list bound with the model it will do scrollIndexIntoView(index). | 988 // If a list bound with the model it will do scrollIndexIntoView(index). |
| 989 this.fileListSelection_.selectedIndex = index; | 989 this.fileListSelection_.selectedIndex = index; |
| 990 }; | 990 }; |
| 991 | 991 |
| 992 /** | 992 /** |
| 993 * Get root entries asynchronously. | 993 * Get root entries asynchronously. |
| 994 * @param {function(Array.<Entry>)} callback Called when roots are resolved. |
| 994 * @private | 995 * @private |
| 995 * @param {function(Array.<Entry>)} callback Called when roots are resolved. | |
| 996 */ | 996 */ |
| 997 DirectoryModel.prototype.resolveRoots_ = function(callback) { | 997 DirectoryModel.prototype.resolveRoots_ = function(callback) { |
| 998 var groups = { | 998 var groups = { |
| 999 downloads: null, | 999 downloads: null, |
| 1000 archives: null, | 1000 archives: null, |
| 1001 removables: null, | 1001 removables: null, |
| 1002 drive: null | 1002 drive: null |
| 1003 }; | 1003 }; |
| 1004 var self = this; | 1004 var self = this; |
| 1005 | 1005 |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1281 | 1281 |
| 1282 /** | 1282 /** |
| 1283 * @param {string} name Filter identifier. | 1283 * @param {string} name Filter identifier. |
| 1284 */ | 1284 */ |
| 1285 DirectoryModel.prototype.removeFilter = function(name) { | 1285 DirectoryModel.prototype.removeFilter = function(name) { |
| 1286 this.currentFileListContext_.removeFilter(name); | 1286 this.currentFileListContext_.removeFilter(name); |
| 1287 }; | 1287 }; |
| 1288 | 1288 |
| 1289 | 1289 |
| 1290 /** | 1290 /** |
| 1291 * @constructor | |
| 1292 * @param {DirectoryEntry} root Root entry. | 1291 * @param {DirectoryEntry} root Root entry. |
| 1293 * @param {DirectoryModel} directoryModel Model to watch. | 1292 * @param {DirectoryModel} directoryModel Model to watch. |
| 1294 * @param {VolumeManager} volumeManager Manager to watch. | 1293 * @param {VolumeManager} volumeManager Manager to watch. |
| 1294 * @constructor |
| 1295 */ | 1295 */ |
| 1296 function FileWatcher(root, directoryModel, volumeManager) { | 1296 function FileWatcher(root, directoryModel, volumeManager) { |
| 1297 this.root_ = root; | 1297 this.root_ = root; |
| 1298 this.dm_ = directoryModel; | 1298 this.dm_ = directoryModel; |
| 1299 this.vm_ = volumeManager; | 1299 this.vm_ = volumeManager; |
| 1300 this.watchedDirectoryEntry_ = null; | 1300 this.watchedDirectoryEntry_ = null; |
| 1301 this.updateWatchedDirectoryBound_ = | 1301 this.updateWatchedDirectoryBound_ = |
| 1302 this.updateWatchedDirectory_.bind(this); | 1302 this.updateWatchedDirectory_.bind(this); |
| 1303 this.onDirectoryChangedBound_ = | 1303 this.onDirectoryChangedBound_ = |
| 1304 this.onDirectoryChanged_.bind(this); | 1304 this.onDirectoryChanged_.bind(this); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1404 }.bind(this)); | 1404 }.bind(this)); |
| 1405 } | 1405 } |
| 1406 }; | 1406 }; |
| 1407 | 1407 |
| 1408 /** | 1408 /** |
| 1409 * @return {DirectoryEntry} Current watched directory entry. | 1409 * @return {DirectoryEntry} Current watched directory entry. |
| 1410 */ | 1410 */ |
| 1411 FileWatcher.prototype.getWatchedDirectoryEntry = function() { | 1411 FileWatcher.prototype.getWatchedDirectoryEntry = function() { |
| 1412 return this.watchedDirectoryEntry_; | 1412 return this.watchedDirectoryEntry_; |
| 1413 }; | 1413 }; |
| OLD | NEW |