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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/chromeos/file_manager/url_util.h" 6 7 #include "base/json/json_writer.h" 8 #include "base/values.h" 9 #include "chrome/browser/chromeos/file_manager/app_id.h" 10 #include "net/base/escape.h" 11 12 namespace file_manager { 13 namespace util { 14 namespace { 15 16 // Returns a file manager URL for the given |path|. 17 GURL GetFileManagerUrl(const char* path) { 18 return GURL(std::string("chrome-extension://") + kFileManagerAppId + path); 19 } 20 21 // Converts a numeric dialog type to a string. 22 std::string GetDialogTypeAsString( 23 ui::SelectFileDialog::Type dialog_type) { 24 std::string type_str; 25 switch (dialog_type) { 26 case ui::SelectFileDialog::SELECT_NONE: 27 type_str = "full-page"; 28 break; 29 30 case ui::SelectFileDialog::SELECT_FOLDER: 31 type_str = "folder"; 32 break; 33 34 case ui::SelectFileDialog::SELECT_UPLOAD_FOLDER: 35 type_str = "upload-folder"; 36 break; 37 38 case ui::SelectFileDialog::SELECT_SAVEAS_FILE: 39 type_str = "saveas-file"; 40 break; 41 42 case ui::SelectFileDialog::SELECT_OPEN_FILE: 43 type_str = "open-file"; 44 break; 45 46 case ui::SelectFileDialog::SELECT_OPEN_MULTI_FILE: 47 type_str = "open-multi-file"; 48 break; 49 50 default: 51 NOTREACHED(); 52 } 53 54 return type_str; 55 } 56 57 } // namespace 58 59 GURL GetFileManagerBaseUrl() { 60 return GetFileManagerUrl("/"); 61 } 62 63 GURL GetFileManagerMainPageUrl() { 64 return GetFileManagerUrl("/main.html"); 65 } 66 67 GURL GetFileManagerMainPageUrlWithParams( 68 ui::SelectFileDialog::Type type, 69 const base::string16& title, 70 const GURL& current_directory_url, 71 const GURL& selection_url, 72 const std::string& target_name, 73 const ui::SelectFileDialog::FileTypeInfo* file_types, 74 int file_type_index, 75 const base::FilePath::StringType& default_extension) { 76 base::DictionaryValue arg_value; 77 arg_value.SetString("type", GetDialogTypeAsString(type)); 78 arg_value.SetString("title", title); 79 arg_value.SetString("currentDirectoryURL", current_directory_url.spec()); 80 arg_value.SetString("selectionURL", selection_url.spec()); 81 arg_value.SetString("targetName", target_name); 82 arg_value.SetString("defaultExtension", default_extension); 83 84 if (file_types) { 85 base::ListValue* types_list = new base::ListValue(); 86 for (size_t i = 0; i < file_types->extensions.size(); ++i) { 87 base::ListValue* extensions_list = new base::ListValue(); 88 for (size_t j = 0; j < file_types->extensions[i].size(); ++j) { 89 extensions_list->Append( 90 new base::StringValue(file_types->extensions[i][j])); 91 } 92 93 base::DictionaryValue* dict = new base::DictionaryValue(); 94 dict->Set("extensions", extensions_list); 95 96 if (i < file_types->extension_description_overrides.size()) { 97 base::string16 desc = file_types->extension_description_overrides[i]; 98 dict->SetString("description", desc); 99 } 100 101 // file_type_index is 1-based. 0 means no selection at all. 102 dict->SetBoolean("selected", 103 (static_cast<size_t>(file_type_index) == (i + 1))); 104 105 types_list->Set(i, dict); 106 } 107 arg_value.Set("typeList", types_list); 108 109 arg_value.SetBoolean("includeAllFiles", file_types->include_all_files); 110 } 111 112 // If the caller cannot handle Drive path, the file chooser dialog need to 113 // return resolved local native paths to the selected files. 114 arg_value.SetBoolean("shouldReturnLocalPath", 115 !file_types || !file_types->support_drive); 116 117 std::string json_args; 118 base::JSONWriter::Write(&arg_value, &json_args); 119 120 std::string url = GetFileManagerMainPageUrl().spec() + '?' + 121 net::EscapeUrlEncodedData(json_args, 122 false); // Space to %20 instead of +. 123 return GURL(url); 124 } 125 126 } // namespace util 127 } // namespace file_manager 128