diff options
author | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-05 00:06:13 +0000 |
---|---|---|
committer | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-05 00:06:13 +0000 |
commit | 44da8217868a044e283062254c0bf02f0c66f0a1 (patch) | |
tree | 9367979a9eb64358d48b6896495091936b56130f | |
parent | 85fc920f91b0f74b64b3623a7f748f3096eb953c (diff) | |
download | chromium_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.cc | 52 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_file_browser_private_api.h | 10 |
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: |