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

Unified Diff: content/browser/fileapi/fileapi_message_filter.cc

Issue 14472008: [FileAPI] Add file open ID and close callback (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/fileapi/fileapi_message_filter.h ('k') | content/common/fileapi/file_system_dispatcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/fileapi/fileapi_message_filter.cc
diff --git a/content/browser/fileapi/fileapi_message_filter.cc b/content/browser/fileapi/fileapi_message_filter.cc
index 04ec7b9ecc3c17a9f68b35c0a551ed652cfc3ec1..966490eb7d498c74ec74205e915c931c7c701504 100644
--- a/content/browser/fileapi/fileapi_message_filter.cc
+++ b/content/browser/fileapi/fileapi_message_filter.cc
@@ -111,20 +111,18 @@ void FileAPIMessageFilter::OnChannelClosing() {
in_transit_snapshot_files_.clear();
// Close all files that are previously OpenFile()'ed in this process.
- if (!open_filesystem_urls_.empty()) {
+ if (!on_close_callbacks_.IsEmpty()) {
DLOG(INFO)
<< "File API: Renderer process shut down before NotifyCloseFile"
- << " for " << open_filesystem_urls_.size() << " files opened in PPAPI";
+ << " for " << on_close_callbacks_.size() << " files opened in PPAPI";
}
- for (std::multiset<GURL>::const_iterator iter =
- open_filesystem_urls_.begin();
- iter != open_filesystem_urls_.end(); ++iter) {
- FileSystemURL url(context_->CrackURL(*iter));
- FileSystemOperation* operation = context_->CreateFileSystemOperation(
- url, NULL);
- if (operation)
- operation->NotifyCloseFile(url);
+
+ for (OnCloseCallbackMap::iterator itr(&on_close_callbacks_);
+ !itr.IsAtEnd(); itr.Advance()) {
+ itr.GetCurrentValue()->Run();
}
+
+ on_close_callbacks_.Clear();
}
void FileAPIMessageFilter::OverrideThreadForMessage(
@@ -470,27 +468,21 @@ void FileAPIMessageFilter::OnOpenFile(
return;
operation->OpenFile(
url, file_flags, peer_handle(),
- base::Bind(&FileAPIMessageFilter::DidOpenFile, this, request_id, path,
+ base::Bind(&FileAPIMessageFilter::DidOpenFile, this, request_id,
quota_policy));
}
-void FileAPIMessageFilter::OnNotifyCloseFile(const GURL& path) {
+void FileAPIMessageFilter::OnNotifyCloseFile(int file_open_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- // Remove |path| from the set of opened urls. It must only be called for a URL
- // that is successfully opened and enrolled in DidOpenFile.
- std::multiset<GURL>::iterator iter = open_filesystem_urls_.find(path);
- DCHECK(iter != open_filesystem_urls_.end());
- open_filesystem_urls_.erase(iter);
-
- FileSystemURL url(context_->CrackURL(path));
-
- // Do not use GetNewOperation() here, because NotifyCloseFile is a one-way
- // operation that does not have request_id by which we respond back.
- FileSystemOperation* operation = context_->CreateFileSystemOperation(
- url, NULL);
- if (operation)
- operation->NotifyCloseFile(url);
+ // Remove |file_open_id| from the map of |on_close_callback|s.
+ // It must only be called for a ID that is successfully opened and enrolled in
+ // DidOpenFile.
+ base::Closure* on_close_callback = on_close_callbacks_.Lookup(file_open_id);
+ if (on_close_callback && !on_close_callback->is_null()) {
+ on_close_callback->Run();
+ on_close_callbacks_.Remove(file_open_id);
+ }
}
void FileAPIMessageFilter::OnWillUpdate(const GURL& path) {
@@ -668,20 +660,22 @@ void FileAPIMessageFilter::DidReadDirectory(
}
void FileAPIMessageFilter::DidOpenFile(int request_id,
- const GURL& path,
quota::QuotaLimitType quota_policy,
base::PlatformFileError result,
base::PlatformFile file,
+ const base::Closure& on_close_callback,
base::ProcessHandle peer_handle) {
if (result == base::PLATFORM_FILE_OK) {
IPC::PlatformFileForTransit file_for_transit =
file != base::kInvalidPlatformFileValue ?
IPC::GetFileHandleForProcess(file, peer_handle, true) :
IPC::InvalidPlatformFileForTransit();
- open_filesystem_urls_.insert(path);
+ int file_open_id = on_close_callbacks_.Add(
+ new base::Closure(on_close_callback));
Send(new FileSystemMsg_DidOpenFile(request_id,
file_for_transit,
+ file_open_id,
quota_policy));
} else {
Send(new FileSystemMsg_DidFail(request_id,
« no previous file with comments | « content/browser/fileapi/fileapi_message_filter.h ('k') | content/common/fileapi/file_system_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698