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

Side by Side Diff: extensions/browser/api/file_handlers/app_file_handler_util.cc

Issue 2685453002: Move file_handlers API from //chrome to //extensions (Closed)
Patch Set: Created 3 years, 10 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" 5 #include "extensions/browser/api/file_handlers/app_file_handler_util.h"
6 6
7 #include "base/files/file.h" 7 #include "base/files/file.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
11 #include "chrome/browser/profiles/profile.h" 11 #include "content/public/browser/browser_context.h"
12 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/browser_thread.h"
13 #include "content/public/browser/child_process_security_policy.h" 13 #include "content/public/browser/child_process_security_policy.h"
14 #include "extensions/browser/api/extensions_api_client.h" 14 #include "extensions/browser/api/extensions_api_client.h"
15 #include "extensions/browser/entry_info.h" 15 #include "extensions/browser/entry_info.h"
16 #include "extensions/browser/extension_prefs.h" 16 #include "extensions/browser/extension_prefs.h"
17 #include "extensions/browser/granted_file_entry.h" 17 #include "extensions/browser/granted_file_entry.h"
18 #include "extensions/common/permissions/permissions_data.h" 18 #include "extensions/common/permissions/permissions_data.h"
19 #include "net/base/mime_util.h" 19 #include "net/base/mime_util.h"
20 #include "storage/browser/fileapi/isolated_context.h" 20 #include "storage/browser/fileapi/isolated_context.h"
21 #include "storage/common/fileapi/file_system_mount_option.h" 21 #include "storage/common/fileapi/file_system_mount_option.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 // Checks whether a list of paths are all OK for writing and calls a provided 95 // Checks whether a list of paths are all OK for writing and calls a provided
96 // on_success or on_failure callback when done. A path is OK for writing if it 96 // on_success or on_failure callback when done. A path is OK for writing if it
97 // is not a symlink, is not in a blacklisted path and can be opened for writing. 97 // is not a symlink, is not in a blacklisted path and can be opened for writing.
98 // Creates files if they do not exist, but fails for non-existent directory 98 // Creates files if they do not exist, but fails for non-existent directory
99 // paths. On Chrome OS, also fails for non-local files that don't already exist. 99 // paths. On Chrome OS, also fails for non-local files that don't already exist.
100 class WritableFileChecker 100 class WritableFileChecker
101 : public base::RefCountedThreadSafe<WritableFileChecker> { 101 : public base::RefCountedThreadSafe<WritableFileChecker> {
102 public: 102 public:
103 WritableFileChecker( 103 WritableFileChecker(
104 const std::vector<base::FilePath>& paths, 104 const std::vector<base::FilePath>& paths,
105 Profile* profile, 105 content::BrowserContext* context,
106 const std::set<base::FilePath>& directory_paths, 106 const std::set<base::FilePath>& directory_paths,
107 const base::Closure& on_success, 107 const base::Closure& on_success,
108 const base::Callback<void(const base::FilePath&)>& on_failure); 108 const base::Callback<void(const base::FilePath&)>& on_failure);
109 109
110 void Check(); 110 void Check();
111 111
112 private: 112 private:
113 friend class base::RefCountedThreadSafe<WritableFileChecker>; 113 friend class base::RefCountedThreadSafe<WritableFileChecker>;
114 virtual ~WritableFileChecker(); 114 virtual ~WritableFileChecker();
115 115
116 // Called when a work item is completed. If all work items are done, this 116 // Called when a work item is completed. If all work items are done, this
117 // calls the success or failure callback. 117 // calls the success or failure callback.
118 void TaskDone(); 118 void TaskDone();
119 119
120 // Reports an error in completing a work item. This may be called more than 120 // Reports an error in completing a work item. This may be called more than
121 // once, but only the last message will be retained. 121 // once, but only the last message will be retained.
122 void Error(const base::FilePath& error_path); 122 void Error(const base::FilePath& error_path);
123 123
124 void CheckLocalWritableFiles(); 124 void CheckLocalWritableFiles();
125 125
126 // Called when processing a file is completed with either a success or an 126 // Called when processing a file is completed with either a success or an
127 // error. 127 // error.
128 void OnPrepareFileDone(const base::FilePath& path, bool success); 128 void OnPrepareFileDone(const base::FilePath& path, bool success);
129 129
130 const std::vector<base::FilePath> paths_; 130 const std::vector<base::FilePath> paths_;
131 Profile* profile_; 131 content::BrowserContext* context_;
132 const std::set<base::FilePath> directory_paths_; 132 const std::set<base::FilePath> directory_paths_;
133 int outstanding_tasks_; 133 int outstanding_tasks_;
134 base::FilePath error_path_; 134 base::FilePath error_path_;
135 base::Closure on_success_; 135 base::Closure on_success_;
136 base::Callback<void(const base::FilePath&)> on_failure_; 136 base::Callback<void(const base::FilePath&)> on_failure_;
137 }; 137 };
138 138
139 WritableFileChecker::WritableFileChecker( 139 WritableFileChecker::WritableFileChecker(
140 const std::vector<base::FilePath>& paths, 140 const std::vector<base::FilePath>& paths,
141 Profile* profile, 141 content::BrowserContext* context,
142 const std::set<base::FilePath>& directory_paths, 142 const std::set<base::FilePath>& directory_paths,
143 const base::Closure& on_success, 143 const base::Closure& on_success,
144 const base::Callback<void(const base::FilePath&)>& on_failure) 144 const base::Callback<void(const base::FilePath&)>& on_failure)
145 : paths_(paths), 145 : paths_(paths),
146 profile_(profile), 146 context_(context),
147 directory_paths_(directory_paths), 147 directory_paths_(directory_paths),
148 outstanding_tasks_(1), 148 outstanding_tasks_(1),
149 on_success_(on_success), 149 on_success_(on_success),
150 on_failure_(on_failure) {} 150 on_failure_(on_failure) {}
151 151
152 void WritableFileChecker::Check() { 152 void WritableFileChecker::Check() {
153 outstanding_tasks_ = paths_.size(); 153 outstanding_tasks_ = paths_.size();
154 for (const auto& path : paths_) { 154 for (const auto& path : paths_) {
155 bool is_directory = directory_paths_.find(path) != directory_paths_.end(); 155 bool is_directory = directory_paths_.find(path) != directory_paths_.end();
156 #if defined(OS_CHROMEOS) 156 #if defined(OS_CHROMEOS)
157 NonNativeFileSystemDelegate* delegate = 157 NonNativeFileSystemDelegate* delegate =
158 ExtensionsAPIClient::Get()->GetNonNativeFileSystemDelegate(); 158 ExtensionsAPIClient::Get()->GetNonNativeFileSystemDelegate();
159 if (delegate && delegate->IsUnderNonNativeLocalPath(profile_, path)) { 159 if (delegate && delegate->IsUnderNonNativeLocalPath(context_, path)) {
160 if (is_directory) { 160 if (is_directory) {
161 delegate->IsNonNativeLocalPathDirectory( 161 delegate->IsNonNativeLocalPathDirectory(
162 profile_, 162 context_, path,
163 path,
164 base::Bind(&WritableFileChecker::OnPrepareFileDone, this, path)); 163 base::Bind(&WritableFileChecker::OnPrepareFileDone, this, path));
165 } else { 164 } else {
166 delegate->PrepareNonNativeLocalFileForWritableApp( 165 delegate->PrepareNonNativeLocalFileForWritableApp(
167 profile_, 166 context_, path,
168 path,
169 base::Bind(&WritableFileChecker::OnPrepareFileDone, this, path)); 167 base::Bind(&WritableFileChecker::OnPrepareFileDone, this, path));
170 } 168 }
171 continue; 169 continue;
172 } 170 }
173 #endif 171 #endif
174 content::BrowserThread::PostTaskAndReplyWithResult( 172 content::BrowserThread::PostTaskAndReplyWithResult(
175 content::BrowserThread::FILE, FROM_HERE, 173 content::BrowserThread::FILE, FROM_HERE,
176 base::Bind(&PrepareNativeLocalFileForWritableApp, path, is_directory), 174 base::Bind(&PrepareNativeLocalFileForWritableApp, path, is_directory),
177 base::Bind(&WritableFileChecker::OnPrepareFileDone, this, path)); 175 base::Bind(&WritableFileChecker::OnPrepareFileDone, this, path));
178 } 176 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 250
253 bool FileHandlerCanHandleEntry(const FileHandlerInfo& handler, 251 bool FileHandlerCanHandleEntry(const FileHandlerInfo& handler,
254 const EntryInfo& entry) { 252 const EntryInfo& entry) {
255 if (entry.is_directory) 253 if (entry.is_directory)
256 return handler.include_directories; 254 return handler.include_directories;
257 255
258 return FileHandlerCanHandleFileWithMimeType(handler, entry.mime_type) || 256 return FileHandlerCanHandleFileWithMimeType(handler, entry.mime_type) ||
259 FileHandlerCanHandleFileWithExtension(handler, entry.path); 257 FileHandlerCanHandleFileWithExtension(handler, entry.path);
260 } 258 }
261 259
262 GrantedFileEntry CreateFileEntry(Profile* profile, 260 GrantedFileEntry CreateFileEntry(content::BrowserContext* context,
263 const Extension* extension, 261 const Extension* extension,
264 int renderer_id, 262 int renderer_id,
265 const base::FilePath& path, 263 const base::FilePath& path,
266 bool is_directory) { 264 bool is_directory) {
267 GrantedFileEntry result; 265 GrantedFileEntry result;
268 storage::IsolatedContext* isolated_context = 266 storage::IsolatedContext* isolated_context =
269 storage::IsolatedContext::GetInstance(); 267 storage::IsolatedContext::GetInstance();
270 DCHECK(isolated_context); 268 DCHECK(isolated_context);
271 269
272 result.filesystem_id = isolated_context->RegisterFileSystemForPath( 270 result.filesystem_id = isolated_context->RegisterFileSystemForPath(
(...skipping 11 matching lines...) Expand all
284 policy->GrantDeleteFromFileSystem(renderer_id, result.filesystem_id); 282 policy->GrantDeleteFromFileSystem(renderer_id, result.filesystem_id);
285 } 283 }
286 } 284 }
287 285
288 result.id = result.filesystem_id + ":" + result.registered_name; 286 result.id = result.filesystem_id + ":" + result.registered_name;
289 return result; 287 return result;
290 } 288 }
291 289
292 void PrepareFilesForWritableApp( 290 void PrepareFilesForWritableApp(
293 const std::vector<base::FilePath>& paths, 291 const std::vector<base::FilePath>& paths,
294 Profile* profile, 292 content::BrowserContext* context,
295 const std::set<base::FilePath>& directory_paths, 293 const std::set<base::FilePath>& directory_paths,
296 const base::Closure& on_success, 294 const base::Closure& on_success,
297 const base::Callback<void(const base::FilePath&)>& on_failure) { 295 const base::Callback<void(const base::FilePath&)>& on_failure) {
298 scoped_refptr<WritableFileChecker> checker(new WritableFileChecker( 296 scoped_refptr<WritableFileChecker> checker(new WritableFileChecker(
299 paths, profile, directory_paths, on_success, on_failure)); 297 paths, context, directory_paths, on_success, on_failure));
300 checker->Check(); 298 checker->Check();
301 } 299 }
302 300
303 bool HasFileSystemWritePermission(const Extension* extension) { 301 bool HasFileSystemWritePermission(const Extension* extension) {
304 return extension->permissions_data()->HasAPIPermission( 302 return extension->permissions_data()->HasAPIPermission(
305 APIPermission::kFileSystemWrite); 303 APIPermission::kFileSystemWrite);
306 } 304 }
307 305
308 bool ValidateFileEntryAndGetPath(const std::string& filesystem_name, 306 bool ValidateFileEntryAndGetPath(const std::string& filesystem_name,
309 const std::string& filesystem_path, 307 const std::string& filesystem_path,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 *error = kInvalidParameters; 350 *error = kInvalidParameters;
353 return false; 351 return false;
354 } 352 }
355 353
356 return true; 354 return true;
357 } 355 }
358 356
359 } // namespace app_file_handler_util 357 } // namespace app_file_handler_util
360 358
361 } // namespace extensions 359 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698