Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Side by Side Diff: chrome/browser/resources/file_manager/js/file_manager.js

Issue 7057053: Escaping file names correctly. Also fixed a crush in chromeos debug build while saving a web page. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed opening files with spaces in their names. Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 // WK Bug 55728 is fixed on the chrome 12 branch but not on the trunk. 5 // WK Bug 55728 is fixed on the chrome 12 branch but not on the trunk.
6 // TODO(rginda): Enable this everywhere once we have a trunk-worthy fix. 6 // TODO(rginda): Enable this everywhere once we have a trunk-worthy fix.
7 const ENABLE_EXIF_READER = navigator.userAgent.match(/chrome\/12\.0/i); 7 const ENABLE_EXIF_READER = navigator.userAgent.match(/chrome\/12\.0/i);
8 8
9 // Thumbnail view is painful without the exif reader. 9 // Thumbnail view is painful without the exif reader.
10 const ENABLE_THUMBNAIL_VIEW = ENABLE_EXIF_READER; 10 const ENABLE_THUMBNAIL_VIEW = ENABLE_EXIF_READER;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 this.filterFiles_ = true; 47 this.filterFiles_ = true;
48 48
49 this.commands_ = {}; 49 this.commands_ = {};
50 50
51 this.document_ = dialogDom.ownerDocument; 51 this.document_ = dialogDom.ownerDocument;
52 this.dialogType_ = 52 this.dialogType_ =
53 this.params_.type || FileManager.DialogType.FULL_PAGE; 53 this.params_.type || FileManager.DialogType.FULL_PAGE;
54 54
55 this.defaultPath_ = this.params_.defaultPath || '/'; 55 this.defaultPath_ = this.params_.defaultPath || '/';
56 56
57 // Optional list of file types.
58 this.fileTypes_ = this.params_.typeList;
59
57 this.showCheckboxes_ = 60 this.showCheckboxes_ =
58 (this.dialogType_ == FileManager.DialogType.FULL_PAGE || 61 (this.dialogType_ == FileManager.DialogType.FULL_PAGE ||
59 this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE); 62 this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE);
60 63
61 // DirectoryEntry representing the current directory of the dialog. 64 // DirectoryEntry representing the current directory of the dialog.
62 this.currentDirEntry_ = null; 65 this.currentDirEntry_ = null;
63 66
64 window.addEventListener('popstate', this.onPopState_.bind(this)); 67 window.addEventListener('popstate', this.onPopState_.bind(this));
65 this.addEventListener('directory-changed', 68 this.addEventListener('directory-changed',
66 this.onDirectoryChanged_.bind(this)); 69 this.onDirectoryChanged_.bind(this));
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 this.initTable_(); 542 this.initTable_();
540 this.initGrid_(); 543 this.initGrid_();
541 544
542 this.setListType(FileManager.ListType.DETAIL); 545 this.setListType(FileManager.ListType.DETAIL);
543 546
544 this.onResize_(); 547 this.onResize_();
545 this.dialogDom_.style.opacity = '1'; 548 this.dialogDom_.style.opacity = '1';
546 }; 549 };
547 550
548 /** 551 /**
552 * Encodes filename to compose file URL.
553 */
554 FileManager.prototype.encodeFileName_ = function(fileName) {
555 fileName = encodeURI(fileName);
rginda 2011/06/01 16:53:51 If you switch to encodeURIComponent you won't need
SeRya 2011/06/02 08:42:40 Done.
556
557 // '#' would be treated as ananchor mark of the url. Escape it.
558 fileName = fileName.replace(/#/g, '%23');
559 return fileName;
560 };
561
562 /**
563 * "Save a file" dislog is suttposed to have a combo box with available
rginda 2011/06/01 16:53:51 dislog is suttposed => dialog is supposed
SeRya 2011/06/02 08:42:40 Done.
564 * file types. Selecting an item filter files by extension and specifies how
rginda 2011/06/01 16:53:51 filters files
SeRya 2011/06/02 08:42:40 Done.
565 * file should be saved.
566 * @return {intener} Index of selected type from this.fileTypes_ + 1. 0
567 * means value is not specified.
568 */
569 FileManager.prototype.getSelectedFilterIndex_= function(fileName) {
570 // TODO(serya): Implement the combo box
571 // For now try to guess choice by file extension.
572 if (!this.fileTypes_ || this.fileTypes_.length == 0) return 0;
573
574 var extension = /\.[^\.]+$/.exec(fileName);
575 extension = extension ? extension[0].substring(1).toLowerCase() : "";
576 var result = 0; // Use first type by default.
577 for (var i = 0; i < this.fileTypes_.length; i++) {
578 if (this.fileTypes_[i].extensions.indexOf(extension)) {
579 result = i;
580 }
581 }
582 return result + 1; // 1-based index.
583 };
584
585 /**
549 * Force the canExecute events to be dispatched. 586 * Force the canExecute events to be dispatched.
550 */ 587 */
551 FileManager.prototype.updateCommands_ = function() { 588 FileManager.prototype.updateCommands_ = function() {
552 this.commands_['rename'].canExecuteChange(); 589 this.commands_['rename'].canExecuteChange();
553 this.commands_['delete'].canExecuteChange(); 590 this.commands_['delete'].canExecuteChange();
554 }; 591 };
555 592
556 /** 593 /**
557 * Invoked to decide whether the "rename" command can be executed. 594 * Invoked to decide whether the "rename" command can be executed.
558 */ 595 */
(...skipping 1495 matching lines...) Expand 10 before | Expand all | Expand 10 after
2054 if (currentDirUrl.charAt(currentDirUrl.length - 1) != '/') 2091 if (currentDirUrl.charAt(currentDirUrl.length - 1) != '/')
2055 currentDirUrl += '/'; 2092 currentDirUrl += '/';
2056 2093
2057 if (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE) { 2094 if (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE) {
2058 // Save-as doesn't require a valid selection from the list, since 2095 // Save-as doesn't require a valid selection from the list, since
2059 // we're going to take the filename from the text input. 2096 // we're going to take the filename from the text input.
2060 var filename = this.filenameInput_.value; 2097 var filename = this.filenameInput_.value;
2061 if (!filename) 2098 if (!filename)
2062 throw new Error('Missing filename!'); 2099 throw new Error('Missing filename!');
2063 2100
2064 chrome.fileBrowserPrivate.selectFile(currentDirUrl + encodeURI(filename), 2101 chrome.fileBrowserPrivate.selectFile(
2065 0); 2102 currentDirUrl + this.encodeFileName_(filename),
2103 this.getSelectedFilterIndex_(filename));
2066 window.close(); 2104 window.close();
2067 return; 2105 return;
2068 } 2106 }
2069 2107
2070 var ary = []; 2108 var ary = [];
2071 var selectedIndexes = this.currentList_.selectionModel.selectedIndexes; 2109 var selectedIndexes = this.currentList_.selectionModel.selectedIndexes;
2072 2110
2073 // All other dialog types require at least one selected list item. 2111 // All other dialog types require at least one selected list item.
2074 // The logic to control whether or not the ok button is enabled should 2112 // The logic to control whether or not the ok button is enabled should
2075 // prevent us from ever getting here, but we sanity check to be sure. 2113 // prevent us from ever getting here, but we sanity check to be sure.
2076 if (!selectedIndexes.length) 2114 if (!selectedIndexes.length)
2077 throw new Error('Nothing selected!'); 2115 throw new Error('Nothing selected!');
2078 2116
2079 for (var i = 0; i < selectedIndexes.length; i++) { 2117 for (var i = 0; i < selectedIndexes.length; i++) {
2080 var entry = this.dataModel_.item(selectedIndexes[i]); 2118 var entry = this.dataModel_.item(selectedIndexes[i]);
2081 if (!entry) { 2119 if (!entry) {
2082 console.log('Error locating selected file at index: ' + i); 2120 console.log('Error locating selected file at index: ' + i);
2083 continue; 2121 continue;
2084 } 2122 }
2085 2123
2086 ary.push(currentDirUrl + encodeURI(entry.name)); 2124 ary.push(currentDirUrl + this.encodeFileName_(entry.name));
2087 } 2125 }
2088 2126
2089 // Multi-file selection has no other restrictions. 2127 // Multi-file selection has no other restrictions.
2090 if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE) { 2128 if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE) {
2091 chrome.fileBrowserPrivate.selectFiles(ary); 2129 chrome.fileBrowserPrivate.selectFiles(ary);
2092 window.close(); 2130 window.close();
2093 return; 2131 return;
2094 } 2132 }
2095 2133
2096 // In full screen mode, open all files for vieweing. 2134 // In full screen mode, open all files for vieweing.
2097 if (this.dialogType_ == FileManager.DialogType.FULL_PAGE) { 2135 if (this.dialogType_ == FileManager.DialogType.FULL_PAGE) {
2098 chrome.fileBrowserPrivate.viewFiles(ary, "default"); 2136 chrome.fileBrowserPrivate.viewFiles(ary, "default");
2099 // Window stays open. 2137 // Window stays open.
2100 return; 2138 return;
2101 } 2139 }
2102 2140
2103 // Everything else must have exactly one. 2141 // Everything else must have exactly one.
2104 if (ary.length > 1) 2142 if (ary.length > 1)
2105 throw new Error('Too many files selected!'); 2143 throw new Error('Too many files selected!');
2106 2144
2107 if (this.dialogType_ == FileManager.DialogType.SELECT_FOLDER) { 2145 if (this.dialogType_ == FileManager.DialogType.SELECT_FOLDER) {
2108 if (!this.selection.leadEntry.isDirectory) 2146 if (!this.selection.leadEntry.isDirectory)
2109 throw new Error('Selected entry is not a folder!'); 2147 throw new Error('Selected entry is not a folder!');
2110 } else if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_FILE) { 2148 } else if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_FILE) {
2111 if (!this.selection.leadEntry.isFile) 2149 if (!this.selection.leadEntry.isFile)
2112 throw new Error('Selected entry is not a file!'); 2150 throw new Error('Selected entry is not a file!');
2113 } 2151 }
2114 2152
2115 chrome.fileBrowserPrivate.selectFile(ary[0], 0); 2153 chrome.fileBrowserPrivate.selectFile(
2154 ary[0], this.getSelectedFilterIndex_(ary[0]));
2116 window.close(); 2155 window.close();
2117 }; 2156 };
2118 2157
2119 })(); 2158 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698