OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "printing/printing_context_system_dialog_win.h" | 5 #include "printing/printing_context_system_dialog_win.h" |
6 | 6 |
| 7 #include "base/auto_reset.h" |
7 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
8 #include "printing/backend/win_helper.h" | 9 #include "printing/backend/win_helper.h" |
9 #include "printing/print_settings_initializer_win.h" | 10 #include "printing/print_settings_initializer_win.h" |
10 #include "skia/ext/platform_device.h" | 11 #include "skia/ext/platform_device.h" |
11 | 12 |
12 namespace printing { | 13 namespace printing { |
13 | 14 |
14 PrintingContextSytemDialogWin::PrintingContextSytemDialogWin(Delegate* delegate) | 15 PrintingContextSytemDialogWin::PrintingContextSytemDialogWin(Delegate* delegate) |
15 : PrintingContextWin(delegate), dialog_box_(NULL) { | 16 : PrintingContextWin(delegate), dialog_box_(NULL) { |
16 } | 17 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 | 78 |
78 void PrintingContextSytemDialogWin::Cancel() { | 79 void PrintingContextSytemDialogWin::Cancel() { |
79 PrintingContextWin::Cancel(); | 80 PrintingContextWin::Cancel(); |
80 if (dialog_box_) { | 81 if (dialog_box_) { |
81 DestroyWindow(dialog_box_); | 82 DestroyWindow(dialog_box_); |
82 dialog_box_dismissed_ = true; | 83 dialog_box_dismissed_ = true; |
83 } | 84 } |
84 } | 85 } |
85 | 86 |
86 HRESULT PrintingContextSytemDialogWin::ShowPrintDialog(PRINTDLGEX* options) { | 87 HRESULT PrintingContextSytemDialogWin::ShowPrintDialog(PRINTDLGEX* options) { |
| 88 // Runs always on the UI thread. |
| 89 static bool is_dialog_shown = false; |
| 90 if (is_dialog_shown) |
| 91 return E_FAIL; |
| 92 // Block opening dialog from nested task. It crashes PrintDlgEx. |
| 93 base::AutoReset<bool> auto_reset(&is_dialog_shown, true); |
| 94 |
87 // Note that this cannot use ui::BaseShellDialog as the print dialog is | 95 // Note that this cannot use ui::BaseShellDialog as the print dialog is |
88 // system modal: opening it from a background thread can cause Windows to | 96 // system modal: opening it from a background thread can cause Windows to |
89 // get the wrong Z-order which will make the print dialog appear behind the | 97 // get the wrong Z-order which will make the print dialog appear behind the |
90 // browser frame (but still being modal) so neither the browser frame nor | 98 // browser frame (but still being modal) so neither the browser frame nor |
91 // the print dialog will get any input. See http://crbug.com/342697 | 99 // the print dialog will get any input. See http://crbug.com/342697 |
92 // http://crbug.com/180997 for details. | 100 // http://crbug.com/180997 for details. |
93 base::MessageLoop::ScopedNestableTaskAllower allow( | 101 base::MessageLoop::ScopedNestableTaskAllower allow( |
94 base::MessageLoop::current()); | 102 base::MessageLoop::current()); |
95 | 103 |
96 return PrintDlgEx(options); | 104 return PrintDlgEx(options); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 | 269 |
262 if (dialog_options.hDevMode != NULL) | 270 if (dialog_options.hDevMode != NULL) |
263 GlobalFree(dialog_options.hDevMode); | 271 GlobalFree(dialog_options.hDevMode); |
264 if (dialog_options.hDevNames != NULL) | 272 if (dialog_options.hDevNames != NULL) |
265 GlobalFree(dialog_options.hDevNames); | 273 GlobalFree(dialog_options.hDevNames); |
266 | 274 |
267 return context() ? OK : FAILED; | 275 return context() ? OK : FAILED; |
268 } | 276 } |
269 | 277 |
270 } // namespace printing | 278 } // namespace printing |
OLD | NEW |