summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-05 00:06:13 +0000
committerzelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-05 00:06:13 +0000
commit44da8217868a044e283062254c0bf02f0c66f0a1 (patch)
tree9367979a9eb64358d48b6896495091936b56130f
parent85fc920f91b0f74b64b3623a7f748f3096eb953c (diff)
downloadchromium_src-44da8217868a044e283062254c0bf02f0c66f0a1.zip
chromium_src-44da8217868a044e283062254c0bf02f0c66f0a1.tar.gz
chromium_src-44da8217868a044e283062254c0bf02f0c66f0a1.tar.bz2
Crash fixes for API callbacks. Added SendResponse() calls to places where we were missing them.
BUG=chromium-os:14769, chromium-os:14821 TEST=no crashes on the crash server with these stacks anymore Review URL: http://codereview.chromium.org/6940001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84166 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/extension_file_browser_private_api.cc52
-rw-r--r--chrome/browser/extensions/extension_file_browser_private_api.h10
2 files changed, 46 insertions, 16 deletions
diff --git a/chrome/browser/extensions/extension_file_browser_private_api.cc b/chrome/browser/extensions/extension_file_browser_private_api.cc
index cdb20fe..da14ba0 100644
--- a/chrome/browser/extensions/extension_file_browser_private_api.cc
+++ b/chrome/browser/extensions/extension_file_browser_private_api.cc
@@ -294,13 +294,13 @@ class LocalFileSystemCallbackDispatcher
};
void RequestLocalFileSystemFunction::RequestOnFileThread(
- const GURL& source_url) {
+ const GURL& source_url, int child_id) {
fileapi::FileSystemOperation* operation =
new fileapi::FileSystemOperation(
new LocalFileSystemCallbackDispatcher(
this,
profile(),
- dispatcher()->render_view_host()->process()->id(),
+ child_id,
GetExtension()),
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE),
profile()->GetFileSystemContext(),
@@ -311,11 +311,16 @@ void RequestLocalFileSystemFunction::RequestOnFileThread(
}
bool RequestLocalFileSystemFunction::RunImpl() {
+ if (!dispatcher() || !dispatcher()->render_view_host() ||
+ !dispatcher()->render_view_host()->process())
+ return false;
+
BrowserThread::PostTask(
BrowserThread::FILE, FROM_HERE,
NewRunnableMethod(this,
&RequestLocalFileSystemFunction::RequestOnFileThread,
- source_url_));
+ source_url_,
+ dispatcher()->render_view_host()->process()->id()));
// Will finish asynchronously.
return true;
}
@@ -437,8 +442,13 @@ class ExecuteTasksFileSystemCallbackDispatcher
}
file_list.push_back(file);
}
- if (file_list.empty())
+ if (file_list.empty()) {
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ NewRunnableMethod(function_,
+ &ExecuteTasksFileBrowserFunction::ExecuteFailedOnUIThread));
return;
+ }
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
@@ -452,6 +462,10 @@ class ExecuteTasksFileSystemCallbackDispatcher
virtual void DidFail(base::PlatformFileError error_code) OVERRIDE {
LOG(WARNING) << "Local file system cant be resolved";
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ NewRunnableMethod(function_,
+ &ExecuteTasksFileBrowserFunction::ExecuteFailedOnUIThread));
}
private:
@@ -588,9 +602,7 @@ bool ExecuteTasksFileBrowserFunction::RunImpl() {
if (!files_list->GetSize())
return true;
- InitiateFileTaskExecution(task_id, files_list);
- SendResponse(true);
- return true;
+ return InitiateFileTaskExecution(task_id, files_list);
}
bool ExecuteTasksFileBrowserFunction::InitiateFileTaskExecution(
@@ -600,7 +612,6 @@ bool ExecuteTasksFileBrowserFunction::InitiateFileTaskExecution(
std::string origin_file_url;
if (!files_list->GetString(i, &origin_file_url)) {
error_ = kInvalidFileUrl;
- SendResponse(false);
return false;
}
file_urls.push_back(GURL(origin_file_url));
@@ -639,6 +650,11 @@ void ExecuteTasksFileBrowserFunction::RequestFileEntryOnFileThread(
false); // create
}
+void ExecuteTasksFileBrowserFunction::ExecuteFailedOnUIThread() {
+ SendResponse(false);
+}
+
+
void ExecuteTasksFileBrowserFunction::ExecuteFileActionsOnUIThread(
const std::string& task_id,
const std::string& file_system_name,
@@ -654,17 +670,22 @@ void ExecuteTasksFileBrowserFunction::ExecuteFileActionsOnUIThread(
if (!CrackTaskIdentifier(task_id, &handler_extension_id,
&action_id)) {
LOG(WARNING) << "Invalid task " << task_id;
+ SendResponse(false);
return;
}
const Extension* extension = service->GetExtensionById(handler_extension_id,
false);
- if (!extension)
+ if (!extension) {
+ SendResponse(false);
return;
+ }
ExtensionEventRouter* event_router = profile_->GetExtensionEventRouter();
- if (!event_router)
+ if (!event_router) {
+ SendResponse(false);
return;
+ }
scoped_ptr<ListValue> event_args(new ListValue());
event_args->Append(Value::CreateStringValue(action_id));
@@ -698,6 +719,7 @@ void ExecuteTasksFileBrowserFunction::ExecuteFileActionsOnUIThread(
handler_extension_id, std::string("fileBrowserHandler.onExecute"),
json_args, profile_,
GURL());
+ SendResponse(true);
}
FileDialogFunction::FileDialogFunction() {
@@ -744,6 +766,10 @@ int32 FileDialogFunction::GetTabId() const {
}
const FileDialogFunction::Callback& FileDialogFunction::GetCallback() const {
+ if (!dispatcher() || !dispatcher()->delegate() ||
+ !dispatcher()->delegate()->associated_tab_contents()) {
+ return Callback::null();
+ }
return Callback::Find(GetTabId());
}
@@ -828,6 +854,7 @@ void SelectFileFunction::GetLocalPathsResponseOnUIThread(
const FilePathList& files) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (files.size() != 1) {
+ SendResponse(false);
return;
}
int index;
@@ -842,6 +869,7 @@ void SelectFileFunction::GetLocalPathsResponseOnUIThread(
index,
callback.params());
}
+ SendResponse(true);
}
@@ -886,6 +914,7 @@ void ViewFilesFunction::GetLocalPathsResponseOnUIThread(
++iter) {
platform_util::OpenItem(*iter);
}
+ SendResponse(true);
}
SelectFilesFunction::SelectFilesFunction() {
@@ -933,6 +962,7 @@ void SelectFilesFunction::GetLocalPathsResponseOnUIThread(
CloseDialog(callback.dialog());
callback.listener()->MultiFilesSelected(files, callback.params());
}
+ SendResponse(true);
}
bool CancelFileDialogFunction::RunImpl() {
@@ -944,6 +974,7 @@ bool CancelFileDialogFunction::RunImpl() {
CloseDialog(callback.dialog());
callback.listener()->FileSelectionCanceled(callback.params());
}
+ SendResponse(true);
return true;
}
@@ -1022,6 +1053,5 @@ bool FileDialogStringsFunction::RunImpl() {
#undef SET_STRING
- SendResponse(true);
return true;
}
diff --git a/chrome/browser/extensions/extension_file_browser_private_api.h b/chrome/browser/extensions/extension_file_browser_private_api.h
index bf8decb..8abaa1b 100644
--- a/chrome/browser/extensions/extension_file_browser_private_api.h
+++ b/chrome/browser/extensions/extension_file_browser_private_api.h
@@ -28,7 +28,7 @@ class RequestLocalFileSystemFunction : public AsyncExtensionFunction {
void RespondSuccessOnUIThread(const std::string& name,
const GURL& root_path);
void RespondFailedOnUIThread(base::PlatformFileError error_code);
- void RequestOnFileThread(const GURL& source_url);
+ void RequestOnFileThread(const GURL& source_url, int child_id);
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.requestLocalFileSystem");
};
@@ -69,6 +69,7 @@ class ExecuteTasksFileBrowserFunction : public AsyncExtensionFunction {
const std::string& file_system_name,
const GURL& file_system_root,
const FileDefinitionList& file_list);
+ void ExecuteFailedOnUIThread();
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.executeTask");
};
@@ -101,9 +102,9 @@ class FileDialogFunction
void* params);
static void Remove(int32 tab_id);
static const Callback& Find(int32 tab_id);
+ static const Callback& null() { return null_; }
private:
- static const Callback& null() { return null_; }
SelectFileDialog::Listener* listener_;
HtmlDialogView* dialog_;
@@ -215,15 +216,14 @@ class CancelFileDialogFunction
};
// File Dialog Strings.
-class FileDialogStringsFunction
- : public FileDialogFunction {
+class FileDialogStringsFunction : public SyncExtensionFunction {
public:
FileDialogStringsFunction() {}
protected:
virtual ~FileDialogStringsFunction() {}
- // AsyncExtensionFunction overrides.
+ // SyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
private: