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#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_FILE_HELPER_H_
6#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_FILE_HELPER_H_
7
8#include <map>
9#include <string>
10#include <vector>
11
12#include "base/basictypes.h"
13#include "base/callback.h"
14#include "base/memory/ref_counted.h"
15#include "base/memory/weak_ptr.h"
16#include "base/strings/string16.h"
17
18class Profile;
19
20namespace base {
21class FilePath;
22}
23
24namespace content {
25class WebContents;
26}
27
28class DevToolsFileHelper {
29 public:
30  struct FileSystem {
31    FileSystem();
32    FileSystem(const std::string& file_system_name,
33               const std::string& root_url,
34               const std::string& file_system_path);
35
36    std::string file_system_name;
37    std::string root_url;
38    std::string file_system_path;
39  };
40
41  DevToolsFileHelper(content::WebContents* web_contents, Profile* profile);
42  ~DevToolsFileHelper();
43
44  typedef base::Callback<void(void)> SaveCallback;
45  typedef base::Callback<void(void)> AppendCallback;
46  typedef base::Callback<
47      void(const std::vector<DevToolsFileHelper::FileSystem>&)>
48      RequestFileSystemsCallback;
49  typedef base::Callback<void(const DevToolsFileHelper::FileSystem&)>
50      AddFileSystemCallback;
51  typedef base::Callback<void(const base::string16&,
52                              const base::Callback<void(bool)>&)>
53      ShowInfoBarCallback;
54
55  // Saves |content| to the file and associates its path with given |url|.
56  // If client is calling this method with given |url| for the first time
57  // or |save_as| is true, confirmation dialog is shown to the user.
58  void Save(const std::string& url,
59            const std::string& content,
60            bool save_as,
61            const SaveCallback& saveCallback,
62            const SaveCallback& cancelCallback);
63
64  // Append |content| to the file that has been associated with given |url|.
65  // The |url| can be associated with a file via calling Save method.
66  // If the Save method has not been called for this |url|, then
67  // Append method does nothing.
68  void Append(const std::string& url,
69              const std::string& content,
70              const AppendCallback& callback);
71
72  // Shows select folder dialog.
73  // If user cancels folder selection, passes empty FileSystem struct to
74  // |callback|.
75  // Shows infobar by means of |show_info_bar_callback| to let the user decide
76  // whether to grant security permissions or not.
77  // If user allows adding file system in infobar, grants renderer read/write
78  // permissions, registers isolated file system for it and passes FileSystem
79  // struct to |callback|. Saves file system path to prefs.
80  // If user denies adding file system in infobar, passes error string to
81  // |callback|.
82  void AddFileSystem(const AddFileSystemCallback& callback,
83                     const ShowInfoBarCallback& show_info_bar_callback);
84
85  // Upgrades dragged file system permissions to a read-write access.
86  // Shows infobar by means of |show_info_bar_callback| to let the user decide
87  // whether to grant security permissions or not.
88  // If user allows adding file system in infobar, grants renderer read/write
89  // permissions, registers isolated file system for it and passes FileSystem
90  // struct to |callback|. Saves file system path to prefs.
91  // If user denies adding file system in infobar, passes error string to
92  // |callback|.
93  void UpgradeDraggedFileSystemPermissions(
94      const std::string& file_system_url,
95      const AddFileSystemCallback& callback,
96      const ShowInfoBarCallback& show_info_bar_callback);
97
98  // Loads file system paths from prefs, grants permissions and registers
99  // isolated file system for those of them that contain magic file and passes
100  // FileSystem structs for registered file systems to |callback|.
101  void RequestFileSystems(const RequestFileSystemsCallback& callback);
102
103  // Removes isolated file system for given |file_system_path|.
104  void RemoveFileSystem(const std::string& file_system_path);
105
106  // Returns whether access to the folder on given |file_system_path| was
107  // granted.
108  bool IsFileSystemAdded(const std::string& file_system_path);
109
110 private:
111  void SaveAsFileSelected(const std::string& url,
112                          const std::string& content,
113                          const SaveCallback& callback,
114                          const base::FilePath& path);
115  void SaveAsFileSelectionCanceled(const SaveCallback& callback);
116  void InnerAddFileSystem(
117      const AddFileSystemCallback& callback,
118      const ShowInfoBarCallback& show_info_bar_callback,
119      const base::FilePath& path);
120  void AddUserConfirmedFileSystem(
121      const AddFileSystemCallback& callback,
122      const base::FilePath& path,
123      bool allowed);
124  void RestoreValidatedFileSystems(
125      const RequestFileSystemsCallback& callback,
126      const std::vector<base::FilePath>& file_paths);
127
128  content::WebContents* web_contents_;
129  Profile* profile_;
130  typedef std::map<std::string, base::FilePath> PathsMap;
131  PathsMap saved_files_;
132  base::WeakPtrFactory<DevToolsFileHelper> weak_factory_;
133  DISALLOW_COPY_AND_ASSIGN(DevToolsFileHelper);
134};
135
136#endif  // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_FILE_HELPER_H_
137