OLD | NEW |
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 #include "webkit/fileapi/file_system_operation.h" | 5 #include "webkit/fileapi/file_system_operation.h" |
6 | 6 |
7 #include "base/time.h" | 7 #include "base/time.h" |
8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
9 #include "net/base/escape.h" | 9 #include "net/base/escape.h" |
10 #include "net/url_request/url_request_context.h" | 10 #include "net/url_request/url_request_context.h" |
11 #include "webkit/fileapi/file_system_callback_dispatcher.h" | 11 #include "webkit/fileapi/file_system_callback_dispatcher.h" |
12 #include "webkit/fileapi/file_system_context.h" | 12 #include "webkit/fileapi/file_system_context.h" |
13 #include "webkit/fileapi/file_system_file_util_proxy.h" | 13 #include "webkit/fileapi/file_system_file_util_proxy.h" |
14 #include "webkit/fileapi/file_system_operation_context.h" | 14 #include "webkit/fileapi/file_system_operation_context.h" |
15 #include "webkit/fileapi/file_system_path_manager.h" | 15 #include "webkit/fileapi/file_system_path_manager.h" |
16 #include "webkit/fileapi/file_system_quota_util.h" | 16 #include "webkit/fileapi/file_system_quota_util.h" |
17 #include "webkit/fileapi/file_system_types.h" | 17 #include "webkit/fileapi/file_system_types.h" |
18 #include "webkit/fileapi/file_system_util.h" | 18 #include "webkit/fileapi/file_system_util.h" |
19 #include "webkit/fileapi/file_writer_delegate.h" | 19 #include "webkit/fileapi/file_writer_delegate.h" |
20 #include "webkit/fileapi/local_file_system_file_util.h" | 20 #include "webkit/fileapi/local_file_util.h" |
21 #include "webkit/fileapi/quota_file_util.h" | 21 #include "webkit/fileapi/quota_file_util.h" |
22 #include "webkit/quota/quota_types.h" | 22 #include "webkit/quota/quota_types.h" |
23 | 23 |
24 namespace fileapi { | 24 namespace fileapi { |
25 | 25 |
26 FileSystemOperation::FileSystemOperation( | 26 FileSystemOperation::FileSystemOperation( |
27 FileSystemCallbackDispatcher* dispatcher, | 27 FileSystemCallbackDispatcher* dispatcher, |
28 scoped_refptr<base::MessageLoopProxy> proxy, | 28 scoped_refptr<base::MessageLoopProxy> proxy, |
29 FileSystemContext* file_system_context, | 29 FileSystemContext* file_system_context, |
30 FileSystemFileUtil* file_system_file_util) | 30 FileUtil* file_util) |
31 : proxy_(proxy), | 31 : proxy_(proxy), |
32 dispatcher_(dispatcher), | 32 dispatcher_(dispatcher), |
33 file_system_operation_context_( | 33 file_system_operation_context_(file_system_context, file_util), |
34 file_system_context, file_system_file_util), | |
35 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 34 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
36 DCHECK(dispatcher); | 35 DCHECK(dispatcher); |
37 #ifndef NDEBUG | 36 #ifndef NDEBUG |
38 pending_operation_ = kOperationNone; | 37 pending_operation_ = kOperationNone; |
39 #endif | 38 #endif |
40 } | 39 } |
41 | 40 |
42 FileSystemOperation::~FileSystemOperation() { | 41 FileSystemOperation::~FileSystemOperation() { |
43 if (file_writer_delegate_.get()) | 42 if (file_writer_delegate_.get()) |
44 FileSystemFileUtilProxy::Close( | 43 FileSystemFileUtilProxy::Close( |
(...skipping 25 matching lines...) Expand all Loading... |
70 | 69 |
71 void FileSystemOperation::CreateFile(const GURL& path, | 70 void FileSystemOperation::CreateFile(const GURL& path, |
72 bool exclusive) { | 71 bool exclusive) { |
73 #ifndef NDEBUG | 72 #ifndef NDEBUG |
74 DCHECK(kOperationNone == pending_operation_); | 73 DCHECK(kOperationNone == pending_operation_); |
75 pending_operation_ = kOperationCreateFile; | 74 pending_operation_ = kOperationCreateFile; |
76 #endif | 75 #endif |
77 FilePath virtual_path; | 76 FilePath virtual_path; |
78 GURL origin_url; | 77 GURL origin_url; |
79 FileSystemType type; | 78 FileSystemType type; |
80 FileSystemFileUtil* file_system_file_util; | 79 FileUtil* file_util; |
81 if (!VerifyFileSystemPathForWrite( | 80 if (!VerifyFileSystemPathForWrite( |
82 path, true /* create */, &origin_url, &type, &virtual_path, | 81 path, true /* create */, &origin_url, &type, &virtual_path, &file_util)) { |
83 &file_system_file_util)) { | |
84 delete this; | 82 delete this; |
85 return; | 83 return; |
86 } | 84 } |
87 file_system_operation_context_.set_src_origin_url(origin_url); | 85 file_system_operation_context_.set_src_origin_url(origin_url); |
88 file_system_operation_context_.set_src_type(type); | 86 file_system_operation_context_.set_src_type(type); |
89 file_system_operation_context_.set_src_virtual_path(virtual_path); | 87 file_system_operation_context_.set_src_virtual_path(virtual_path); |
90 if (!file_system_operation_context_.src_file_system_file_util()) | 88 if (!file_system_operation_context_.src_file_util()) |
91 file_system_operation_context_.set_src_file_system_file_util( | 89 file_system_operation_context_.set_src_file_util(file_util); |
92 file_system_file_util); | |
93 exclusive_ = exclusive; | 90 exclusive_ = exclusive; |
94 | 91 |
95 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( | 92 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( |
96 &FileSystemOperation::DelayedCreateFileForQuota)); | 93 &FileSystemOperation::DelayedCreateFileForQuota)); |
97 } | 94 } |
98 | 95 |
99 void FileSystemOperation::DelayedCreateFileForQuota( | 96 void FileSystemOperation::DelayedCreateFileForQuota( |
100 quota::QuotaStatusCode status, int64 usage, int64 quota) { | 97 quota::QuotaStatusCode status, int64 usage, int64 quota) { |
101 if (file_system_context()->IsStorageUnlimited( | 98 if (file_system_context()->IsStorageUnlimited( |
102 file_system_operation_context()->src_origin_url()) || | 99 file_system_operation_context()->src_origin_url()) || |
(...skipping 15 matching lines...) Expand all Loading... |
118 void FileSystemOperation::CreateDirectory(const GURL& path, | 115 void FileSystemOperation::CreateDirectory(const GURL& path, |
119 bool exclusive, | 116 bool exclusive, |
120 bool recursive) { | 117 bool recursive) { |
121 #ifndef NDEBUG | 118 #ifndef NDEBUG |
122 DCHECK(kOperationNone == pending_operation_); | 119 DCHECK(kOperationNone == pending_operation_); |
123 pending_operation_ = kOperationCreateDirectory; | 120 pending_operation_ = kOperationCreateDirectory; |
124 #endif | 121 #endif |
125 FilePath virtual_path; | 122 FilePath virtual_path; |
126 GURL origin_url; | 123 GURL origin_url; |
127 FileSystemType type; | 124 FileSystemType type; |
128 FileSystemFileUtil* file_system_file_util; | 125 FileUtil* file_util; |
129 | 126 |
130 if (!VerifyFileSystemPathForWrite( | 127 if (!VerifyFileSystemPathForWrite( |
131 path, true /* create */, &origin_url, &type, &virtual_path, | 128 path, true /* create */, &origin_url, &type, &virtual_path, &file_util)) { |
132 &file_system_file_util)) { | |
133 delete this; | 129 delete this; |
134 return; | 130 return; |
135 } | 131 } |
136 file_system_operation_context_.set_src_origin_url(origin_url); | 132 file_system_operation_context_.set_src_origin_url(origin_url); |
137 file_system_operation_context_.set_src_type(type); | 133 file_system_operation_context_.set_src_type(type); |
138 file_system_operation_context_.set_src_virtual_path(virtual_path); | 134 file_system_operation_context_.set_src_virtual_path(virtual_path); |
139 if (!file_system_operation_context_.src_file_system_file_util()) | 135 if (!file_system_operation_context_.src_file_util()) |
140 file_system_operation_context_.set_src_file_system_file_util( | 136 file_system_operation_context_.set_src_file_util(file_util); |
141 file_system_file_util); | |
142 exclusive_ = exclusive; | 137 exclusive_ = exclusive; |
143 recursive_ = recursive; | 138 recursive_ = recursive; |
144 | 139 |
145 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( | 140 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( |
146 &FileSystemOperation::DelayedCreateDirectoryForQuota)); | 141 &FileSystemOperation::DelayedCreateDirectoryForQuota)); |
147 } | 142 } |
148 | 143 |
149 void FileSystemOperation::DelayedCreateDirectoryForQuota( | 144 void FileSystemOperation::DelayedCreateDirectoryForQuota( |
150 quota::QuotaStatusCode status, int64 usage, int64 quota) { | 145 quota::QuotaStatusCode status, int64 usage, int64 quota) { |
151 if (file_system_context()->IsStorageUnlimited( | 146 if (file_system_context()->IsStorageUnlimited( |
(...skipping 19 matching lines...) Expand all Loading... |
171 #ifndef NDEBUG | 166 #ifndef NDEBUG |
172 DCHECK(kOperationNone == pending_operation_); | 167 DCHECK(kOperationNone == pending_operation_); |
173 pending_operation_ = kOperationCopy; | 168 pending_operation_ = kOperationCopy; |
174 #endif | 169 #endif |
175 FilePath virtual_path_0; | 170 FilePath virtual_path_0; |
176 FilePath virtual_path_1; | 171 FilePath virtual_path_1; |
177 GURL src_origin_url; | 172 GURL src_origin_url; |
178 GURL dest_origin_url; | 173 GURL dest_origin_url; |
179 FileSystemType src_type; | 174 FileSystemType src_type; |
180 FileSystemType dest_type; | 175 FileSystemType dest_type; |
181 FileSystemFileUtil* src_file_system_file_util; | 176 FileUtil* src_file_util; |
182 FileSystemFileUtil* dest_file_system_file_util; | 177 FileUtil* dest_file_util; |
183 | 178 |
184 if (!VerifyFileSystemPathForRead(src_path, &src_origin_url, &src_type, | 179 if (!VerifyFileSystemPathForRead(src_path, &src_origin_url, &src_type, |
185 &virtual_path_0, &src_file_system_file_util) || | 180 &virtual_path_0, &src_file_util) || |
186 !VerifyFileSystemPathForWrite(dest_path, true /* create */, | 181 !VerifyFileSystemPathForWrite(dest_path, true /* create */, |
187 &dest_origin_url, &dest_type, &virtual_path_1, | 182 &dest_origin_url, &dest_type, &virtual_path_1, &dest_file_util)) { |
188 &dest_file_system_file_util)) { | |
189 delete this; | 183 delete this; |
190 return; | 184 return; |
191 } | 185 } |
192 file_system_operation_context_.set_src_origin_url(src_origin_url); | 186 file_system_operation_context_.set_src_origin_url(src_origin_url); |
193 file_system_operation_context_.set_dest_origin_url(dest_origin_url); | 187 file_system_operation_context_.set_dest_origin_url(dest_origin_url); |
194 file_system_operation_context_.set_src_type(src_type); | 188 file_system_operation_context_.set_src_type(src_type); |
195 file_system_operation_context_.set_dest_type(dest_type); | 189 file_system_operation_context_.set_dest_type(dest_type); |
196 file_system_operation_context_.set_src_virtual_path(virtual_path_0); | 190 file_system_operation_context_.set_src_virtual_path(virtual_path_0); |
197 file_system_operation_context_.set_dest_virtual_path(virtual_path_1); | 191 file_system_operation_context_.set_dest_virtual_path(virtual_path_1); |
198 if (!file_system_operation_context_.src_file_system_file_util()) | 192 if (!file_system_operation_context_.src_file_util()) |
199 file_system_operation_context_.set_src_file_system_file_util( | 193 file_system_operation_context_.set_src_file_util(src_file_util); |
200 src_file_system_file_util); | 194 if (!file_system_operation_context_.dest_file_util()) |
201 if (!file_system_operation_context_.dest_file_system_file_util()) | 195 file_system_operation_context_.set_dest_file_util(dest_file_util); |
202 file_system_operation_context_.set_dest_file_system_file_util( | |
203 dest_file_system_file_util); | |
204 | 196 |
205 GetUsageAndQuotaThenCallback(dest_origin_url, callback_factory_.NewCallback( | 197 GetUsageAndQuotaThenCallback(dest_origin_url, callback_factory_.NewCallback( |
206 &FileSystemOperation::DelayedCopyForQuota)); | 198 &FileSystemOperation::DelayedCopyForQuota)); |
207 } | 199 } |
208 | 200 |
209 void FileSystemOperation::DelayedCopyForQuota(quota::QuotaStatusCode status, | 201 void FileSystemOperation::DelayedCopyForQuota(quota::QuotaStatusCode status, |
210 int64 usage, int64 quota) { | 202 int64 usage, int64 quota) { |
211 if (file_system_context()->IsStorageUnlimited( | 203 if (file_system_context()->IsStorageUnlimited( |
212 file_system_operation_context()->dest_origin_url()) || | 204 file_system_operation_context()->dest_origin_url()) || |
213 quota == QuotaFileUtil::kNoLimit) { | 205 quota == QuotaFileUtil::kNoLimit) { |
(...skipping 16 matching lines...) Expand all Loading... |
230 #ifndef NDEBUG | 222 #ifndef NDEBUG |
231 DCHECK(kOperationNone == pending_operation_); | 223 DCHECK(kOperationNone == pending_operation_); |
232 pending_operation_ = kOperationMove; | 224 pending_operation_ = kOperationMove; |
233 #endif | 225 #endif |
234 FilePath virtual_path_0; | 226 FilePath virtual_path_0; |
235 FilePath virtual_path_1; | 227 FilePath virtual_path_1; |
236 GURL src_origin_url; | 228 GURL src_origin_url; |
237 GURL dest_origin_url; | 229 GURL dest_origin_url; |
238 FileSystemType src_type; | 230 FileSystemType src_type; |
239 FileSystemType dest_type; | 231 FileSystemType dest_type; |
240 FileSystemFileUtil* src_file_system_file_util; | 232 FileUtil* src_file_util; |
241 FileSystemFileUtil* dest_file_system_file_util; | 233 FileUtil* dest_file_util; |
242 | 234 |
243 if (!VerifyFileSystemPathForWrite(src_path, false, &src_origin_url, &src_type, | 235 if (!VerifyFileSystemPathForWrite(src_path, false, &src_origin_url, &src_type, |
244 &virtual_path_0, &src_file_system_file_util) || | 236 &virtual_path_0, &src_file_util) || |
245 !VerifyFileSystemPathForWrite(dest_path, true /* create */, | 237 !VerifyFileSystemPathForWrite(dest_path, true /* create */, |
246 &dest_origin_url, &dest_type, &virtual_path_1, | 238 &dest_origin_url, &dest_type, &virtual_path_1, &dest_file_util)) { |
247 &dest_file_system_file_util)) { | |
248 delete this; | 239 delete this; |
249 return; | 240 return; |
250 } | 241 } |
251 file_system_operation_context_.set_src_origin_url(src_origin_url); | 242 file_system_operation_context_.set_src_origin_url(src_origin_url); |
252 file_system_operation_context_.set_dest_origin_url(dest_origin_url); | 243 file_system_operation_context_.set_dest_origin_url(dest_origin_url); |
253 file_system_operation_context_.set_src_type(src_type); | 244 file_system_operation_context_.set_src_type(src_type); |
254 file_system_operation_context_.set_dest_type(dest_type); | 245 file_system_operation_context_.set_dest_type(dest_type); |
255 file_system_operation_context_.set_src_virtual_path(virtual_path_0); | 246 file_system_operation_context_.set_src_virtual_path(virtual_path_0); |
256 file_system_operation_context_.set_dest_virtual_path(virtual_path_1); | 247 file_system_operation_context_.set_dest_virtual_path(virtual_path_1); |
257 if (!file_system_operation_context_.src_file_system_file_util()) | 248 if (!file_system_operation_context_.src_file_util()) |
258 file_system_operation_context_.set_src_file_system_file_util( | 249 file_system_operation_context_.set_src_file_util(src_file_util); |
259 src_file_system_file_util); | 250 if (!file_system_operation_context_.dest_file_util()) |
260 if (!file_system_operation_context_.dest_file_system_file_util()) | 251 file_system_operation_context_.set_dest_file_util(dest_file_util); |
261 file_system_operation_context_.set_dest_file_system_file_util( | |
262 dest_file_system_file_util); | |
263 | 252 |
264 GetUsageAndQuotaThenCallback(dest_origin_url, callback_factory_.NewCallback( | 253 GetUsageAndQuotaThenCallback(dest_origin_url, callback_factory_.NewCallback( |
265 &FileSystemOperation::DelayedMoveForQuota)); | 254 &FileSystemOperation::DelayedMoveForQuota)); |
266 } | 255 } |
267 | 256 |
268 void FileSystemOperation::DelayedMoveForQuota(quota::QuotaStatusCode status, | 257 void FileSystemOperation::DelayedMoveForQuota(quota::QuotaStatusCode status, |
269 int64 usage, int64 quota) { | 258 int64 usage, int64 quota) { |
270 if (file_system_context()->IsStorageUnlimited( | 259 if (file_system_context()->IsStorageUnlimited( |
271 file_system_operation_context()->dest_origin_url()) || | 260 file_system_operation_context()->dest_origin_url()) || |
272 quota == QuotaFileUtil::kNoLimit) { | 261 quota == QuotaFileUtil::kNoLimit) { |
(...skipping 13 matching lines...) Expand all Loading... |
286 | 275 |
287 void FileSystemOperation::DirectoryExists(const GURL& path) { | 276 void FileSystemOperation::DirectoryExists(const GURL& path) { |
288 #ifndef NDEBUG | 277 #ifndef NDEBUG |
289 DCHECK(kOperationNone == pending_operation_); | 278 DCHECK(kOperationNone == pending_operation_); |
290 pending_operation_ = kOperationDirectoryExists; | 279 pending_operation_ = kOperationDirectoryExists; |
291 #endif | 280 #endif |
292 | 281 |
293 FilePath virtual_path; | 282 FilePath virtual_path; |
294 GURL origin_url; | 283 GURL origin_url; |
295 FileSystemType type; | 284 FileSystemType type; |
296 FileSystemFileUtil* file_system_file_util; | 285 FileUtil* file_util; |
297 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, | 286 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, |
298 &file_system_file_util)) { | 287 &file_util)) { |
299 delete this; | 288 delete this; |
300 return; | 289 return; |
301 } | 290 } |
302 file_system_operation_context_.set_src_origin_url(origin_url); | 291 file_system_operation_context_.set_src_origin_url(origin_url); |
303 file_system_operation_context_.set_src_type(type); | 292 file_system_operation_context_.set_src_type(type); |
304 if (!file_system_operation_context_.src_file_system_file_util()) | 293 if (!file_system_operation_context_.src_file_util()) |
305 file_system_operation_context_.set_src_file_system_file_util( | 294 file_system_operation_context_.set_src_file_util(file_util); |
306 file_system_file_util); | |
307 FileSystemFileUtilProxy::GetFileInfo( | 295 FileSystemFileUtilProxy::GetFileInfo( |
308 file_system_operation_context_, | 296 file_system_operation_context_, |
309 proxy_, virtual_path, callback_factory_.NewCallback( | 297 proxy_, virtual_path, callback_factory_.NewCallback( |
310 &FileSystemOperation::DidDirectoryExists)); | 298 &FileSystemOperation::DidDirectoryExists)); |
311 } | 299 } |
312 | 300 |
313 void FileSystemOperation::FileExists(const GURL& path) { | 301 void FileSystemOperation::FileExists(const GURL& path) { |
314 #ifndef NDEBUG | 302 #ifndef NDEBUG |
315 DCHECK(kOperationNone == pending_operation_); | 303 DCHECK(kOperationNone == pending_operation_); |
316 pending_operation_ = kOperationFileExists; | 304 pending_operation_ = kOperationFileExists; |
317 #endif | 305 #endif |
318 | 306 |
319 FilePath virtual_path; | 307 FilePath virtual_path; |
320 GURL origin_url; | 308 GURL origin_url; |
321 FileSystemType type; | 309 FileSystemType type; |
322 FileSystemFileUtil* file_system_file_util; | 310 FileUtil* file_util; |
323 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, | 311 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, |
324 &file_system_file_util)) { | 312 &file_util)) { |
325 delete this; | 313 delete this; |
326 return; | 314 return; |
327 } | 315 } |
328 file_system_operation_context_.set_src_origin_url(origin_url); | 316 file_system_operation_context_.set_src_origin_url(origin_url); |
329 file_system_operation_context_.set_src_type(type); | 317 file_system_operation_context_.set_src_type(type); |
330 if (!file_system_operation_context_.src_file_system_file_util()) | 318 if (!file_system_operation_context_.src_file_util()) |
331 file_system_operation_context_.set_src_file_system_file_util( | 319 file_system_operation_context_.set_src_file_util(file_util); |
332 file_system_file_util); | |
333 FileSystemFileUtilProxy::GetFileInfo( | 320 FileSystemFileUtilProxy::GetFileInfo( |
334 file_system_operation_context_, | 321 file_system_operation_context_, |
335 proxy_, virtual_path, callback_factory_.NewCallback( | 322 proxy_, virtual_path, callback_factory_.NewCallback( |
336 &FileSystemOperation::DidFileExists)); | 323 &FileSystemOperation::DidFileExists)); |
337 } | 324 } |
338 | 325 |
339 void FileSystemOperation::GetMetadata(const GURL& path) { | 326 void FileSystemOperation::GetMetadata(const GURL& path) { |
340 #ifndef NDEBUG | 327 #ifndef NDEBUG |
341 DCHECK(kOperationNone == pending_operation_); | 328 DCHECK(kOperationNone == pending_operation_); |
342 pending_operation_ = kOperationGetMetadata; | 329 pending_operation_ = kOperationGetMetadata; |
343 #endif | 330 #endif |
344 | 331 |
345 FilePath virtual_path; | 332 FilePath virtual_path; |
346 GURL origin_url; | 333 GURL origin_url; |
347 FileSystemType type; | 334 FileSystemType type; |
348 FileSystemFileUtil* file_system_file_util; | 335 FileUtil* file_util; |
349 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, | 336 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, |
350 &file_system_file_util)) { | 337 &file_util)) { |
351 delete this; | 338 delete this; |
352 return; | 339 return; |
353 } | 340 } |
354 file_system_operation_context_.set_src_origin_url(origin_url); | 341 file_system_operation_context_.set_src_origin_url(origin_url); |
355 file_system_operation_context_.set_src_type(type); | 342 file_system_operation_context_.set_src_type(type); |
356 if (!file_system_operation_context_.src_file_system_file_util()) | 343 if (!file_system_operation_context_.src_file_util()) |
357 file_system_operation_context_.set_src_file_system_file_util( | 344 file_system_operation_context_.set_src_file_util(file_util); |
358 file_system_file_util); | |
359 FileSystemFileUtilProxy::GetFileInfo( | 345 FileSystemFileUtilProxy::GetFileInfo( |
360 file_system_operation_context_, | 346 file_system_operation_context_, |
361 proxy_, virtual_path, callback_factory_.NewCallback( | 347 proxy_, virtual_path, callback_factory_.NewCallback( |
362 &FileSystemOperation::DidGetMetadata)); | 348 &FileSystemOperation::DidGetMetadata)); |
363 } | 349 } |
364 | 350 |
365 void FileSystemOperation::ReadDirectory(const GURL& path) { | 351 void FileSystemOperation::ReadDirectory(const GURL& path) { |
366 #ifndef NDEBUG | 352 #ifndef NDEBUG |
367 DCHECK(kOperationNone == pending_operation_); | 353 DCHECK(kOperationNone == pending_operation_); |
368 pending_operation_ = kOperationReadDirectory; | 354 pending_operation_ = kOperationReadDirectory; |
369 #endif | 355 #endif |
370 | 356 |
371 FilePath virtual_path; | 357 FilePath virtual_path; |
372 GURL origin_url; | 358 GURL origin_url; |
373 FileSystemType type; | 359 FileSystemType type; |
374 FileSystemFileUtil* file_system_file_util; | 360 FileUtil* file_util; |
375 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, | 361 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, |
376 &file_system_file_util)) { | 362 &file_util)) { |
377 delete this; | 363 delete this; |
378 return; | 364 return; |
379 } | 365 } |
380 file_system_operation_context_.set_src_origin_url(origin_url); | 366 file_system_operation_context_.set_src_origin_url(origin_url); |
381 file_system_operation_context_.set_src_type(type); | 367 file_system_operation_context_.set_src_type(type); |
382 if (!file_system_operation_context_.src_file_system_file_util()) | 368 if (!file_system_operation_context_.src_file_util()) |
383 file_system_operation_context_.set_src_file_system_file_util( | 369 file_system_operation_context_.set_src_file_util(file_util); |
384 file_system_file_util); | |
385 FileSystemFileUtilProxy::ReadDirectory( | 370 FileSystemFileUtilProxy::ReadDirectory( |
386 file_system_operation_context_, | 371 file_system_operation_context_, |
387 proxy_, virtual_path, callback_factory_.NewCallback( | 372 proxy_, virtual_path, callback_factory_.NewCallback( |
388 &FileSystemOperation::DidReadDirectory)); | 373 &FileSystemOperation::DidReadDirectory)); |
389 } | 374 } |
390 | 375 |
391 void FileSystemOperation::Remove(const GURL& path, bool recursive) { | 376 void FileSystemOperation::Remove(const GURL& path, bool recursive) { |
392 #ifndef NDEBUG | 377 #ifndef NDEBUG |
393 DCHECK(kOperationNone == pending_operation_); | 378 DCHECK(kOperationNone == pending_operation_); |
394 pending_operation_ = kOperationRemove; | 379 pending_operation_ = kOperationRemove; |
395 #endif | 380 #endif |
396 | 381 |
397 FilePath virtual_path; | 382 FilePath virtual_path; |
398 GURL origin_url; | 383 GURL origin_url; |
399 FileSystemType type; | 384 FileSystemType type; |
400 FileSystemFileUtil* file_system_file_util; | 385 FileUtil* file_util; |
401 if (!VerifyFileSystemPathForWrite(path, false /* create */, &origin_url, | 386 if (!VerifyFileSystemPathForWrite(path, false /* create */, &origin_url, |
402 &type, &virtual_path, &file_system_file_util)) { | 387 &type, &virtual_path, &file_util)) { |
403 delete this; | 388 delete this; |
404 return; | 389 return; |
405 } | 390 } |
406 file_system_operation_context_.set_src_origin_url(origin_url); | 391 file_system_operation_context_.set_src_origin_url(origin_url); |
407 file_system_operation_context_.set_src_type(type); | 392 file_system_operation_context_.set_src_type(type); |
408 if (!file_system_operation_context_.src_file_system_file_util()) | 393 if (!file_system_operation_context_.src_file_util()) |
409 file_system_operation_context_.set_src_file_system_file_util( | 394 file_system_operation_context_.set_src_file_util(file_util); |
410 file_system_file_util); | |
411 FileSystemFileUtilProxy::Delete( | 395 FileSystemFileUtilProxy::Delete( |
412 file_system_operation_context_, | 396 file_system_operation_context_, |
413 proxy_, virtual_path, recursive, callback_factory_.NewCallback( | 397 proxy_, virtual_path, recursive, callback_factory_.NewCallback( |
414 &FileSystemOperation::DidFinishFileOperation)); | 398 &FileSystemOperation::DidFinishFileOperation)); |
415 } | 399 } |
416 | 400 |
417 void FileSystemOperation::Write( | 401 void FileSystemOperation::Write( |
418 scoped_refptr<net::URLRequestContext> url_request_context, | 402 scoped_refptr<net::URLRequestContext> url_request_context, |
419 const GURL& path, | 403 const GURL& path, |
420 const GURL& blob_url, | 404 const GURL& blob_url, |
421 int64 offset) { | 405 int64 offset) { |
422 #ifndef NDEBUG | 406 #ifndef NDEBUG |
423 DCHECK(kOperationNone == pending_operation_); | 407 DCHECK(kOperationNone == pending_operation_); |
424 pending_operation_ = kOperationWrite; | 408 pending_operation_ = kOperationWrite; |
425 #endif | 409 #endif |
426 FilePath virtual_path; | 410 FilePath virtual_path; |
427 GURL origin_url; | 411 GURL origin_url; |
428 FileSystemType type; | 412 FileSystemType type; |
429 FileSystemFileUtil* file_system_file_util; | 413 FileUtil* file_util; |
430 if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url, | 414 if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url, |
431 &type, &virtual_path, &file_system_file_util)) { | 415 &type, &virtual_path, &file_util)) { |
432 delete this; | 416 delete this; |
433 return; | 417 return; |
434 } | 418 } |
435 file_system_operation_context_.set_src_origin_url(origin_url); | 419 file_system_operation_context_.set_src_origin_url(origin_url); |
436 file_system_operation_context_.set_src_type(type); | 420 file_system_operation_context_.set_src_type(type); |
437 file_system_operation_context_.set_src_virtual_path(virtual_path); | 421 file_system_operation_context_.set_src_virtual_path(virtual_path); |
438 if (!file_system_operation_context_.src_file_system_file_util()) | 422 if (!file_system_operation_context_.src_file_util()) |
439 file_system_operation_context_.set_src_file_system_file_util( | 423 file_system_operation_context_.set_src_file_util(file_util); |
440 file_system_file_util); | |
441 DCHECK(blob_url.is_valid()); | 424 DCHECK(blob_url.is_valid()); |
442 file_writer_delegate_.reset(new FileWriterDelegate(this, offset, proxy_)); | 425 file_writer_delegate_.reset(new FileWriterDelegate(this, offset, proxy_)); |
443 blob_request_.reset( | 426 blob_request_.reset( |
444 new net::URLRequest(blob_url, file_writer_delegate_.get())); | 427 new net::URLRequest(blob_url, file_writer_delegate_.get())); |
445 blob_request_->set_context(url_request_context); | 428 blob_request_->set_context(url_request_context); |
446 | 429 |
447 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( | 430 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( |
448 &FileSystemOperation::DelayedWriteForQuota)); | 431 &FileSystemOperation::DelayedWriteForQuota)); |
449 } | 432 } |
450 | 433 |
(...skipping 18 matching lines...) Expand all Loading... |
469 } | 452 } |
470 | 453 |
471 void FileSystemOperation::Truncate(const GURL& path, int64 length) { | 454 void FileSystemOperation::Truncate(const GURL& path, int64 length) { |
472 #ifndef NDEBUG | 455 #ifndef NDEBUG |
473 DCHECK(kOperationNone == pending_operation_); | 456 DCHECK(kOperationNone == pending_operation_); |
474 pending_operation_ = kOperationTruncate; | 457 pending_operation_ = kOperationTruncate; |
475 #endif | 458 #endif |
476 FilePath virtual_path; | 459 FilePath virtual_path; |
477 GURL origin_url; | 460 GURL origin_url; |
478 FileSystemType type; | 461 FileSystemType type; |
479 FileSystemFileUtil* file_system_file_util; | 462 FileUtil* file_util; |
480 if (!VerifyFileSystemPathForWrite(path, false /* create */, &origin_url, | 463 if (!VerifyFileSystemPathForWrite(path, false /* create */, &origin_url, |
481 &type, &virtual_path, &file_system_file_util)) { | 464 &type, &virtual_path, &file_util)) { |
482 delete this; | 465 delete this; |
483 return; | 466 return; |
484 } | 467 } |
485 file_system_operation_context_.set_src_origin_url(origin_url); | 468 file_system_operation_context_.set_src_origin_url(origin_url); |
486 file_system_operation_context_.set_src_type(type); | 469 file_system_operation_context_.set_src_type(type); |
487 file_system_operation_context_.set_src_virtual_path(virtual_path); | 470 file_system_operation_context_.set_src_virtual_path(virtual_path); |
488 if (!file_system_operation_context_.src_file_system_file_util()) | 471 if (!file_system_operation_context_.src_file_util()) |
489 file_system_operation_context_.set_src_file_system_file_util( | 472 file_system_operation_context_.set_src_file_util(file_util); |
490 file_system_file_util); | |
491 length_ = length; | 473 length_ = length; |
492 | 474 |
493 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( | 475 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( |
494 &FileSystemOperation::DelayedTruncateForQuota)); | 476 &FileSystemOperation::DelayedTruncateForQuota)); |
495 } | 477 } |
496 | 478 |
497 void FileSystemOperation::DelayedTruncateForQuota(quota::QuotaStatusCode status, | 479 void FileSystemOperation::DelayedTruncateForQuota(quota::QuotaStatusCode status, |
498 int64 usage, int64 quota) { | 480 int64 usage, int64 quota) { |
499 if (file_system_context()->IsStorageUnlimited( | 481 if (file_system_context()->IsStorageUnlimited( |
500 file_system_operation_context()->src_origin_url()) || | 482 file_system_operation_context()->src_origin_url()) || |
(...skipping 15 matching lines...) Expand all Loading... |
516 const base::Time& last_access_time, | 498 const base::Time& last_access_time, |
517 const base::Time& last_modified_time) { | 499 const base::Time& last_modified_time) { |
518 #ifndef NDEBUG | 500 #ifndef NDEBUG |
519 DCHECK(kOperationNone == pending_operation_); | 501 DCHECK(kOperationNone == pending_operation_); |
520 pending_operation_ = kOperationTouchFile; | 502 pending_operation_ = kOperationTouchFile; |
521 #endif | 503 #endif |
522 | 504 |
523 FilePath virtual_path; | 505 FilePath virtual_path; |
524 GURL origin_url; | 506 GURL origin_url; |
525 FileSystemType type; | 507 FileSystemType type; |
526 FileSystemFileUtil* file_system_file_util; | 508 FileUtil* file_util; |
527 if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url, | 509 if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url, |
528 &type, &virtual_path, &file_system_file_util)) { | 510 &type, &virtual_path, &file_util)) { |
529 delete this; | 511 delete this; |
530 return; | 512 return; |
531 } | 513 } |
532 file_system_operation_context_.set_src_origin_url(origin_url); | 514 file_system_operation_context_.set_src_origin_url(origin_url); |
533 file_system_operation_context_.set_src_type(type); | 515 file_system_operation_context_.set_src_type(type); |
534 if (!file_system_operation_context_.src_file_system_file_util()) | 516 if (!file_system_operation_context_.src_file_util()) |
535 file_system_operation_context_.set_src_file_system_file_util( | 517 file_system_operation_context_.set_src_file_util(file_util); |
536 file_system_file_util); | |
537 FileSystemFileUtilProxy::Touch( | 518 FileSystemFileUtilProxy::Touch( |
538 file_system_operation_context_, | 519 file_system_operation_context_, |
539 proxy_, virtual_path, last_access_time, last_modified_time, | 520 proxy_, virtual_path, last_access_time, last_modified_time, |
540 callback_factory_.NewCallback(&FileSystemOperation::DidTouchFile)); | 521 callback_factory_.NewCallback(&FileSystemOperation::DidTouchFile)); |
541 } | 522 } |
542 | 523 |
543 void FileSystemOperation::OpenFile(const GURL& path, | 524 void FileSystemOperation::OpenFile(const GURL& path, |
544 int file_flags, | 525 int file_flags, |
545 base::ProcessHandle peer_handle) { | 526 base::ProcessHandle peer_handle) { |
546 #ifndef NDEBUG | 527 #ifndef NDEBUG |
547 DCHECK(kOperationNone == pending_operation_); | 528 DCHECK(kOperationNone == pending_operation_); |
548 pending_operation_ = kOperationOpenFile; | 529 pending_operation_ = kOperationOpenFile; |
549 #endif | 530 #endif |
550 | 531 |
551 peer_handle_ = peer_handle; | 532 peer_handle_ = peer_handle; |
552 FilePath virtual_path; | 533 FilePath virtual_path; |
553 GURL origin_url; | 534 GURL origin_url; |
554 FileSystemType type; | 535 FileSystemType type; |
555 FileSystemFileUtil* file_system_file_util; | 536 FileUtil* file_util; |
556 if (file_flags & ( | 537 if (file_flags & ( |
557 (base::PLATFORM_FILE_ENUMERATE | base::PLATFORM_FILE_TEMPORARY | | 538 (base::PLATFORM_FILE_ENUMERATE | base::PLATFORM_FILE_TEMPORARY | |
558 base::PLATFORM_FILE_HIDDEN))) { | 539 base::PLATFORM_FILE_HIDDEN))) { |
559 delete this; | 540 delete this; |
560 return; | 541 return; |
561 } | 542 } |
562 if (file_flags & | 543 if (file_flags & |
563 (base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_OPEN_ALWAYS | | 544 (base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_OPEN_ALWAYS | |
564 base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_TRUNCATED | | 545 base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_TRUNCATED | |
565 base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_EXCLUSIVE_WRITE | | 546 base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_EXCLUSIVE_WRITE | |
566 base::PLATFORM_FILE_DELETE_ON_CLOSE | | 547 base::PLATFORM_FILE_DELETE_ON_CLOSE | |
567 base::PLATFORM_FILE_WRITE_ATTRIBUTES)) { | 548 base::PLATFORM_FILE_WRITE_ATTRIBUTES)) { |
568 if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url, | 549 if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url, |
569 &type, &virtual_path, &file_system_file_util)) { | 550 &type, &virtual_path, &file_util)) { |
570 delete this; | 551 delete this; |
571 return; | 552 return; |
572 } | 553 } |
573 } else { | 554 } else { |
574 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, | 555 if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path, |
575 &file_system_file_util)) { | 556 &file_util)) { |
576 delete this; | 557 delete this; |
577 return; | 558 return; |
578 } | 559 } |
579 } | 560 } |
580 file_system_operation_context_.set_src_origin_url(origin_url); | 561 file_system_operation_context_.set_src_origin_url(origin_url); |
581 file_system_operation_context_.set_src_type(type); | 562 file_system_operation_context_.set_src_type(type); |
582 file_system_operation_context_.set_src_virtual_path(virtual_path); | 563 file_system_operation_context_.set_src_virtual_path(virtual_path); |
583 if (!file_system_operation_context_.src_file_system_file_util()) | 564 if (!file_system_operation_context_.src_file_util()) |
584 file_system_operation_context_.set_src_file_system_file_util( | 565 file_system_operation_context_.set_src_file_util(file_util); |
585 file_system_file_util); | |
586 file_flags_ = file_flags; | 566 file_flags_ = file_flags; |
587 | 567 |
588 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( | 568 GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback( |
589 &FileSystemOperation::DelayedOpenFileForQuota)); | 569 &FileSystemOperation::DelayedOpenFileForQuota)); |
590 } | 570 } |
591 | 571 |
592 void FileSystemOperation::DelayedOpenFileForQuota(quota::QuotaStatusCode status, | 572 void FileSystemOperation::DelayedOpenFileForQuota(quota::QuotaStatusCode status, |
593 int64 usage, int64 quota) { | 573 int64 usage, int64 quota) { |
594 if (file_system_context()->IsStorageUnlimited( | 574 if (file_system_context()->IsStorageUnlimited( |
595 file_system_operation_context()->dest_origin_url()) || | 575 file_system_operation_context()->dest_origin_url()) || |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 if (base::PLATFORM_FILE_OK != rv) { | 786 if (base::PLATFORM_FILE_OK != rv) { |
807 dispatcher_->DidFail(rv); | 787 dispatcher_->DidFail(rv); |
808 delete this; | 788 delete this; |
809 return; | 789 return; |
810 } | 790 } |
811 file_writer_delegate_->Start(file.ReleaseValue(), blob_request_.get()); | 791 file_writer_delegate_->Start(file.ReleaseValue(), blob_request_.get()); |
812 } | 792 } |
813 | 793 |
814 bool FileSystemOperation::VerifyFileSystemPathForRead( | 794 bool FileSystemOperation::VerifyFileSystemPathForRead( |
815 const GURL& path, GURL* origin_url, FileSystemType* type, | 795 const GURL& path, GURL* origin_url, FileSystemType* type, |
816 FilePath* virtual_path, FileSystemFileUtil** file_system_file_util) { | 796 FilePath* virtual_path, FileUtil** file_util) { |
817 | 797 |
818 // If we have no context, we just allow any operations, for testing. | 798 // If we have no context, we just allow any operations, for testing. |
819 // TODO(ericu): Revisit this hack for security. | 799 // TODO(ericu): Revisit this hack for security. |
820 if (!file_system_context()) { | 800 if (!file_system_context()) { |
821 #ifdef OS_WIN | 801 #ifdef OS_WIN |
822 // On Windows, the path will look like /C:/foo/bar; we need to remove the | 802 // On Windows, the path will look like /C:/foo/bar; we need to remove the |
823 // leading slash to make it valid. But if it's empty, we shouldn't do | 803 // leading slash to make it valid. But if it's empty, we shouldn't do |
824 // anything. | 804 // anything. |
825 std::string temp = UnescapeURLComponent(path.path(), | 805 std::string temp = UnescapeURLComponent(path.path(), |
826 UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); | 806 UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); |
827 if (temp.size()) | 807 if (temp.size()) |
828 temp = temp.substr(1); | 808 temp = temp.substr(1); |
829 *virtual_path = FilePath(UTF8ToWide(temp)).NormalizeWindowsPathSeparators(); | 809 *virtual_path = FilePath(UTF8ToWide(temp)).NormalizeWindowsPathSeparators(); |
830 #else | 810 #else |
831 *virtual_path = FilePath(path.path()); | 811 *virtual_path = FilePath(path.path()); |
832 #endif | 812 #endif |
833 *type = file_system_operation_context_.src_type(); | 813 *type = file_system_operation_context_.src_type(); |
834 *origin_url = file_system_operation_context_.src_origin_url(); | 814 *origin_url = file_system_operation_context_.src_origin_url(); |
835 *file_system_file_util = NULL; | 815 *file_util = NULL; |
836 return true; | 816 return true; |
837 } | 817 } |
838 | 818 |
839 // We may want do more checks, but for now it just checks if the given | 819 // We may want do more checks, but for now it just checks if the given |
840 // URL is valid. | 820 // URL is valid. |
841 if (!CrackFileSystemURL(path, origin_url, type, virtual_path)) { | 821 if (!CrackFileSystemURL(path, origin_url, type, virtual_path)) { |
842 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_INVALID_URL); | 822 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_INVALID_URL); |
843 return false; | 823 return false; |
844 } | 824 } |
845 if (!file_system_context()->path_manager()->IsAccessAllowed( | 825 if (!file_system_context()->path_manager()->IsAccessAllowed( |
846 *origin_url, *type, *virtual_path)) { | 826 *origin_url, *type, *virtual_path)) { |
847 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY); | 827 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY); |
848 return false; | 828 return false; |
849 } | 829 } |
850 DCHECK(file_system_file_util); | 830 DCHECK(file_util); |
851 *file_system_file_util = | 831 *file_util = file_system_context()->path_manager()->GetFileUtil(*type); |
852 file_system_context()->path_manager()->GetFileSystemFileUtil(*type); | 832 DCHECK(*file_util); |
853 DCHECK(*file_system_file_util); | |
854 | 833 |
855 // We notify this read access whether the read access succeeds or not. | 834 // We notify this read access whether the read access succeeds or not. |
856 // This must be ok since this is used to let the QM's eviction logic know | 835 // This must be ok since this is used to let the QM's eviction logic know |
857 // someone is interested in reading the origin data and therefore to indicate | 836 // someone is interested in reading the origin data and therefore to indicate |
858 // that evicting this origin may not be a good idea. | 837 // that evicting this origin may not be a good idea. |
859 FileSystemQuotaUtil* quota_util = file_system_context()->GetQuotaUtil(*type); | 838 FileSystemQuotaUtil* quota_util = file_system_context()->GetQuotaUtil(*type); |
860 if (quota_util) { | 839 if (quota_util) { |
861 quota_util->NotifyOriginWasAccessedOnIOThread( | 840 quota_util->NotifyOriginWasAccessedOnIOThread( |
862 file_system_context()->quota_manager_proxy(), | 841 file_system_context()->quota_manager_proxy(), |
863 *origin_url, | 842 *origin_url, |
864 *type); | 843 *type); |
865 } | 844 } |
866 | 845 |
867 return true; | 846 return true; |
868 } | 847 } |
869 | 848 |
870 bool FileSystemOperation::VerifyFileSystemPathForWrite( | 849 bool FileSystemOperation::VerifyFileSystemPathForWrite( |
871 const GURL& path, bool create, GURL* origin_url, FileSystemType* type, | 850 const GURL& path, bool create, GURL* origin_url, FileSystemType* type, |
872 FilePath* virtual_path, FileSystemFileUtil** file_system_file_util) { | 851 FilePath* virtual_path, FileUtil** file_util) { |
873 | 852 |
874 // If we have no context, we just allow any operations, for testing. | 853 // If we have no context, we just allow any operations, for testing. |
875 // TODO(ericu): Revisit this hack for security. | 854 // TODO(ericu): Revisit this hack for security. |
876 if (!file_system_context()) { | 855 if (!file_system_context()) { |
877 #ifdef OS_WIN | 856 #ifdef OS_WIN |
878 // On Windows, the path will look like /C:/foo/bar; we need to remove the | 857 // On Windows, the path will look like /C:/foo/bar; we need to remove the |
879 // leading slash to make it valid. But if it's empty, we shouldn't do | 858 // leading slash to make it valid. But if it's empty, we shouldn't do |
880 // anything. | 859 // anything. |
881 std::string temp = UnescapeURLComponent(path.path(), | 860 std::string temp = UnescapeURLComponent(path.path(), |
882 UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); | 861 UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); |
883 if (temp.size()) | 862 if (temp.size()) |
884 temp = temp.substr(1); | 863 temp = temp.substr(1); |
885 *virtual_path = FilePath(UTF8ToWide(temp)).NormalizeWindowsPathSeparators(); | 864 *virtual_path = FilePath(UTF8ToWide(temp)).NormalizeWindowsPathSeparators(); |
886 #else | 865 #else |
887 *virtual_path = FilePath(path.path()); | 866 *virtual_path = FilePath(path.path()); |
888 #endif | 867 #endif |
889 *type = file_system_operation_context_.dest_type(); | 868 *type = file_system_operation_context_.dest_type(); |
890 *origin_url = file_system_operation_context_.dest_origin_url(); | 869 *origin_url = file_system_operation_context_.dest_origin_url(); |
891 *file_system_file_util = NULL; | 870 *file_util = NULL; |
892 return true; | 871 return true; |
893 } | 872 } |
894 | 873 |
895 if (!CrackFileSystemURL(path, origin_url, type, virtual_path)) { | 874 if (!CrackFileSystemURL(path, origin_url, type, virtual_path)) { |
896 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_INVALID_URL); | 875 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_INVALID_URL); |
897 return false; | 876 return false; |
898 } | 877 } |
899 if (!file_system_context()->path_manager()->IsAccessAllowed( | 878 if (!file_system_context()->path_manager()->IsAccessAllowed( |
900 *origin_url, *type, *virtual_path)) { | 879 *origin_url, *type, *virtual_path)) { |
901 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY); | 880 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY); |
902 return false; | 881 return false; |
903 } | 882 } |
904 // Any write access is disallowed on the root path. | 883 // Any write access is disallowed on the root path. |
905 if (virtual_path->value().length() == 0 || | 884 if (virtual_path->value().length() == 0 || |
906 virtual_path->DirName().value() == virtual_path->value()) { | 885 virtual_path->DirName().value() == virtual_path->value()) { |
907 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY); | 886 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY); |
908 return false; | 887 return false; |
909 } | 888 } |
910 if (create && file_system_context()->path_manager()->IsRestrictedFileName( | 889 if (create && file_system_context()->path_manager()->IsRestrictedFileName( |
911 *type, virtual_path->BaseName())) { | 890 *type, virtual_path->BaseName())) { |
912 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY); | 891 dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY); |
913 return false; | 892 return false; |
914 } | 893 } |
915 DCHECK(file_system_file_util); | 894 DCHECK(file_util); |
916 *file_system_file_util = | 895 *file_util = file_system_context()->path_manager()->GetFileUtil(*type); |
917 file_system_context()->path_manager()->GetFileSystemFileUtil(*type); | 896 DCHECK(*file_util); |
918 DCHECK(*file_system_file_util); | |
919 | 897 |
920 return true; | 898 return true; |
921 } | 899 } |
922 | 900 |
923 } // namespace fileapi | 901 } // namespace fileapi |
OLD | NEW |