Commit 48ceab29 authored by Vladislav Kuzkokov's avatar Vladislav Kuzkokov Committed by Commit Bot

Make PrintingContext::PrintSettingsCallback non-repeatable.

Bug: 625126
Change-Id: If67d226a432060596cf424e148f16b7a5035aeb5
Reviewed-on: https://chromium-review.googlesource.com/914821Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Commit-Queue: Vladislav Kuzkokov <vkuzkokov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#536734}
parent 9afd0bad
...@@ -105,8 +105,9 @@ void NotificationCallback(PrintJobWorkerOwner* print_job, ...@@ -105,8 +105,9 @@ void NotificationCallback(PrintJobWorkerOwner* print_job,
void PostOnOwnerThread(scoped_refptr<PrintJobWorkerOwner> owner, void PostOnOwnerThread(scoped_refptr<PrintJobWorkerOwner> owner,
PrintingContext::PrintSettingsCallback callback, PrintingContext::PrintSettingsCallback callback,
PrintingContext::Result result) { PrintingContext::Result result) {
owner->PostTask(FROM_HERE, base::BindOnce(&HoldRefCallback, owner, owner->PostTask(FROM_HERE,
base::BindOnce(callback, result))); base::BindOnce(&HoldRefCallback, owner,
base::BindOnce(std::move(callback), result)));
} }
#if defined(OS_WIN) #if defined(OS_WIN)
...@@ -263,9 +264,9 @@ void PrintJobWorker::GetSettingsWithUI( ...@@ -263,9 +264,9 @@ void PrintJobWorker::GetSettingsWithUI(
// weak_factory_ creates pointers valid only on owner_ thread. // weak_factory_ creates pointers valid only on owner_ thread.
printing_context_->AskUserForSettings( printing_context_->AskUserForSettings(
document_page_count, has_selection, is_scripted, document_page_count, has_selection, is_scripted,
base::Bind(&PostOnOwnerThread, base::WrapRefCounted(owner_), base::BindOnce(&PostOnOwnerThread, base::WrapRefCounted(owner_),
base::Bind(&PrintJobWorker::GetSettingsDone, base::BindOnce(&PrintJobWorker::GetSettingsDone,
weak_factory_.GetWeakPtr()))); weak_factory_.GetWeakPtr())));
} }
void PrintJobWorker::UseDefaultSettings() { void PrintJobWorker::UseDefaultSettings() {
......
...@@ -83,9 +83,10 @@ void PrinterQuery::GetSettings(GetSettingsAskParam ask_user_for_settings, ...@@ -83,9 +83,10 @@ void PrinterQuery::GetSettings(GetSettingsAskParam ask_user_for_settings,
ask_user_for_settings == GetSettingsAskParam::ASK_USER; ask_user_for_settings == GetSettingsAskParam::ASK_USER;
worker_->PostTask( worker_->PostTask(
FROM_HERE, FROM_HERE,
base::Bind(&PrintJobWorker::GetSettings, base::Unretained(worker_.get()), base::BindOnce(&PrintJobWorker::GetSettings,
is_print_dialog_box_shown_, expected_page_count, has_selection, base::Unretained(worker_.get()),
margin_type, is_scripted, is_modifiable)); is_print_dialog_box_shown_, expected_page_count,
has_selection, margin_type, is_scripted, is_modifiable));
} }
void PrinterQuery::SetSettings( void PrinterQuery::SetSettings(
......
...@@ -323,8 +323,8 @@ bool PrintDialogGtk2::UpdateSettings(printing::PrintSettings* settings) { ...@@ -323,8 +323,8 @@ bool PrintDialogGtk2::UpdateSettings(printing::PrintSettings* settings) {
void PrintDialogGtk2::ShowDialog( void PrintDialogGtk2::ShowDialog(
gfx::NativeView parent_view, gfx::NativeView parent_view,
bool has_selection, bool has_selection,
const PrintingContextLinux::PrintSettingsCallback& callback) { PrintingContextLinux::PrintSettingsCallback callback) {
callback_ = callback; callback_ = std::move(callback);
DCHECK(!callback_.is_null()); DCHECK(!callback_.is_null());
dialog_ = gtk_print_unix_dialog_new(nullptr, nullptr); dialog_ = gtk_print_unix_dialog_new(nullptr, nullptr);
...@@ -477,14 +477,12 @@ void PrintDialogGtk2::OnResponse(GtkWidget* dialog, int response_id) { ...@@ -477,14 +477,12 @@ void PrintDialogGtk2::OnResponse(GtkWidget* dialog, int response_id) {
settings.set_selection_only(print_selection_only); settings.set_selection_only(print_selection_only);
InitPrintSettingsGtk(gtk_settings_, page_setup_, &settings); InitPrintSettingsGtk(gtk_settings_, page_setup_, &settings);
context_->InitWithSettings(settings); context_->InitWithSettings(settings);
callback_.Run(PrintingContextLinux::OK); std::move(callback_).Run(PrintingContextLinux::OK);
callback_.Reset();
return; return;
} }
case GTK_RESPONSE_DELETE_EVENT: // Fall through. case GTK_RESPONSE_DELETE_EVENT: // Fall through.
case GTK_RESPONSE_CANCEL: { case GTK_RESPONSE_CANCEL: {
callback_.Run(PrintingContextLinux::CANCEL); std::move(callback_).Run(PrintingContextLinux::CANCEL);
callback_.Reset();
return; return;
} }
case GTK_RESPONSE_APPLY: case GTK_RESPONSE_APPLY:
...@@ -551,8 +549,6 @@ void PrintDialogGtk2::OnWindowDestroying(aura::Window* window) { ...@@ -551,8 +549,6 @@ void PrintDialogGtk2::OnWindowDestroying(aura::Window* window) {
libgtkui::ClearAuraTransientParent(dialog_); libgtkui::ClearAuraTransientParent(dialog_);
window->RemoveObserver(this); window->RemoveObserver(this);
if (!callback_.is_null()) { if (!callback_.is_null())
callback_.Run(PrintingContextLinux::CANCEL); std::move(callback_).Run(PrintingContextLinux::CANCEL);
callback_.Reset();
}
} }
...@@ -43,7 +43,7 @@ class PrintDialogGtk2 : public printing::PrintDialogGtkInterface, ...@@ -43,7 +43,7 @@ class PrintDialogGtk2 : public printing::PrintDialogGtkInterface,
void ShowDialog( void ShowDialog(
gfx::NativeView parent_view, gfx::NativeView parent_view,
bool has_selection, bool has_selection,
const PrintingContextLinux::PrintSettingsCallback& callback) override; PrintingContextLinux::PrintSettingsCallback callback) override;
void PrintDocument(const printing::MetafilePlayer& metafile, void PrintDocument(const printing::MetafilePlayer& metafile,
const base::string16& document_name) override; const base::string16& document_name) override;
void AddRefToDialog() override; void AddRefToDialog() override;
......
...@@ -31,7 +31,7 @@ class PrintDialogGtkInterface { ...@@ -31,7 +31,7 @@ class PrintDialogGtkInterface {
virtual void ShowDialog( virtual void ShowDialog(
gfx::NativeView parent_view, gfx::NativeView parent_view,
bool has_selection, bool has_selection,
const PrintingContextLinux::PrintSettingsCallback& callback) = 0; PrintingContextLinux::PrintSettingsCallback callback) = 0;
// Prints the document named |document_name| contained in |metafile|. // Prints the document named |document_name| contained in |metafile|.
// Called from the print worker thread. Once called, the // Called from the print worker thread. Once called, the
......
...@@ -51,7 +51,7 @@ class PRINTING_EXPORT PrintingContext { ...@@ -51,7 +51,7 @@ class PRINTING_EXPORT PrintingContext {
// Callback of AskUserForSettings, used to notify the PrintJobWorker when // Callback of AskUserForSettings, used to notify the PrintJobWorker when
// print settings are available. // print settings are available.
typedef base::Callback<void(Result)> PrintSettingsCallback; using PrintSettingsCallback = base::OnceCallback<void(Result)>;
// Asks the user what printer and format should be used to print. Updates the // Asks the user what printer and format should be used to print. Updates the
// context with the select device settings. The result of the call is returned // context with the select device settings. The result of the call is returned
...@@ -63,7 +63,7 @@ class PRINTING_EXPORT PrintingContext { ...@@ -63,7 +63,7 @@ class PRINTING_EXPORT PrintingContext {
virtual void AskUserForSettings(int max_pages, virtual void AskUserForSettings(int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) = 0; PrintSettingsCallback callback) = 0;
// Selects the user's default printer and format. Updates the context with the // Selects the user's default printer and format. Updates the context with the
// default device settings. // default device settings.
......
...@@ -84,9 +84,9 @@ void PrintingContextAndroid::AskUserForSettings( ...@@ -84,9 +84,9 @@ void PrintingContextAndroid::AskUserForSettings(
int max_pages, int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) { PrintSettingsCallback callback) {
// This method is always run in the UI thread. // This method is always run in the UI thread.
callback_ = callback; callback_ = std::move(callback);
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
if (j_printing_context_.is_null()) { if (j_printing_context_.is_null()) {
...@@ -107,9 +107,10 @@ void PrintingContextAndroid::AskUserForSettingsReply( ...@@ -107,9 +107,10 @@ void PrintingContextAndroid::AskUserForSettingsReply(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& obj,
jboolean success) { jboolean success) {
DCHECK(callback_);
if (!success) { if (!success) {
// TODO(cimamoglu): Differentiate between FAILED And CANCEL. // TODO(cimamoglu): Differentiate between FAILED And CANCEL.
callback_.Run(FAILED); std::move(callback_).Run(FAILED);
return; return;
} }
...@@ -134,14 +135,15 @@ void PrintingContextAndroid::AskUserForSettingsReply( ...@@ -134,14 +135,15 @@ void PrintingContextAndroid::AskUserForSettingsReply(
height = Round(ConvertUnitDouble(height, kInchToMil, 1.0) * dpi); height = Round(ConvertUnitDouble(height, kInchToMil, 1.0) * dpi);
SetSizes(&settings_, dpi, width, height); SetSizes(&settings_, dpi, width, height);
callback_.Run(OK); std::move(callback_).Run(OK);
} }
void PrintingContextAndroid::ShowSystemDialogDone( void PrintingContextAndroid::ShowSystemDialogDone(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj) { const JavaParamRef<jobject>& obj) {
DCHECK(callback_);
// Settings are not updated, callback is called only to unblock javascript. // Settings are not updated, callback is called only to unblock javascript.
callback_.Run(CANCEL); std::move(callback_).Run(CANCEL);
} }
PrintingContext::Result PrintingContextAndroid::UseDefaultSettings() { PrintingContext::Result PrintingContextAndroid::UseDefaultSettings() {
......
...@@ -40,7 +40,7 @@ class PRINTING_EXPORT PrintingContextAndroid : public PrintingContext { ...@@ -40,7 +40,7 @@ class PRINTING_EXPORT PrintingContextAndroid : public PrintingContext {
void AskUserForSettings(int max_pages, void AskUserForSettings(int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) override; PrintSettingsCallback callback) override;
Result UseDefaultSettings() override; Result UseDefaultSettings() override;
gfx::Size GetPdfPaperSizeDeviceUnits() override; gfx::Size GetPdfPaperSizeDeviceUnits() override;
Result UpdatePrinterSettings(bool external_preview, Result UpdatePrinterSettings(bool external_preview,
......
...@@ -163,7 +163,7 @@ void PrintingContextChromeos::AskUserForSettings( ...@@ -163,7 +163,7 @@ void PrintingContextChromeos::AskUserForSettings(
int max_pages, int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) { PrintSettingsCallback callback) {
// We don't want to bring up a dialog here. Ever. This should not be called. // We don't want to bring up a dialog here. Ever. This should not be called.
NOTREACHED(); NOTREACHED();
} }
......
...@@ -25,7 +25,7 @@ class PRINTING_EXPORT PrintingContextChromeos : public PrintingContext { ...@@ -25,7 +25,7 @@ class PRINTING_EXPORT PrintingContextChromeos : public PrintingContext {
void AskUserForSettings(int max_pages, void AskUserForSettings(int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) override; PrintSettingsCallback callback) override;
Result UseDefaultSettings() override; Result UseDefaultSettings() override;
gfx::Size GetPdfPaperSizeDeviceUnits() override; gfx::Size GetPdfPaperSizeDeviceUnits() override;
Result UpdatePrinterSettings(bool external_preview, Result UpdatePrinterSettings(bool external_preview,
......
...@@ -65,21 +65,20 @@ void PrintingContextLinux::PrintDocument(const MetafilePlayer& metafile) { ...@@ -65,21 +65,20 @@ void PrintingContextLinux::PrintDocument(const MetafilePlayer& metafile) {
print_dialog_->PrintDocument(metafile, document_name_); print_dialog_->PrintDocument(metafile, document_name_);
} }
void PrintingContextLinux::AskUserForSettings( void PrintingContextLinux::AskUserForSettings(int max_pages,
int max_pages, bool has_selection,
bool has_selection, bool is_scripted,
bool is_scripted, PrintSettingsCallback callback) {
const PrintSettingsCallback& callback) {
if (!print_dialog_) { if (!print_dialog_) {
// Can only get here if the renderer is sending bad messages. // Can only get here if the renderer is sending bad messages.
// http://crbug.com/341777 // http://crbug.com/341777
NOTREACHED(); NOTREACHED();
callback.Run(FAILED); std::move(callback).Run(FAILED);
return; return;
} }
print_dialog_->ShowDialog( print_dialog_->ShowDialog(delegate_->GetParentView(), has_selection,
delegate_->GetParentView(), has_selection, callback); std::move(callback));
} }
PrintingContext::Result PrintingContextLinux::UseDefaultSettings() { PrintingContext::Result PrintingContextLinux::UseDefaultSettings() {
......
...@@ -40,7 +40,7 @@ class PRINTING_EXPORT PrintingContextLinux : public PrintingContext { ...@@ -40,7 +40,7 @@ class PRINTING_EXPORT PrintingContextLinux : public PrintingContext {
void AskUserForSettings(int max_pages, void AskUserForSettings(int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) override; PrintSettingsCallback callback) override;
gfx::Size GetPdfPaperSizeDeviceUnits() override; gfx::Size GetPdfPaperSizeDeviceUnits() override;
Result UseDefaultSettings() override; Result UseDefaultSettings() override;
Result UpdatePrinterSettings(bool external_preview, Result UpdatePrinterSettings(bool external_preview,
......
...@@ -26,7 +26,7 @@ class PRINTING_EXPORT PrintingContextMac : public PrintingContext { ...@@ -26,7 +26,7 @@ class PRINTING_EXPORT PrintingContextMac : public PrintingContext {
void AskUserForSettings(int max_pages, void AskUserForSettings(int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) override; PrintSettingsCallback callback) override;
Result UseDefaultSettings() override; Result UseDefaultSettings() override;
gfx::Size GetPdfPaperSizeDeviceUnits() override; gfx::Size GetPdfPaperSizeDeviceUnits() override;
Result UpdatePrinterSettings(bool external_preview, Result UpdatePrinterSettings(bool external_preview,
......
...@@ -81,11 +81,10 @@ PrintingContextMac::~PrintingContextMac() { ...@@ -81,11 +81,10 @@ PrintingContextMac::~PrintingContextMac() {
ReleaseContext(); ReleaseContext();
} }
void PrintingContextMac::AskUserForSettings( void PrintingContextMac::AskUserForSettings(int max_pages,
int max_pages, bool has_selection,
bool has_selection, bool is_scripted,
bool is_scripted, PrintSettingsCallback callback) {
const PrintSettingsCallback& callback) {
// Exceptions can also happen when the NSPrintPanel is being // Exceptions can also happen when the NSPrintPanel is being
// deallocated, so it must be autoreleased within this scope. // deallocated, so it must be autoreleased within this scope.
base::mac::ScopedNSAutoreleasePool pool; base::mac::ScopedNSAutoreleasePool pool;
...@@ -127,9 +126,9 @@ void PrintingContextMac::AskUserForSettings( ...@@ -127,9 +126,9 @@ void PrintingContextMac::AskUserForSettings(
print_info_.reset([[panel printInfo] retain]); print_info_.reset([[panel printInfo] retain]);
settings_.set_ranges(GetPageRangesFromPrintInfo()); settings_.set_ranges(GetPageRangesFromPrintInfo());
InitPrintSettingsFromPrintInfo(); InitPrintSettingsFromPrintInfo();
callback.Run(OK); std::move(callback).Run(OK);
} else { } else {
callback.Run(CANCEL); std::move(callback).Run(CANCEL);
} }
} }
......
...@@ -36,9 +36,9 @@ void PrintingContextNoSystemDialog::AskUserForSettings( ...@@ -36,9 +36,9 @@ void PrintingContextNoSystemDialog::AskUserForSettings(
int max_pages, int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) { PrintSettingsCallback callback) {
// We don't want to bring up a dialog here. Ever. Just signal the callback. // We don't want to bring up a dialog here. Ever. Just signal the callback.
callback.Run(OK); std::move(callback).Run(OK);
} }
PrintingContext::Result PrintingContextNoSystemDialog::UseDefaultSettings() { PrintingContext::Result PrintingContextNoSystemDialog::UseDefaultSettings() {
......
...@@ -21,7 +21,7 @@ class PRINTING_EXPORT PrintingContextNoSystemDialog : public PrintingContext { ...@@ -21,7 +21,7 @@ class PRINTING_EXPORT PrintingContextNoSystemDialog : public PrintingContext {
void AskUserForSettings(int max_pages, void AskUserForSettings(int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) override; PrintSettingsCallback callback) override;
Result UseDefaultSettings() override; Result UseDefaultSettings() override;
gfx::Size GetPdfPaperSizeDeviceUnits() override; gfx::Size GetPdfPaperSizeDeviceUnits() override;
Result UpdatePrinterSettings(bool external_preview, Result UpdatePrinterSettings(bool external_preview,
......
...@@ -23,7 +23,7 @@ void PrintingContextSystemDialogWin::AskUserForSettings( ...@@ -23,7 +23,7 @@ void PrintingContextSystemDialogWin::AskUserForSettings(
int max_pages, int max_pages,
bool has_selection, bool has_selection,
bool is_scripted, bool is_scripted,
const PrintSettingsCallback& callback) { PrintSettingsCallback callback) {
DCHECK(!in_print_job_); DCHECK(!in_print_job_);
HWND window = GetRootWindow(delegate_->GetParentView()); HWND window = GetRootWindow(delegate_->GetParentView());
...@@ -66,12 +66,12 @@ void PrintingContextSystemDialogWin::AskUserForSettings( ...@@ -66,12 +66,12 @@ void PrintingContextSystemDialogWin::AskUserForSettings(
if (ShowPrintDialog(&dialog_options) != S_OK) { if (ShowPrintDialog(&dialog_options) != S_OK) {
ResetSettings(); ResetSettings();
callback.Run(FAILED); std::move(callback).Run(FAILED);
return; return;
} }
// TODO(maruel): Support PD_PRINTTOFILE. // TODO(maruel): Support PD_PRINTTOFILE.
callback.Run(ParseDialogResultEx(dialog_options)); std::move(callback).Run(ParseDialogResultEx(dialog_options));
} }
HRESULT PrintingContextSystemDialogWin::ShowPrintDialog(PRINTDLGEX* options) { HRESULT PrintingContextSystemDialogWin::ShowPrintDialog(PRINTDLGEX* options) {
......
...@@ -23,11 +23,10 @@ class PRINTING_EXPORT PrintingContextSystemDialogWin ...@@ -23,11 +23,10 @@ class PRINTING_EXPORT PrintingContextSystemDialogWin
~PrintingContextSystemDialogWin() override; ~PrintingContextSystemDialogWin() override;
// PrintingContext implementation. // PrintingContext implementation.
void AskUserForSettings( void AskUserForSettings(int max_pages,
int max_pages, bool has_selection,
bool has_selection, bool is_scripted,
bool is_scripted, PrintSettingsCallback callback) override;
const PrintSettingsCallback& callback) override;
private: private:
friend class MockPrintingContextWin; friend class MockPrintingContextWin;
......
...@@ -51,11 +51,10 @@ PrintingContextWin::~PrintingContextWin() { ...@@ -51,11 +51,10 @@ PrintingContextWin::~PrintingContextWin() {
ReleaseContext(); ReleaseContext();
} }
void PrintingContextWin::AskUserForSettings( void PrintingContextWin::AskUserForSettings(int max_pages,
int max_pages, bool has_selection,
bool has_selection, bool is_scripted,
bool is_scripted, PrintSettingsCallback callback) {
const PrintSettingsCallback& callback) {
NOTIMPLEMENTED(); NOTIMPLEMENTED();
} }
......
...@@ -25,11 +25,10 @@ class PRINTING_EXPORT PrintingContextWin : public PrintingContext { ...@@ -25,11 +25,10 @@ class PRINTING_EXPORT PrintingContextWin : public PrintingContext {
Result InitWithSettingsForTest(const PrintSettings& settings); Result InitWithSettingsForTest(const PrintSettings& settings);
// PrintingContext implementation. // PrintingContext implementation.
void AskUserForSettings( void AskUserForSettings(int max_pages,
int max_pages, bool has_selection,
bool has_selection, bool is_scripted,
bool is_scripted, PrintSettingsCallback callback) override;
const PrintSettingsCallback& callback) override;
Result UseDefaultSettings() override; Result UseDefaultSettings() override;
gfx::Size GetPdfPaperSizeDeviceUnits() override; gfx::Size GetPdfPaperSizeDeviceUnits() override;
Result UpdatePrinterSettings(bool external_preview, Result UpdatePrinterSettings(bool external_preview,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment