OLD | NEW |
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 "content/browser/fileapi/fileapi_message_filter.h" | 5 #include "content/browser/fileapi/fileapi_message_filter.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 request_context_(request_context), | 99 request_context_(request_context), |
100 blob_storage_context_(blob_storage_context), | 100 blob_storage_context_(blob_storage_context), |
101 stream_context_(stream_context) { | 101 stream_context_(stream_context) { |
102 DCHECK(context_); | 102 DCHECK(context_); |
103 DCHECK(request_context_); | 103 DCHECK(request_context_); |
104 DCHECK(blob_storage_context); | 104 DCHECK(blob_storage_context); |
105 DCHECK(stream_context); | 105 DCHECK(stream_context); |
106 } | 106 } |
107 | 107 |
108 void FileAPIMessageFilter::OnChannelConnected(int32 peer_pid) { | 108 void FileAPIMessageFilter::OnChannelConnected(int32 peer_pid) { |
109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 109 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
110 | 110 |
111 if (request_context_getter_.get()) { | 111 if (request_context_getter_.get()) { |
112 DCHECK(!request_context_); | 112 DCHECK(!request_context_); |
113 request_context_ = request_context_getter_->GetURLRequestContext(); | 113 request_context_ = request_context_getter_->GetURLRequestContext(); |
114 request_context_getter_ = NULL; | 114 request_context_getter_ = NULL; |
115 DCHECK(request_context_); | 115 DCHECK(request_context_); |
116 } | 116 } |
117 | 117 |
118 blob_storage_host_.reset( | 118 blob_storage_host_.reset( |
119 new BlobStorageHost(blob_storage_context_->context())); | 119 new BlobStorageHost(blob_storage_context_->context())); |
120 | 120 |
121 operation_runner_ = context_->CreateFileSystemOperationRunner(); | 121 operation_runner_ = context_->CreateFileSystemOperationRunner(); |
122 } | 122 } |
123 | 123 |
124 void FileAPIMessageFilter::OnChannelClosing() { | 124 void FileAPIMessageFilter::OnChannelClosing() { |
125 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 125 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
126 | 126 |
127 // Unregister all the blob and stream URLs that are previously registered in | 127 // Unregister all the blob and stream URLs that are previously registered in |
128 // this process. | 128 // this process. |
129 blob_storage_host_.reset(); | 129 blob_storage_host_.reset(); |
130 for (base::hash_set<std::string>::const_iterator iter = stream_urls_.begin(); | 130 for (base::hash_set<std::string>::const_iterator iter = stream_urls_.begin(); |
131 iter != stream_urls_.end(); ++iter) { | 131 iter != stream_urls_.end(); ++iter) { |
132 stream_context_->registry()->UnregisterStream(GURL(*iter)); | 132 stream_context_->registry()->UnregisterStream(GURL(*iter)); |
133 } | 133 } |
134 | 134 |
135 in_transit_snapshot_files_.clear(); | 135 in_transit_snapshot_files_.clear(); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 FileAPIMessageFilter::~FileAPIMessageFilter() {} | 199 FileAPIMessageFilter::~FileAPIMessageFilter() {} |
200 | 200 |
201 void FileAPIMessageFilter::BadMessageReceived() { | 201 void FileAPIMessageFilter::BadMessageReceived() { |
202 RecordAction(base::UserMetricsAction("BadMessageTerminate_FAMF")); | 202 RecordAction(base::UserMetricsAction("BadMessageTerminate_FAMF")); |
203 BrowserMessageFilter::BadMessageReceived(); | 203 BrowserMessageFilter::BadMessageReceived(); |
204 } | 204 } |
205 | 205 |
206 void FileAPIMessageFilter::OnOpenFileSystem(int request_id, | 206 void FileAPIMessageFilter::OnOpenFileSystem(int request_id, |
207 const GURL& origin_url, | 207 const GURL& origin_url, |
208 storage::FileSystemType type) { | 208 storage::FileSystemType type) { |
209 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 209 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
210 if (type == storage::kFileSystemTypeTemporary) { | 210 if (type == storage::kFileSystemTypeTemporary) { |
211 RecordAction(base::UserMetricsAction("OpenFileSystemTemporary")); | 211 RecordAction(base::UserMetricsAction("OpenFileSystemTemporary")); |
212 } else if (type == storage::kFileSystemTypePersistent) { | 212 } else if (type == storage::kFileSystemTypePersistent) { |
213 RecordAction(base::UserMetricsAction("OpenFileSystemPersistent")); | 213 RecordAction(base::UserMetricsAction("OpenFileSystemPersistent")); |
214 } | 214 } |
215 storage::OpenFileSystemMode mode = | 215 storage::OpenFileSystemMode mode = |
216 storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT; | 216 storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT; |
217 context_->OpenFileSystem(origin_url, type, mode, base::Bind( | 217 context_->OpenFileSystem(origin_url, type, mode, base::Bind( |
218 &FileAPIMessageFilter::DidOpenFileSystem, this, request_id)); | 218 &FileAPIMessageFilter::DidOpenFileSystem, this, request_id)); |
219 } | 219 } |
220 | 220 |
221 void FileAPIMessageFilter::OnResolveURL( | 221 void FileAPIMessageFilter::OnResolveURL( |
222 int request_id, | 222 int request_id, |
223 const GURL& filesystem_url) { | 223 const GURL& filesystem_url) { |
224 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 224 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
225 FileSystemURL url(context_->CrackURL(filesystem_url)); | 225 FileSystemURL url(context_->CrackURL(filesystem_url)); |
226 if (!ValidateFileSystemURL(request_id, url)) | 226 if (!ValidateFileSystemURL(request_id, url)) |
227 return; | 227 return; |
228 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { | 228 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { |
229 Send(new FileSystemMsg_DidFail(request_id, | 229 Send(new FileSystemMsg_DidFail(request_id, |
230 base::File::FILE_ERROR_SECURITY)); | 230 base::File::FILE_ERROR_SECURITY)); |
231 return; | 231 return; |
232 } | 232 } |
233 | 233 |
234 context_->ResolveURL(url, base::Bind( | 234 context_->ResolveURL(url, base::Bind( |
235 &FileAPIMessageFilter::DidResolveURL, this, request_id)); | 235 &FileAPIMessageFilter::DidResolveURL, this, request_id)); |
236 } | 236 } |
237 | 237 |
238 void FileAPIMessageFilter::OnDeleteFileSystem(int request_id, | 238 void FileAPIMessageFilter::OnDeleteFileSystem(int request_id, |
239 const GURL& origin_url, | 239 const GURL& origin_url, |
240 storage::FileSystemType type) { | 240 storage::FileSystemType type) { |
241 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 241 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
242 context_->DeleteFileSystem(origin_url, type, base::Bind( | 242 context_->DeleteFileSystem(origin_url, type, base::Bind( |
243 &FileAPIMessageFilter::DidDeleteFileSystem, this, request_id)); | 243 &FileAPIMessageFilter::DidDeleteFileSystem, this, request_id)); |
244 } | 244 } |
245 | 245 |
246 void FileAPIMessageFilter::OnMove( | 246 void FileAPIMessageFilter::OnMove( |
247 int request_id, const GURL& src_path, const GURL& dest_path) { | 247 int request_id, const GURL& src_path, const GURL& dest_path) { |
248 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 248 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
249 FileSystemURL src_url(context_->CrackURL(src_path)); | 249 FileSystemURL src_url(context_->CrackURL(src_path)); |
250 FileSystemURL dest_url(context_->CrackURL(dest_path)); | 250 FileSystemURL dest_url(context_->CrackURL(dest_path)); |
251 if (!ValidateFileSystemURL(request_id, src_url) || | 251 if (!ValidateFileSystemURL(request_id, src_url) || |
252 !ValidateFileSystemURL(request_id, dest_url)) { | 252 !ValidateFileSystemURL(request_id, dest_url)) { |
253 return; | 253 return; |
254 } | 254 } |
255 if (!security_policy_->CanReadFileSystemFile(process_id_, src_url) || | 255 if (!security_policy_->CanReadFileSystemFile(process_id_, src_url) || |
256 !security_policy_->CanDeleteFileSystemFile(process_id_, src_url) || | 256 !security_policy_->CanDeleteFileSystemFile(process_id_, src_url) || |
257 !security_policy_->CanCreateFileSystemFile(process_id_, dest_url)) { | 257 !security_policy_->CanCreateFileSystemFile(process_id_, dest_url)) { |
258 Send(new FileSystemMsg_DidFail(request_id, | 258 Send(new FileSystemMsg_DidFail(request_id, |
259 base::File::FILE_ERROR_SECURITY)); | 259 base::File::FILE_ERROR_SECURITY)); |
260 return; | 260 return; |
261 } | 261 } |
262 | 262 |
263 operations_[request_id] = operation_runner()->Move( | 263 operations_[request_id] = operation_runner()->Move( |
264 src_url, | 264 src_url, |
265 dest_url, | 265 dest_url, |
266 storage::FileSystemOperation::OPTION_NONE, | 266 storage::FileSystemOperation::OPTION_NONE, |
267 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 267 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
268 } | 268 } |
269 | 269 |
270 void FileAPIMessageFilter::OnCopy( | 270 void FileAPIMessageFilter::OnCopy( |
271 int request_id, const GURL& src_path, const GURL& dest_path) { | 271 int request_id, const GURL& src_path, const GURL& dest_path) { |
272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 272 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
273 FileSystemURL src_url(context_->CrackURL(src_path)); | 273 FileSystemURL src_url(context_->CrackURL(src_path)); |
274 FileSystemURL dest_url(context_->CrackURL(dest_path)); | 274 FileSystemURL dest_url(context_->CrackURL(dest_path)); |
275 if (!ValidateFileSystemURL(request_id, src_url) || | 275 if (!ValidateFileSystemURL(request_id, src_url) || |
276 !ValidateFileSystemURL(request_id, dest_url)) { | 276 !ValidateFileSystemURL(request_id, dest_url)) { |
277 return; | 277 return; |
278 } | 278 } |
279 if (!security_policy_->CanReadFileSystemFile(process_id_, src_url) || | 279 if (!security_policy_->CanReadFileSystemFile(process_id_, src_url) || |
280 !security_policy_->CanCopyIntoFileSystemFile(process_id_, dest_url)) { | 280 !security_policy_->CanCopyIntoFileSystemFile(process_id_, dest_url)) { |
281 Send(new FileSystemMsg_DidFail(request_id, | 281 Send(new FileSystemMsg_DidFail(request_id, |
282 base::File::FILE_ERROR_SECURITY)); | 282 base::File::FILE_ERROR_SECURITY)); |
283 return; | 283 return; |
284 } | 284 } |
285 | 285 |
286 operations_[request_id] = operation_runner()->Copy( | 286 operations_[request_id] = operation_runner()->Copy( |
287 src_url, | 287 src_url, |
288 dest_url, | 288 dest_url, |
289 storage::FileSystemOperation::OPTION_NONE, | 289 storage::FileSystemOperation::OPTION_NONE, |
290 storage::FileSystemOperationRunner::CopyProgressCallback(), | 290 storage::FileSystemOperationRunner::CopyProgressCallback(), |
291 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 291 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
292 } | 292 } |
293 | 293 |
294 void FileAPIMessageFilter::OnRemove( | 294 void FileAPIMessageFilter::OnRemove( |
295 int request_id, const GURL& path, bool recursive) { | 295 int request_id, const GURL& path, bool recursive) { |
296 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 296 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
297 FileSystemURL url(context_->CrackURL(path)); | 297 FileSystemURL url(context_->CrackURL(path)); |
298 if (!ValidateFileSystemURL(request_id, url)) | 298 if (!ValidateFileSystemURL(request_id, url)) |
299 return; | 299 return; |
300 if (!security_policy_->CanDeleteFileSystemFile(process_id_, url)) { | 300 if (!security_policy_->CanDeleteFileSystemFile(process_id_, url)) { |
301 Send(new FileSystemMsg_DidFail(request_id, | 301 Send(new FileSystemMsg_DidFail(request_id, |
302 base::File::FILE_ERROR_SECURITY)); | 302 base::File::FILE_ERROR_SECURITY)); |
303 return; | 303 return; |
304 } | 304 } |
305 | 305 |
306 operations_[request_id] = operation_runner()->Remove( | 306 operations_[request_id] = operation_runner()->Remove( |
307 url, recursive, | 307 url, recursive, |
308 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 308 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
309 } | 309 } |
310 | 310 |
311 void FileAPIMessageFilter::OnReadMetadata( | 311 void FileAPIMessageFilter::OnReadMetadata( |
312 int request_id, const GURL& path) { | 312 int request_id, const GURL& path) { |
313 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 313 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
314 FileSystemURL url(context_->CrackURL(path)); | 314 FileSystemURL url(context_->CrackURL(path)); |
315 if (!ValidateFileSystemURL(request_id, url)) | 315 if (!ValidateFileSystemURL(request_id, url)) |
316 return; | 316 return; |
317 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { | 317 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { |
318 Send(new FileSystemMsg_DidFail(request_id, | 318 Send(new FileSystemMsg_DidFail(request_id, |
319 base::File::FILE_ERROR_SECURITY)); | 319 base::File::FILE_ERROR_SECURITY)); |
320 return; | 320 return; |
321 } | 321 } |
322 | 322 |
323 operations_[request_id] = operation_runner()->GetMetadata( | 323 operations_[request_id] = operation_runner()->GetMetadata( |
324 url, base::Bind(&FileAPIMessageFilter::DidGetMetadata, this, request_id)); | 324 url, base::Bind(&FileAPIMessageFilter::DidGetMetadata, this, request_id)); |
325 } | 325 } |
326 | 326 |
327 void FileAPIMessageFilter::OnCreate( | 327 void FileAPIMessageFilter::OnCreate( |
328 int request_id, const GURL& path, bool exclusive, | 328 int request_id, const GURL& path, bool exclusive, |
329 bool is_directory, bool recursive) { | 329 bool is_directory, bool recursive) { |
330 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 330 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
331 FileSystemURL url(context_->CrackURL(path)); | 331 FileSystemURL url(context_->CrackURL(path)); |
332 if (!ValidateFileSystemURL(request_id, url)) | 332 if (!ValidateFileSystemURL(request_id, url)) |
333 return; | 333 return; |
334 if (!security_policy_->CanCreateFileSystemFile(process_id_, url)) { | 334 if (!security_policy_->CanCreateFileSystemFile(process_id_, url)) { |
335 Send(new FileSystemMsg_DidFail(request_id, | 335 Send(new FileSystemMsg_DidFail(request_id, |
336 base::File::FILE_ERROR_SECURITY)); | 336 base::File::FILE_ERROR_SECURITY)); |
337 return; | 337 return; |
338 } | 338 } |
339 | 339 |
340 if (is_directory) { | 340 if (is_directory) { |
341 operations_[request_id] = operation_runner()->CreateDirectory( | 341 operations_[request_id] = operation_runner()->CreateDirectory( |
342 url, exclusive, recursive, | 342 url, exclusive, recursive, |
343 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 343 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
344 } else { | 344 } else { |
345 operations_[request_id] = operation_runner()->CreateFile( | 345 operations_[request_id] = operation_runner()->CreateFile( |
346 url, exclusive, | 346 url, exclusive, |
347 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 347 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
348 } | 348 } |
349 } | 349 } |
350 | 350 |
351 void FileAPIMessageFilter::OnExists( | 351 void FileAPIMessageFilter::OnExists( |
352 int request_id, const GURL& path, bool is_directory) { | 352 int request_id, const GURL& path, bool is_directory) { |
353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 353 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
354 FileSystemURL url(context_->CrackURL(path)); | 354 FileSystemURL url(context_->CrackURL(path)); |
355 if (!ValidateFileSystemURL(request_id, url)) | 355 if (!ValidateFileSystemURL(request_id, url)) |
356 return; | 356 return; |
357 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { | 357 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { |
358 Send(new FileSystemMsg_DidFail(request_id, | 358 Send(new FileSystemMsg_DidFail(request_id, |
359 base::File::FILE_ERROR_SECURITY)); | 359 base::File::FILE_ERROR_SECURITY)); |
360 return; | 360 return; |
361 } | 361 } |
362 | 362 |
363 if (is_directory) { | 363 if (is_directory) { |
364 operations_[request_id] = operation_runner()->DirectoryExists( | 364 operations_[request_id] = operation_runner()->DirectoryExists( |
365 url, | 365 url, |
366 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 366 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
367 } else { | 367 } else { |
368 operations_[request_id] = operation_runner()->FileExists( | 368 operations_[request_id] = operation_runner()->FileExists( |
369 url, | 369 url, |
370 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 370 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
371 } | 371 } |
372 } | 372 } |
373 | 373 |
374 void FileAPIMessageFilter::OnReadDirectory( | 374 void FileAPIMessageFilter::OnReadDirectory( |
375 int request_id, const GURL& path) { | 375 int request_id, const GURL& path) { |
376 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 376 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
377 FileSystemURL url(context_->CrackURL(path)); | 377 FileSystemURL url(context_->CrackURL(path)); |
378 if (!ValidateFileSystemURL(request_id, url)) | 378 if (!ValidateFileSystemURL(request_id, url)) |
379 return; | 379 return; |
380 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { | 380 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { |
381 Send(new FileSystemMsg_DidFail(request_id, | 381 Send(new FileSystemMsg_DidFail(request_id, |
382 base::File::FILE_ERROR_SECURITY)); | 382 base::File::FILE_ERROR_SECURITY)); |
383 return; | 383 return; |
384 } | 384 } |
385 | 385 |
386 operations_[request_id] = operation_runner()->ReadDirectory( | 386 operations_[request_id] = operation_runner()->ReadDirectory( |
387 url, base::Bind(&FileAPIMessageFilter::DidReadDirectory, | 387 url, base::Bind(&FileAPIMessageFilter::DidReadDirectory, |
388 this, request_id)); | 388 this, request_id)); |
389 } | 389 } |
390 | 390 |
391 void FileAPIMessageFilter::OnWrite( | 391 void FileAPIMessageFilter::OnWrite( |
392 int request_id, | 392 int request_id, |
393 const GURL& path, | 393 const GURL& path, |
394 const std::string& blob_uuid, | 394 const std::string& blob_uuid, |
395 int64 offset) { | 395 int64 offset) { |
396 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 396 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
397 if (!request_context_) { | 397 if (!request_context_) { |
398 // We can't write w/o a request context, trying to do so will crash. | 398 // We can't write w/o a request context, trying to do so will crash. |
399 NOTREACHED(); | 399 NOTREACHED(); |
400 return; | 400 return; |
401 } | 401 } |
402 | 402 |
403 FileSystemURL url(context_->CrackURL(path)); | 403 FileSystemURL url(context_->CrackURL(path)); |
404 if (!ValidateFileSystemURL(request_id, url)) | 404 if (!ValidateFileSystemURL(request_id, url)) |
405 return; | 405 return; |
406 if (!security_policy_->CanWriteFileSystemFile(process_id_, url)) { | 406 if (!security_policy_->CanWriteFileSystemFile(process_id_, url)) { |
(...skipping 26 matching lines...) Expand all Loading... |
433 operations_[request_id] = operation_runner()->Truncate( | 433 operations_[request_id] = operation_runner()->Truncate( |
434 url, length, | 434 url, length, |
435 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 435 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
436 } | 436 } |
437 | 437 |
438 void FileAPIMessageFilter::OnTouchFile( | 438 void FileAPIMessageFilter::OnTouchFile( |
439 int request_id, | 439 int request_id, |
440 const GURL& path, | 440 const GURL& path, |
441 const base::Time& last_access_time, | 441 const base::Time& last_access_time, |
442 const base::Time& last_modified_time) { | 442 const base::Time& last_modified_time) { |
443 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 443 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
444 FileSystemURL url(context_->CrackURL(path)); | 444 FileSystemURL url(context_->CrackURL(path)); |
445 if (!ValidateFileSystemURL(request_id, url)) | 445 if (!ValidateFileSystemURL(request_id, url)) |
446 return; | 446 return; |
447 if (!security_policy_->CanCreateFileSystemFile(process_id_, url)) { | 447 if (!security_policy_->CanCreateFileSystemFile(process_id_, url)) { |
448 Send(new FileSystemMsg_DidFail(request_id, | 448 Send(new FileSystemMsg_DidFail(request_id, |
449 base::File::FILE_ERROR_SECURITY)); | 449 base::File::FILE_ERROR_SECURITY)); |
450 return; | 450 return; |
451 } | 451 } |
452 | 452 |
453 operations_[request_id] = operation_runner()->TouchFile( | 453 operations_[request_id] = operation_runner()->TouchFile( |
454 url, last_access_time, last_modified_time, | 454 url, last_access_time, last_modified_time, |
455 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 455 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
456 } | 456 } |
457 | 457 |
458 void FileAPIMessageFilter::OnCancel( | 458 void FileAPIMessageFilter::OnCancel( |
459 int request_id, | 459 int request_id, |
460 int request_id_to_cancel) { | 460 int request_id_to_cancel) { |
461 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 461 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
462 | 462 |
463 OperationsMap::iterator found = operations_.find(request_id_to_cancel); | 463 OperationsMap::iterator found = operations_.find(request_id_to_cancel); |
464 if (found != operations_.end()) { | 464 if (found != operations_.end()) { |
465 // The cancel will eventually send both the write failure and the cancel | 465 // The cancel will eventually send both the write failure and the cancel |
466 // success. | 466 // success. |
467 operation_runner()->Cancel( | 467 operation_runner()->Cancel( |
468 found->second, | 468 found->second, |
469 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); | 469 base::Bind(&FileAPIMessageFilter::DidFinish, this, request_id)); |
470 } else { | 470 } else { |
471 // The write already finished; report that we failed to stop it. | 471 // The write already finished; report that we failed to stop it. |
472 Send(new FileSystemMsg_DidFail( | 472 Send(new FileSystemMsg_DidFail( |
473 request_id, base::File::FILE_ERROR_INVALID_OPERATION)); | 473 request_id, base::File::FILE_ERROR_INVALID_OPERATION)); |
474 } | 474 } |
475 } | 475 } |
476 | 476 |
477 void FileAPIMessageFilter::OnSyncGetPlatformPath( | 477 void FileAPIMessageFilter::OnSyncGetPlatformPath( |
478 const GURL& path, base::FilePath* platform_path) { | 478 const GURL& path, base::FilePath* platform_path) { |
479 SyncGetPlatformPath(context_, process_id_, path, platform_path); | 479 SyncGetPlatformPath(context_, process_id_, path, platform_path); |
480 } | 480 } |
481 | 481 |
482 void FileAPIMessageFilter::OnCreateSnapshotFile( | 482 void FileAPIMessageFilter::OnCreateSnapshotFile( |
483 int request_id, const GURL& path) { | 483 int request_id, const GURL& path) { |
484 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 484 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
485 FileSystemURL url(context_->CrackURL(path)); | 485 FileSystemURL url(context_->CrackURL(path)); |
486 | 486 |
487 // Make sure if this file can be read by the renderer as this is | 487 // Make sure if this file can be read by the renderer as this is |
488 // called when the renderer is about to create a new File object | 488 // called when the renderer is about to create a new File object |
489 // (for reading the file). | 489 // (for reading the file). |
490 if (!ValidateFileSystemURL(request_id, url)) | 490 if (!ValidateFileSystemURL(request_id, url)) |
491 return; | 491 return; |
492 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { | 492 if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { |
493 Send(new FileSystemMsg_DidFail(request_id, | 493 Send(new FileSystemMsg_DidFail(request_id, |
494 base::File::FILE_ERROR_SECURITY)); | 494 base::File::FILE_ERROR_SECURITY)); |
495 return; | 495 return; |
496 } | 496 } |
497 | 497 |
498 FileSystemBackend* backend = context_->GetFileSystemBackend(url.type()); | 498 FileSystemBackend* backend = context_->GetFileSystemBackend(url.type()); |
499 if (backend->SupportsStreaming(url)) { | 499 if (backend->SupportsStreaming(url)) { |
500 operations_[request_id] = operation_runner()->GetMetadata( | 500 operations_[request_id] = operation_runner()->GetMetadata( |
501 url, | 501 url, |
502 base::Bind(&FileAPIMessageFilter::DidGetMetadataForStreaming, | 502 base::Bind(&FileAPIMessageFilter::DidGetMetadataForStreaming, |
503 this, request_id)); | 503 this, request_id)); |
504 } else { | 504 } else { |
505 operations_[request_id] = operation_runner()->CreateSnapshotFile( | 505 operations_[request_id] = operation_runner()->CreateSnapshotFile( |
506 url, | 506 url, |
507 base::Bind(&FileAPIMessageFilter::DidCreateSnapshot, | 507 base::Bind(&FileAPIMessageFilter::DidCreateSnapshot, |
508 this, request_id, url)); | 508 this, request_id, url)); |
509 } | 509 } |
510 } | 510 } |
511 | 511 |
512 void FileAPIMessageFilter::OnDidReceiveSnapshotFile(int request_id) { | 512 void FileAPIMessageFilter::OnDidReceiveSnapshotFile(int request_id) { |
513 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 513 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
514 in_transit_snapshot_files_.erase(request_id); | 514 in_transit_snapshot_files_.erase(request_id); |
515 } | 515 } |
516 | 516 |
517 void FileAPIMessageFilter::OnStartBuildingBlob(const std::string& uuid) { | 517 void FileAPIMessageFilter::OnStartBuildingBlob(const std::string& uuid) { |
518 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 518 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
519 ignore_result(blob_storage_host_->StartBuildingBlob(uuid)); | 519 ignore_result(blob_storage_host_->StartBuildingBlob(uuid)); |
520 } | 520 } |
521 | 521 |
522 void FileAPIMessageFilter::OnAppendBlobDataItemToBlob( | 522 void FileAPIMessageFilter::OnAppendBlobDataItemToBlob( |
523 const std::string& uuid, | 523 const std::string& uuid, |
524 const storage::DataElement& item) { | 524 const storage::DataElement& item) { |
525 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 525 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
526 if (item.type() == storage::DataElement::TYPE_FILE_FILESYSTEM) { | 526 if (item.type() == storage::DataElement::TYPE_FILE_FILESYSTEM) { |
527 FileSystemURL filesystem_url(context_->CrackURL(item.filesystem_url())); | 527 FileSystemURL filesystem_url(context_->CrackURL(item.filesystem_url())); |
528 if (!FileSystemURLIsValid(context_, filesystem_url) || | 528 if (!FileSystemURLIsValid(context_, filesystem_url) || |
529 !security_policy_->CanReadFileSystemFile(process_id_, filesystem_url)) { | 529 !security_policy_->CanReadFileSystemFile(process_id_, filesystem_url)) { |
530 ignore_result(blob_storage_host_->CancelBuildingBlob(uuid)); | 530 ignore_result(blob_storage_host_->CancelBuildingBlob(uuid)); |
531 return; | 531 return; |
532 } | 532 } |
533 } | 533 } |
534 if (item.type() == storage::DataElement::TYPE_FILE && | 534 if (item.type() == storage::DataElement::TYPE_FILE && |
535 !security_policy_->CanReadFile(process_id_, item.path())) { | 535 !security_policy_->CanReadFile(process_id_, item.path())) { |
(...skipping 27 matching lines...) Expand all Loading... |
563 } | 563 } |
564 | 564 |
565 storage::DataElement item; | 565 storage::DataElement item; |
566 item.SetToSharedBytes(static_cast<char*>(shared_memory.memory()), | 566 item.SetToSharedBytes(static_cast<char*>(shared_memory.memory()), |
567 buffer_size); | 567 buffer_size); |
568 ignore_result(blob_storage_host_->AppendBlobDataItem(uuid, item)); | 568 ignore_result(blob_storage_host_->AppendBlobDataItem(uuid, item)); |
569 } | 569 } |
570 | 570 |
571 void FileAPIMessageFilter::OnFinishBuildingBlob( | 571 void FileAPIMessageFilter::OnFinishBuildingBlob( |
572 const std::string& uuid, const std::string& content_type) { | 572 const std::string& uuid, const std::string& content_type) { |
573 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 573 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
574 ignore_result(blob_storage_host_->FinishBuildingBlob(uuid, content_type)); | 574 ignore_result(blob_storage_host_->FinishBuildingBlob(uuid, content_type)); |
575 // TODO(michaeln): check return values once blink has migrated, crbug/174200 | 575 // TODO(michaeln): check return values once blink has migrated, crbug/174200 |
576 } | 576 } |
577 | 577 |
578 void FileAPIMessageFilter::OnIncrementBlobRefCount(const std::string& uuid) { | 578 void FileAPIMessageFilter::OnIncrementBlobRefCount(const std::string& uuid) { |
579 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 579 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
580 ignore_result(blob_storage_host_->IncrementBlobRefCount(uuid)); | 580 ignore_result(blob_storage_host_->IncrementBlobRefCount(uuid)); |
581 } | 581 } |
582 | 582 |
583 void FileAPIMessageFilter::OnDecrementBlobRefCount(const std::string& uuid) { | 583 void FileAPIMessageFilter::OnDecrementBlobRefCount(const std::string& uuid) { |
584 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 584 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
585 ignore_result(blob_storage_host_->DecrementBlobRefCount(uuid)); | 585 ignore_result(blob_storage_host_->DecrementBlobRefCount(uuid)); |
586 } | 586 } |
587 | 587 |
588 void FileAPIMessageFilter::OnRegisterPublicBlobURL( | 588 void FileAPIMessageFilter::OnRegisterPublicBlobURL( |
589 const GURL& public_url, const std::string& uuid) { | 589 const GURL& public_url, const std::string& uuid) { |
590 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 590 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
591 ignore_result(blob_storage_host_->RegisterPublicBlobURL(public_url, uuid)); | 591 ignore_result(blob_storage_host_->RegisterPublicBlobURL(public_url, uuid)); |
592 } | 592 } |
593 | 593 |
594 void FileAPIMessageFilter::OnRevokePublicBlobURL(const GURL& public_url) { | 594 void FileAPIMessageFilter::OnRevokePublicBlobURL(const GURL& public_url) { |
595 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 595 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
596 ignore_result(blob_storage_host_->RevokePublicBlobURL(public_url)); | 596 ignore_result(blob_storage_host_->RevokePublicBlobURL(public_url)); |
597 } | 597 } |
598 | 598 |
599 void FileAPIMessageFilter::OnStartBuildingStream( | 599 void FileAPIMessageFilter::OnStartBuildingStream( |
600 const GURL& url, const std::string& content_type) { | 600 const GURL& url, const std::string& content_type) { |
601 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 601 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
602 // Only an internal Blob URL is expected here. See the BlobURL of the Blink. | 602 // Only an internal Blob URL is expected here. See the BlobURL of the Blink. |
603 if (!StartsWithASCII( | 603 if (!StartsWithASCII( |
604 url.path(), "blobinternal%3A///", true /* case_sensitive */)) { | 604 url.path(), "blobinternal%3A///", true /* case_sensitive */)) { |
605 NOTREACHED() << "Malformed Stream URL: " << url.spec(); | 605 NOTREACHED() << "Malformed Stream URL: " << url.spec(); |
606 BadMessageReceived(); | 606 BadMessageReceived(); |
607 return; | 607 return; |
608 } | 608 } |
609 // Use an empty security origin for now. Stream accepts a security origin | 609 // Use an empty security origin for now. Stream accepts a security origin |
610 // but how it's handled is not fixed yet. | 610 // but how it's handled is not fixed yet. |
611 new Stream(stream_context_->registry(), | 611 new Stream(stream_context_->registry(), |
612 NULL /* write_observer */, | 612 NULL /* write_observer */, |
613 url); | 613 url); |
614 stream_urls_.insert(url.spec()); | 614 stream_urls_.insert(url.spec()); |
615 } | 615 } |
616 | 616 |
617 void FileAPIMessageFilter::OnAppendBlobDataItemToStream( | 617 void FileAPIMessageFilter::OnAppendBlobDataItemToStream( |
618 const GURL& url, | 618 const GURL& url, |
619 const storage::DataElement& item) { | 619 const storage::DataElement& item) { |
620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 620 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
621 | 621 |
622 scoped_refptr<Stream> stream(GetStreamForURL(url)); | 622 scoped_refptr<Stream> stream(GetStreamForURL(url)); |
623 // Stream instances may be deleted on error. Just abort if there's no Stream | 623 // Stream instances may be deleted on error. Just abort if there's no Stream |
624 // instance for |url| in the registry. | 624 // instance for |url| in the registry. |
625 if (!stream.get()) | 625 if (!stream.get()) |
626 return; | 626 return; |
627 | 627 |
628 // Data for stream is delivered as TYPE_BYTES item. | 628 // Data for stream is delivered as TYPE_BYTES item. |
629 if (item.type() != storage::DataElement::TYPE_BYTES) { | 629 if (item.type() != storage::DataElement::TYPE_BYTES) { |
630 BadMessageReceived(); | 630 BadMessageReceived(); |
(...skipping 20 matching lines...) Expand all Loading... |
651 } | 651 } |
652 | 652 |
653 scoped_refptr<Stream> stream(GetStreamForURL(url)); | 653 scoped_refptr<Stream> stream(GetStreamForURL(url)); |
654 if (!stream.get()) | 654 if (!stream.get()) |
655 return; | 655 return; |
656 | 656 |
657 stream->AddData(static_cast<char*>(shared_memory.memory()), buffer_size); | 657 stream->AddData(static_cast<char*>(shared_memory.memory()), buffer_size); |
658 } | 658 } |
659 | 659 |
660 void FileAPIMessageFilter::OnFlushStream(const GURL& url) { | 660 void FileAPIMessageFilter::OnFlushStream(const GURL& url) { |
661 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 661 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
662 scoped_refptr<Stream> stream(GetStreamForURL(url)); | 662 scoped_refptr<Stream> stream(GetStreamForURL(url)); |
663 if (stream.get()) | 663 if (stream.get()) |
664 stream->Flush(); | 664 stream->Flush(); |
665 } | 665 } |
666 | 666 |
667 void FileAPIMessageFilter::OnFinishBuildingStream(const GURL& url) { | 667 void FileAPIMessageFilter::OnFinishBuildingStream(const GURL& url) { |
668 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 668 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
669 scoped_refptr<Stream> stream(GetStreamForURL(url)); | 669 scoped_refptr<Stream> stream(GetStreamForURL(url)); |
670 if (stream.get()) | 670 if (stream.get()) |
671 stream->Finalize(); | 671 stream->Finalize(); |
672 } | 672 } |
673 | 673 |
674 void FileAPIMessageFilter::OnAbortBuildingStream(const GURL& url) { | 674 void FileAPIMessageFilter::OnAbortBuildingStream(const GURL& url) { |
675 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 675 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
676 scoped_refptr<Stream> stream(GetStreamForURL(url)); | 676 scoped_refptr<Stream> stream(GetStreamForURL(url)); |
677 if (stream.get()) | 677 if (stream.get()) |
678 stream->Abort(); | 678 stream->Abort(); |
679 } | 679 } |
680 | 680 |
681 void FileAPIMessageFilter::OnCloneStream( | 681 void FileAPIMessageFilter::OnCloneStream( |
682 const GURL& url, const GURL& src_url) { | 682 const GURL& url, const GURL& src_url) { |
683 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 683 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
684 // Abort if there's no Stream instance for |src_url| (source Stream which | 684 // Abort if there's no Stream instance for |src_url| (source Stream which |
685 // we're going to make |url| point to) in the registry. | 685 // we're going to make |url| point to) in the registry. |
686 if (!GetStreamForURL(src_url).get()) | 686 if (!GetStreamForURL(src_url).get()) |
687 return; | 687 return; |
688 | 688 |
689 stream_context_->registry()->CloneStream(url, src_url); | 689 stream_context_->registry()->CloneStream(url, src_url); |
690 stream_urls_.insert(url.spec()); | 690 stream_urls_.insert(url.spec()); |
691 } | 691 } |
692 | 692 |
693 void FileAPIMessageFilter::OnRemoveStream(const GURL& url) { | 693 void FileAPIMessageFilter::OnRemoveStream(const GURL& url) { |
694 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 694 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
695 | 695 |
696 if (!GetStreamForURL(url).get()) | 696 if (!GetStreamForURL(url).get()) |
697 return; | 697 return; |
698 | 698 |
699 stream_context_->registry()->UnregisterStream(url); | 699 stream_context_->registry()->UnregisterStream(url); |
700 stream_urls_.erase(url.spec()); | 700 stream_urls_.erase(url.spec()); |
701 } | 701 } |
702 | 702 |
703 void FileAPIMessageFilter::DidFinish(int request_id, | 703 void FileAPIMessageFilter::DidFinish(int request_id, |
704 base::File::Error result) { | 704 base::File::Error result) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 } else { | 762 } else { |
763 Send(new FileSystemMsg_DidFail(request_id, result)); | 763 Send(new FileSystemMsg_DidFail(request_id, result)); |
764 operations_.erase(request_id); | 764 operations_.erase(request_id); |
765 } | 765 } |
766 } | 766 } |
767 | 767 |
768 void FileAPIMessageFilter::DidOpenFileSystem(int request_id, | 768 void FileAPIMessageFilter::DidOpenFileSystem(int request_id, |
769 const GURL& root, | 769 const GURL& root, |
770 const std::string& filesystem_name, | 770 const std::string& filesystem_name, |
771 base::File::Error result) { | 771 base::File::Error result) { |
772 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 772 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
773 if (result == base::File::FILE_OK) { | 773 if (result == base::File::FILE_OK) { |
774 DCHECK(root.is_valid()); | 774 DCHECK(root.is_valid()); |
775 Send(new FileSystemMsg_DidOpenFileSystem( | 775 Send(new FileSystemMsg_DidOpenFileSystem( |
776 request_id, filesystem_name, root)); | 776 request_id, filesystem_name, root)); |
777 } else { | 777 } else { |
778 Send(new FileSystemMsg_DidFail(request_id, result)); | 778 Send(new FileSystemMsg_DidFail(request_id, result)); |
779 } | 779 } |
780 // For OpenFileSystem we do not create a new operation, so no unregister here. | 780 // For OpenFileSystem we do not create a new operation, so no unregister here. |
781 } | 781 } |
782 | 782 |
783 void FileAPIMessageFilter::DidResolveURL( | 783 void FileAPIMessageFilter::DidResolveURL( |
784 int request_id, | 784 int request_id, |
785 base::File::Error result, | 785 base::File::Error result, |
786 const storage::FileSystemInfo& info, | 786 const storage::FileSystemInfo& info, |
787 const base::FilePath& file_path, | 787 const base::FilePath& file_path, |
788 storage::FileSystemContext::ResolvedEntryType type) { | 788 storage::FileSystemContext::ResolvedEntryType type) { |
789 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 789 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
790 if (result == base::File::FILE_OK && | 790 if (result == base::File::FILE_OK && |
791 type == storage::FileSystemContext::RESOLVED_ENTRY_NOT_FOUND) | 791 type == storage::FileSystemContext::RESOLVED_ENTRY_NOT_FOUND) |
792 result = base::File::FILE_ERROR_NOT_FOUND; | 792 result = base::File::FILE_ERROR_NOT_FOUND; |
793 | 793 |
794 if (result == base::File::FILE_OK) { | 794 if (result == base::File::FILE_OK) { |
795 DCHECK(info.root_url.is_valid()); | 795 DCHECK(info.root_url.is_valid()); |
796 Send(new FileSystemMsg_DidResolveURL( | 796 Send(new FileSystemMsg_DidResolveURL( |
797 request_id, | 797 request_id, |
798 info, | 798 info, |
799 file_path, | 799 file_path, |
(...skipping 15 matching lines...) Expand all Loading... |
815 // so no unregister here. | 815 // so no unregister here. |
816 } | 816 } |
817 | 817 |
818 void FileAPIMessageFilter::DidCreateSnapshot( | 818 void FileAPIMessageFilter::DidCreateSnapshot( |
819 int request_id, | 819 int request_id, |
820 const storage::FileSystemURL& url, | 820 const storage::FileSystemURL& url, |
821 base::File::Error result, | 821 base::File::Error result, |
822 const base::File::Info& info, | 822 const base::File::Info& info, |
823 const base::FilePath& platform_path, | 823 const base::FilePath& platform_path, |
824 const scoped_refptr<storage::ShareableFileReference>& /* unused */) { | 824 const scoped_refptr<storage::ShareableFileReference>& /* unused */) { |
825 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 825 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
826 operations_.erase(request_id); | 826 operations_.erase(request_id); |
827 | 827 |
828 if (result != base::File::FILE_OK) { | 828 if (result != base::File::FILE_OK) { |
829 Send(new FileSystemMsg_DidFail(request_id, result)); | 829 Send(new FileSystemMsg_DidFail(request_id, result)); |
830 return; | 830 return; |
831 } | 831 } |
832 | 832 |
833 scoped_refptr<storage::ShareableFileReference> file_ref = | 833 scoped_refptr<storage::ShareableFileReference> file_ref = |
834 storage::ShareableFileReference::Get(platform_path); | 834 storage::ShareableFileReference::Get(platform_path); |
835 if (!security_policy_->CanReadFile(process_id_, platform_path)) { | 835 if (!security_policy_->CanReadFile(process_id_, platform_path)) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 } | 883 } |
884 | 884 |
885 return true; | 885 return true; |
886 } | 886 } |
887 | 887 |
888 scoped_refptr<Stream> FileAPIMessageFilter::GetStreamForURL(const GURL& url) { | 888 scoped_refptr<Stream> FileAPIMessageFilter::GetStreamForURL(const GURL& url) { |
889 return stream_context_->registry()->GetStream(url); | 889 return stream_context_->registry()->GetStream(url); |
890 } | 890 } |
891 | 891 |
892 } // namespace content | 892 } // namespace content |
OLD | NEW |