Home | History | Annotate | Download | only in file_manager
      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