diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index a2c3ada92e3d2e..5c72fe72836bfd 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -175,7 +175,6 @@ PrintingContextWin::~PrintingContextWin() { ReleaseContext(); } -// TODO(vitalybuka): Implement as ui::BaseShellDialog crbug.com/180997. void PrintingContextWin::AskUserForSettings( gfx::NativeView view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -238,6 +237,14 @@ void PrintingContextWin::AskUserForSettings( dialog_options.Flags |= PD_NOPAGENUMS; } + // 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 + // browser frame (but still being modal) so neither the browser frame nor + // the print dialog will get any input. See http://crbug.com/342697 + // http://crbug.com/180997 for details. + base::MessageLoop::ScopedNestableTaskAllower allow( + base::MessageLoop::current()); HRESULT hr = (*print_dialog_func_)(&dialog_options); if (hr != S_OK) { ResetSettings(); diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc index 9ba666292a4efb..0590229c19c11b 100644 --- a/printing/printing_context_win_unittest.cc +++ b/printing/printing_context_win_unittest.cc @@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/memory/scoped_ptr.h" +#include "base/message_loop/message_loop.h" #include "printing/backend/printing_info_win.h" #include "printing/printing_test.h" #include "printing/printing_context.h" @@ -159,6 +160,7 @@ TEST_F(PrintingContextTest, Base) { } TEST_F(PrintingContextTest, PrintAll) { + base::MessageLoop message_loop; if (IsTestCaseDisabled()) return;