diff options
author | vitalybuka <vitalybuka@chromium.org> | 2015-04-10 18:46:42 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-11 01:47:59 +0000 |
commit | 442258da866dda0b7ddcb35c51b9591e17c0de8c (patch) | |
tree | c6c1b0d7da91a3489ff7470d0e4f21033a8afc00 | |
parent | 7d62e83efbfa90f457ffc8b9b996b4b0ffbeee6f (diff) | |
download | chromium_src-442258da866dda0b7ddcb35c51b9591e17c0de8c.zip chromium_src-442258da866dda0b7ddcb35c51b9591e17c0de8c.tar.gz chromium_src-442258da866dda0b7ddcb35c51b9591e17c0de8c.tar.bz2 |
Fix crash from ipc_fuzzer
Can't reproduce original crash so I just fix all crashes I see.
Use WeakPtr in AskUserForSettings callback.
Move chrome::ShowMessageBox in separate task and protection against nested message boxes.
Add missing return into AskUserForSettings.
BUG=472146
Review URL: https://codereview.chromium.org/1083433003
Cr-Commit-Position: refs/heads/master@{#324746}
-rw-r--r-- | chrome/browser/printing/print_job_worker.cc | 26 | ||||
-rw-r--r-- | chrome/browser/printing/print_job_worker.h | 5 | ||||
-rw-r--r-- | chrome/browser/printing/print_view_manager_base.cc | 22 | ||||
-rw-r--r-- | printing/printing_context_system_dialog_win.cc | 1 |
4 files changed, 30 insertions, 24 deletions
diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc index 34a3483..5edd02c 100644 --- a/chrome/browser/printing/print_job_worker.cc +++ b/chrome/browser/printing/print_job_worker.cc @@ -93,6 +93,13 @@ void NotificationCallback(PrintJobWorkerOwner* print_job, content::Details<JobEventDetails>(details)); } +void PostOnOwnerThread(const scoped_refptr<PrintJobWorkerOwner>& owner, + const PrintingContext::PrintSettingsCallback& callback, + PrintingContext::Result result) { + owner->PostTask(FROM_HERE, base::Bind(&HoldRefCallback, owner, + base::Bind(callback, result))); +} + } // namespace PrintJobWorker::PrintJobWorker(int render_process_id, @@ -219,21 +226,12 @@ void PrintJobWorker::GetSettingsWithUI( } #endif + // weak_factory_ creates pointers valid only on owner_ thread. printing_context_->AskUserForSettings( - document_page_count, - has_selection, - is_scripted, - base::Bind(&PrintJobWorker::GetSettingsWithUIDone, - base::Unretained(this))); -} - -void PrintJobWorker::GetSettingsWithUIDone(PrintingContext::Result result) { - PostTask(FROM_HERE, - base::Bind(&HoldRefCallback, - make_scoped_refptr(owner_), - base::Bind(&PrintJobWorker::GetSettingsDone, - base::Unretained(this), - result))); + document_page_count, has_selection, is_scripted, + base::Bind(&PostOnOwnerThread, make_scoped_refptr(owner_), + base::Bind(&PrintJobWorker::GetSettingsDone, + weak_factory_.GetWeakPtr()))); } void PrintJobWorker::UseDefaultSettings() { diff --git a/chrome/browser/printing/print_job_worker.h b/chrome/browser/printing/print_job_worker.h index 97d8d81..9958811 100644 --- a/chrome/browser/printing/print_job_worker.h +++ b/chrome/browser/printing/print_job_worker.h @@ -114,11 +114,6 @@ class PrintJobWorker { bool has_selection, bool is_scripted); - // The callback used by PrintingContext::GetSettingsWithUI() to notify this - // object that the print settings are set. This is needed in order to bounce - // back into the IO thread for GetSettingsDone(). - void GetSettingsWithUIDone(PrintingContext::Result result); - // Called on the UI thread to update the print settings. void UpdatePrintSettings(scoped_ptr<base::DictionaryValue> new_settings); diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc index a13e643..edc5aa6 100644 --- a/chrome/browser/printing/print_view_manager_base.cc +++ b/chrome/browser/printing/print_view_manager_base.cc @@ -4,6 +4,7 @@ #include "chrome/browser/printing/print_view_manager_base.h" +#include "base/auto_reset.h" #include "base/bind.h" #include "base/memory/scoped_ptr.h" #include "base/prefs/pref_service.h" @@ -40,6 +41,18 @@ namespace printing { namespace { +void ShowWarningMessageBox(const base::string16& message) { + // Runs always on the UI thread. + static bool is_dialog_shown = false; + if (is_dialog_shown) + return; + // Block opening dialog from nested task. + base::AutoReset<bool> auto_reset(&is_dialog_shown, true); + + chrome::ShowMessageBox(nullptr, base::string16(), message, + chrome::MESSAGE_BOX_TYPE_WARNING); +} + } // namespace PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents) @@ -195,11 +208,10 @@ void PrintViewManagerBase::OnPrintingFailed(int cookie) { } void PrintViewManagerBase::OnShowInvalidPrinterSettingsError() { - chrome::ShowMessageBox(NULL, - base::string16(), - l10n_util::GetStringUTF16( - IDS_PRINT_INVALID_PRINTER_SETTINGS), - chrome::MESSAGE_BOX_TYPE_WARNING); + base::MessageLoop::current()->PostTask( + FROM_HERE, base::Bind(&ShowWarningMessageBox, + l10n_util::GetStringUTF16( + IDS_PRINT_INVALID_PRINTER_SETTINGS))); } void PrintViewManagerBase::DidStartLoading() { diff --git a/printing/printing_context_system_dialog_win.cc b/printing/printing_context_system_dialog_win.cc index e67ae3b..dd5e290 100644 --- a/printing/printing_context_system_dialog_win.cc +++ b/printing/printing_context_system_dialog_win.cc @@ -69,6 +69,7 @@ void PrintingContextSytemDialogWin::AskUserForSettings( if (ShowPrintDialog(&dialog_options) != S_OK) { ResetSettings(); callback.Run(FAILED); + return; } // TODO(maruel): Support PD_PRINTTOFILE. |