Index: chrome/browser/chromeos/extensions/file_browser_private_api.cc |
diff --git a/chrome/browser/chromeos/extensions/file_browser_private_api.cc b/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
index 57c700d77e3ae81402a9e016b5ec08bd4d5634d2..819685c2d38c39c409b8df61a69bac215625219e 100644 |
--- a/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
+++ b/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
@@ -590,7 +590,7 @@ class ExecuteTasksFileBrowserFunction::Executor: public FileTaskExecutor { |
protected: |
// FileTaskExecutor overrides. |
virtual Browser* browser() { return function_->GetCurrentBrowser(); } |
- virtual void Done(bool success) { function_->SendResponse(success); } |
+ virtual void Done(bool success) { function_->OnTaskExecuted(success); } |
private: |
scoped_refptr<ExecuteTasksFileBrowserFunction> function_; |
@@ -635,15 +635,27 @@ bool ExecuteTasksFileBrowserFunction::RunImpl() { |
file_urls.push_back(GURL(origin_file_url)); |
} |
- scoped_refptr<Executor> executor = |
- new Executor(profile(), source_url(), extension_id, action_id, this); |
- if (!executor->Execute(file_urls)) |
+ executor_ = new Executor(profile(), source_url(), extension_id, action_id, |
+ this); |
+ |
+ if (!executor_->Execute(file_urls)) { |
+ // Executor has our reference, so we have to unref it if we don't want to |
+ // leak. |
+ executor_ = NULL; |
return false; |
+ } |
result_.reset(new base::FundamentalValue(true)); |
return true; |
} |
+void ExecuteTasksFileBrowserFunction::OnTaskExecuted(bool success) { |
+ SendResponse(success); |
+ // Executor has our reference, so we have to unref it if we don't want to |
+ // leak. |
+ executor_ = NULL; |
+} |
+ |
FileBrowserFunction::FileBrowserFunction() { |
} |