summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvitalybuka <vitalybuka@chromium.org>2015-04-10 18:46:42 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-11 01:47:59 +0000
commit442258da866dda0b7ddcb35c51b9591e17c0de8c (patch)
treec6c1b0d7da91a3489ff7470d0e4f21033a8afc00
parent7d62e83efbfa90f457ffc8b9b996b4b0ffbeee6f (diff)
downloadchromium_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.cc26
-rw-r--r--chrome/browser/printing/print_job_worker.h5
-rw-r--r--chrome/browser/printing/print_view_manager_base.cc22
-rw-r--r--printing/printing_context_system_dialog_win.cc1
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.