OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // Setting the src of an img to an empty string can crash the browser, so we | 5 // Setting the src of an img to an empty string can crash the browser, so we |
6 // use an empty 1x1 gif instead. | 6 // use an empty 1x1 gif instead. |
7 const EMPTY_IMAGE_URI = 'data:image/gif;base64,' | 7 const EMPTY_IMAGE_URI = 'data:image/gif;base64,' |
8 + 'R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw%3D%3D'; | 8 + 'R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw%3D%3D'; |
9 | 9 |
10 var g_slideshow_data = null; | 10 var g_slideshow_data = null; |
(...skipping 3148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3159 if (event.button != 1) | 3159 if (event.button != 1) |
3160 return; | 3160 return; |
3161 | 3161 |
3162 var li = this.findListItem_(event); | 3162 var li = this.findListItem_(event); |
3163 if (!li) { | 3163 if (!li) { |
3164 console.log('li not found', event); | 3164 console.log('li not found', event); |
3165 return; | 3165 return; |
3166 } | 3166 } |
3167 }; | 3167 }; |
3168 | 3168 |
3169 FileManager.prototype.onUnload_ = function(event) { | 3169 /** |
| 3170 * Unload handler for the page. May be called manually for the file picker |
| 3171 * dialog, because it closes by calling extension API functions that do not |
| 3172 * return. |
| 3173 */ |
| 3174 FileManager.prototype.onUnload_ = function() { |
3170 if (this.subscribedOnDirectoryChanges_) { | 3175 if (this.subscribedOnDirectoryChanges_) { |
3171 chrome.fileBrowserPrivate.removeFileWatch(event.previousDirEntry.toURL(), | 3176 this.subscribedOnDirectoryChanges_ = false; |
| 3177 chrome.fileBrowserPrivate.removeFileWatch(this.currentDirEntry_.toURL(), |
3172 function(result) { | 3178 function(result) { |
3173 if (!result) { | 3179 if (!result) { |
3174 console.log('Failed to remove file watch'); | 3180 console.log('Failed to remove file watch'); |
3175 } | 3181 } |
3176 }); | 3182 }); |
3177 } | 3183 } |
3178 }; | 3184 }; |
3179 | 3185 |
3180 FileManager.prototype.onFileChanged_ = function(event) { | 3186 FileManager.prototype.onFileChanged_ = function(event) { |
3181 // We receive a lot of events even in folders we are not interested in. | 3187 // We receive a lot of events even in folders we are not interested in. |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3568 if (name.substring(0, text.length).toLowerCase() == text) { | 3574 if (name.substring(0, text.length).toLowerCase() == text) { |
3569 this.currentList_.selectionModel.selectedIndexes = [index]; | 3575 this.currentList_.selectionModel.selectedIndexes = [index]; |
3570 return; | 3576 return; |
3571 } | 3577 } |
3572 } | 3578 } |
3573 | 3579 |
3574 this.textSearchState_.text = ''; | 3580 this.textSearchState_.text = ''; |
3575 }; | 3581 }; |
3576 | 3582 |
3577 /** | 3583 /** |
3578 * Handle a click of the cancel button. Closes the window. | 3584 * Handle a click of the cancel button. Closes the window. Does not return. |
| 3585 * TODO(jamescook): Make unload handler work automatically, crbug.com/104811 |
3579 * | 3586 * |
3580 * @param {Event} event The click event. | 3587 * @param {Event} event The click event. |
3581 */ | 3588 */ |
3582 FileManager.prototype.onCancel_ = function(event) { | 3589 FileManager.prototype.onCancel_ = function(event) { |
| 3590 this.onUnload_(); |
3583 // Closes the window and does not return. | 3591 // Closes the window and does not return. |
3584 chrome.fileBrowserPrivate.cancelDialog(); | 3592 chrome.fileBrowserPrivate.cancelDialog(); |
3585 }; | 3593 }; |
3586 | 3594 |
3587 /** | 3595 /** |
| 3596 * Selects a file. Closes the window. Does not return. |
| 3597 * TODO(jamescook): Make unload handler work automatically, crbug.com/104811 |
| 3598 * |
| 3599 * @param {string} fileUrl The filename as a URL. |
| 3600 * @param {number} filterIndex The integer file filter index. |
| 3601 */ |
| 3602 FileManager.prototype.selectFile_ = function(fileUrl, filterIndex) { |
| 3603 this.onUnload_(); |
| 3604 // Closes the window and does not return. |
| 3605 chrome.fileBrowserPrivate.selectFile(fileUrl, filterIndex); |
| 3606 }; |
| 3607 |
| 3608 /** |
| 3609 * Selects multiple files. Closes the window. Does not return. |
| 3610 * TODO(jamescook): Make unload handler work automatically, crbug.com/104811 |
| 3611 * |
| 3612 * @param {Array.<string>} fileUrls Array of filename URLs. |
| 3613 */ |
| 3614 FileManager.prototype.selectFiles_ = function(fileUrls) { |
| 3615 this.onUnload_(); |
| 3616 // Closes the window and does not return. |
| 3617 chrome.fileBrowserPrivate.selectFiles(fileUrls); |
| 3618 }; |
| 3619 |
| 3620 /** |
3588 * Handle a click of the ok button. | 3621 * Handle a click of the ok button. |
3589 * | 3622 * |
3590 * The ok button has different UI labels depending on the type of dialog, but | 3623 * The ok button has different UI labels depending on the type of dialog, but |
3591 * in code it's always referred to as 'ok'. | 3624 * in code it's always referred to as 'ok'. |
3592 * | 3625 * |
3593 * @param {Event} event The click event. | 3626 * @param {Event} event The click event. |
3594 */ | 3627 */ |
3595 FileManager.prototype.onOk_ = function(event) { | 3628 FileManager.prototype.onOk_ = function(event) { |
3596 var currentDirUrl = this.currentDirEntry_.toURL(); | 3629 var currentDirUrl = this.currentDirEntry_.toURL(); |
3597 | 3630 |
3598 if (currentDirUrl.charAt(currentDirUrl.length - 1) != '/') | 3631 if (currentDirUrl.charAt(currentDirUrl.length - 1) != '/') |
3599 currentDirUrl += '/'; | 3632 currentDirUrl += '/'; |
3600 | 3633 |
3601 if (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE) { | 3634 if (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE) { |
3602 // Save-as doesn't require a valid selection from the list, since | 3635 // Save-as doesn't require a valid selection from the list, since |
3603 // we're going to take the filename from the text input. | 3636 // we're going to take the filename from the text input. |
3604 var filename = this.filenameInput_.value; | 3637 var filename = this.filenameInput_.value; |
3605 if (!filename) | 3638 if (!filename) |
3606 throw new Error('Missing filename!'); | 3639 throw new Error('Missing filename!'); |
3607 if (!this.validateFileName_(filename)) | 3640 if (!this.validateFileName_(filename)) |
3608 return; | 3641 return; |
3609 | 3642 |
3610 var self = this; | 3643 var self = this; |
3611 function resolveCallback(victim) { | 3644 function resolveCallback(victim) { |
3612 if (victim instanceof FileError) { | 3645 if (victim instanceof FileError) { |
3613 // File does not exist. (NB: selectFile Closes the window and does | 3646 // File does not exist. Closes the window and does not return. |
3614 // not return.) | 3647 self.selectFile_( |
3615 chrome.fileBrowserPrivate.selectFile( | |
3616 currentDirUrl + encodeURIComponent(filename), | 3648 currentDirUrl + encodeURIComponent(filename), |
3617 self.getSelectedFilterIndex_(filename)); | 3649 self.getSelectedFilterIndex_(filename)); |
3618 } | 3650 } |
3619 | 3651 |
3620 if (victim.isDirectory) { | 3652 if (victim.isDirectory) { |
3621 // Do not allow to overwrite directory. | 3653 // Do not allow to overwrite directory. |
3622 self.alert.show(strf('DIRECTORY_ALREADY_EXISTS', filename)); | 3654 self.alert.show(strf('DIRECTORY_ALREADY_EXISTS', filename)); |
3623 } else { | 3655 } else { |
3624 self.confirm.show(strf('CONFIRM_OVERWRITE_FILE', filename), | 3656 self.confirm.show(strf('CONFIRM_OVERWRITE_FILE', filename), |
3625 function() { | 3657 function() { |
3626 // User selected Ok from the confirm dialog. | 3658 // User selected Ok from the confirm dialog. |
3627 chrome.fileBrowserPrivate.selectFile( | 3659 self.selectFile_( |
3628 currentDirUrl + encodeURIComponent(filename), | 3660 currentDirUrl + encodeURIComponent(filename), |
3629 self.getSelectedFilterIndex_(filename)); | 3661 self.getSelectedFilterIndex_(filename)); |
3630 }); | 3662 }); |
3631 } | 3663 } |
3632 return; | 3664 return; |
3633 } | 3665 } |
3634 | 3666 |
3635 this.resolvePath(this.currentDirEntry_.fullPath + '/' + filename, | 3667 this.resolvePath(this.currentDirEntry_.fullPath + '/' + filename, |
3636 resolveCallback, resolveCallback); | 3668 resolveCallback, resolveCallback); |
3637 return; | 3669 return; |
(...skipping 14 matching lines...) Expand all Loading... |
3652 console.log('Error locating selected file at index: ' + i); | 3684 console.log('Error locating selected file at index: ' + i); |
3653 continue; | 3685 continue; |
3654 } | 3686 } |
3655 | 3687 |
3656 ary.push(currentDirUrl + encodeURIComponent(entry.name)); | 3688 ary.push(currentDirUrl + encodeURIComponent(entry.name)); |
3657 } | 3689 } |
3658 | 3690 |
3659 // Multi-file selection has no other restrictions. | 3691 // Multi-file selection has no other restrictions. |
3660 if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE) { | 3692 if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE) { |
3661 // Closes the window and does not return. | 3693 // Closes the window and does not return. |
3662 chrome.fileBrowserPrivate.selectFiles(ary); | 3694 this.selectFiles_(ary); |
3663 return; | 3695 return; |
3664 } | 3696 } |
3665 | 3697 |
3666 // In full screen mode, open all files for vieweing. | 3698 // In full screen mode, open all files for vieweing. |
3667 if (this.dialogType_ == FileManager.DialogType.FULL_PAGE) { | 3699 if (this.dialogType_ == FileManager.DialogType.FULL_PAGE) { |
3668 if (this.galleryTask_) { | 3700 if (this.galleryTask_) { |
3669 var urls = []; | 3701 var urls = []; |
3670 for (i = 0; i < selectedIndexes.length; i++) { | 3702 for (i = 0; i < selectedIndexes.length; i++) { |
3671 var entry = this.dataModel_.item(selectedIndexes[i]); | 3703 var entry = this.dataModel_.item(selectedIndexes[i]); |
3672 if (this.getFileType(entry).type != 'image') | 3704 if (this.getFileType(entry).type != 'image') |
(...skipping 18 matching lines...) Expand all Loading... |
3691 | 3723 |
3692 if (this.dialogType_ == FileManager.DialogType.SELECT_FOLDER) { | 3724 if (this.dialogType_ == FileManager.DialogType.SELECT_FOLDER) { |
3693 if (!selectedEntry.isDirectory) | 3725 if (!selectedEntry.isDirectory) |
3694 throw new Error('Selected entry is not a folder!'); | 3726 throw new Error('Selected entry is not a folder!'); |
3695 } else if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_FILE) { | 3727 } else if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_FILE) { |
3696 if (!selectedEntry.isFile) | 3728 if (!selectedEntry.isFile) |
3697 throw new Error('Selected entry is not a file!'); | 3729 throw new Error('Selected entry is not a file!'); |
3698 } | 3730 } |
3699 | 3731 |
3700 // Closes the window and does not return. | 3732 // Closes the window and does not return. |
3701 chrome.fileBrowserPrivate.selectFile( | 3733 this.selectFile_(ary[0], this.getSelectedFilterIndex_(ary[0])); |
3702 ary[0], this.getSelectedFilterIndex_(ary[0])); | |
3703 }; | 3734 }; |
3704 | 3735 |
3705 /** | 3736 /** |
3706 * Verifies the user entered name for file or folder to be created or | 3737 * Verifies the user entered name for file or folder to be created or |
3707 * renamed to. Name restrictions must correspond to File API restrictions | 3738 * renamed to. Name restrictions must correspond to File API restrictions |
3708 * (see DOMFilePath::isValidPath). Curernt WebKit implementation is | 3739 * (see DOMFilePath::isValidPath). Curernt WebKit implementation is |
3709 * out of date (spec is | 3740 * out of date (spec is |
3710 * http://dev.w3.org/2009/dap/file-system/file-dir-sys.html, 8.3) and going to | 3741 * http://dev.w3.org/2009/dap/file-system/file-dir-sys.html, 8.3) and going to |
3711 * be fixed. Shows message box if the name is invalid. | 3742 * be fixed. Shows message box if the name is invalid. |
3712 * | 3743 * |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3783 }); | 3814 }); |
3784 }, onError); | 3815 }, onError); |
3785 | 3816 |
3786 function onError(err) { | 3817 function onError(err) { |
3787 console.log('Error while checking free space: ' + err); | 3818 console.log('Error while checking free space: ' + err); |
3788 setTimeout(doCheck, 1000 * 60); | 3819 setTimeout(doCheck, 1000 * 60); |
3789 } | 3820 } |
3790 } | 3821 } |
3791 } | 3822 } |
3792 })(); | 3823 })(); |
OLD | NEW |