diff --git a/printing/printing_context_system_dialog_win.cc b/printing/printing_context_system_dialog_win.cc index 19fc42719ce99..b89f1a4e469ac 100644 --- a/printing/printing_context_system_dialog_win.cc +++ b/printing/printing_context_system_dialog_win.cc @@ -4,6 +4,7 @@ #include "printing/printing_context_system_dialog_win.h" +#include "base/auto_reset.h" #include "base/message_loop/message_loop.h" #include "printing/backend/win_helper.h" #include "printing/print_settings_initializer_win.h" @@ -84,6 +85,13 @@ void PrintingContextSytemDialogWin::Cancel() { } HRESULT PrintingContextSytemDialogWin::ShowPrintDialog(PRINTDLGEX* options) { + // Runs always on the UI thread. + static bool is_dialog_shown = false; + if (is_dialog_shown) + return E_FAIL; + // Block opening dialog from nested task. It crashes PrintDlgEx. + base::AutoReset auto_reset(&is_dialog_shown, true); + // Note that this cannot use ui::BaseShellDialog as the print dialog is // system modal: opening it from a background thread can cause Windows to // get the wrong Z-order which will make the print dialog appear behind the diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index 678e7f2c6ff6f..11fea9270ea52 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -363,7 +363,7 @@ PrintingContext::Result PrintingContextWin::InitializeSettings( HWND PrintingContextWin::GetRootWindow(gfx::NativeView view) { HWND window = NULL; #if defined(USE_AURA) - if (view) + if (view && view->GetHost()) window = view->GetHost()->GetAcceleratedWidget(); #else if (view && IsWindow(view)) {