From bd7c981343caf492e552ae6c9498a15bbc38f1c7 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Tue, 26 Aug 2014 01:57:54 -0700 Subject: [PATCH] Added PrintingContext::Delegate to get parent view handle and application locale. BUG=374321 Committed: https://chromium.googlesource.com/chromium/src/+/ee8f4e4029c09ba77e7dbb8fddd85186642b3de8 R=jschuh@chromium.org, noamsml@chromium.org, thestig@chromium.org, yzshen@chromium.org Review URL: https://codereview.chromium.org/478183005 Cr-Commit-Position: refs/heads/master@{#291871} --- chrome/browser/printing/print_job_manager.cc | 7 +- chrome/browser/printing/print_job_manager.h | 4 +- chrome/browser/printing/print_job_unittest.cc | 27 +++-- chrome/browser/printing/print_job_worker.cc | 97 +++++++++++---- chrome/browser/printing/print_job_worker.h | 18 +-- chrome/browser/printing/printer_query.cc | 6 +- chrome/browser/printing/printer_query.h | 4 +- .../printing/printing_message_filter.cc | 113 ++++++------------ .../printing/printing_message_filter.h | 11 -- .../print_preview/print_preview_handler.cc | 27 ++++- .../pepper/pepper_print_settings_manager.cc | 15 ++- printing/emf_win_unittest.cc | 12 +- printing/print_job_constants.cc | 6 + printing/print_job_constants.h | 2 + printing/printing_context.cc | 9 +- printing/printing_context.h | 29 +++-- printing/printing_context_android.cc | 12 +- printing/printing_context_android.h | 3 +- printing/printing_context_linux.cc | 13 +- printing/printing_context_linux.h | 3 +- printing/printing_context_mac.h | 3 +- printing/printing_context_mac.mm | 10 +- printing/printing_context_no_system_dialog.cc | 14 +-- printing/printing_context_no_system_dialog.h | 3 +- printing/printing_context_win.cc | 14 ++- printing/printing_context_win.h | 5 +- printing/printing_context_win_unittest.cc | 19 ++- 27 files changed, 281 insertions(+), 205 deletions(-) diff --git a/chrome/browser/printing/print_job_manager.cc b/chrome/browser/printing/print_job_manager.cc index 56c71ac94b1689..9ba9f46513484b 100644 --- a/chrome/browser/printing/print_job_manager.cc +++ b/chrome/browser/printing/print_job_manager.cc @@ -49,8 +49,11 @@ scoped_refptr PrintQueriesQueue::PopPrinterQuery( return NULL; } -scoped_refptr PrintQueriesQueue::CreatePrinterQuery() { - scoped_refptr job = new printing::PrinterQuery; +scoped_refptr PrintQueriesQueue::CreatePrinterQuery( + int render_process_id, + int render_view_id) { + scoped_refptr job = + new printing::PrinterQuery(render_process_id, render_view_id); base::AutoLock lock(lock_); job->SetWorkerDestination(destination_); return job; diff --git a/chrome/browser/printing/print_job_manager.h b/chrome/browser/printing/print_job_manager.h index 9d03d9a340f281..5efd9665d86ac5 100644 --- a/chrome/browser/printing/print_job_manager.h +++ b/chrome/browser/printing/print_job_manager.h @@ -10,6 +10,7 @@ #include "base/logging.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" #include "base/synchronization/lock.h" #include "base/threading/non_thread_safe.h" #include "content/public/browser/notification_observer.h" @@ -39,7 +40,8 @@ class PrintQueriesQueue : public base::RefCountedThreadSafe { scoped_refptr PopPrinterQuery(int document_cookie); // Creates new query. - scoped_refptr CreatePrinterQuery(); + scoped_refptr CreatePrinterQuery(int render_process_id, + int render_view_id); void Shutdown(); diff --git a/chrome/browser/printing/print_job_unittest.cc b/chrome/browser/printing/print_job_unittest.cc index 9c2d2c1e746b7b..12a3dd9d50537a 100644 --- a/chrome/browser/printing/print_job_unittest.cc +++ b/chrome/browser/printing/print_job_unittest.cc @@ -2,13 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/printing/print_job.h" + #include "base/message_loop/message_loop.h" #include "base/strings/string16.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/printing/print_job.h" #include "chrome/browser/printing/print_job_worker.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" +#include "content/public/common/child_process_host.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "printing/printed_pages_source.h" #include "testing/gtest/include/gtest/gtest.h" @@ -24,8 +27,9 @@ class TestSource : public printing::PrintedPagesSource { class TestPrintJobWorker : public printing::PrintJobWorker { public: explicit TestPrintJobWorker(printing::PrintJobWorkerOwner* owner) - : printing::PrintJobWorker(owner) { - } + : printing::PrintJobWorker(content::ChildProcessHost::kInvalidUniqueID, + content::ChildProcessHost::kInvalidUniqueID, + owner) {} friend class TestOwner; }; @@ -82,18 +86,15 @@ class TestPrintNotifObserv : public content::NotificationObserver { } // namespace -typedef testing::Test PrintJobTest; - -TEST_F(PrintJobTest, SimplePrint) { +TEST(PrintJobTest, SimplePrint) { // Test the multi-threaded nature of PrintJob to make sure we can use it with // known lifetime. - // This message loop is actually never run. - base::MessageLoop current; - + content::TestBrowserThreadBundle thread_bundle_; content::NotificationRegistrar registrar_; TestPrintNotifObserv observ; - registrar_.Add(&observ, content::NOTIFICATION_ALL, + registrar_.Add(&observ, + content::NOTIFICATION_ALL, content::NotificationService::AllSources()); volatile bool check = false; scoped_refptr job(new TestPrintJob(&check)); @@ -103,17 +104,17 @@ TEST_F(PrintJobTest, SimplePrint) { job->Initialize(owner.get(), &source, 1); job->Stop(); while (job->document()) { - current.RunUntilIdle(); + base::MessageLoop::current()->RunUntilIdle(); } EXPECT_FALSE(job->document()); job = NULL; while (!check) { - current.RunUntilIdle(); + base::MessageLoop::current()->RunUntilIdle(); } EXPECT_TRUE(check); } -TEST_F(PrintJobTest, SimplePrintLateInit) { +TEST(PrintJobTest, SimplePrintLateInit) { volatile bool check = false; base::MessageLoop current; scoped_refptr job(new TestPrintJob(&check)); diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc index 9ee52628d11e27..2dcd7887343b3b 100644 --- a/chrome/browser/printing/print_job_worker.cc +++ b/chrome/browser/printing/print_job_worker.cc @@ -17,6 +17,8 @@ #include "chrome/grit/generated_resources.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/browser/web_contents.h" #include "printing/print_job_constants.h" #include "printing/printed_document.h" #include "printing/printed_page.h" @@ -35,7 +37,66 @@ void HoldRefCallback(const scoped_refptr& owner, callback.Run(); } -} // namespace +class PrintingContextDelegate : public PrintingContext::Delegate { + public: + PrintingContextDelegate(int render_process_id, int render_view_id); + virtual ~PrintingContextDelegate(); + + virtual gfx::NativeView GetParentView() OVERRIDE; + virtual std::string GetAppLocale() OVERRIDE; + + private: + void InitOnUiThread(int render_process_id, int render_view_id); + + scoped_ptr web_contents_observer_; + base::WeakPtrFactory weak_ptr_factory_; +}; + +PrintingContextDelegate::PrintingContextDelegate(int render_process_id, + int render_view_id) + : weak_ptr_factory_(this) { + InitOnUiThread(render_process_id, render_view_id); +} + +PrintingContextDelegate::~PrintingContextDelegate() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); +} + +gfx::NativeView PrintingContextDelegate::GetParentView() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!web_contents_observer_) + return NULL; + return web_contents_observer_->GetParentView(); +} + +std::string PrintingContextDelegate::GetAppLocale() { + return g_browser_process->GetApplicationLocale(); +} + +void PrintingContextDelegate::InitOnUiThread(int render_process_id, + int render_view_id) { + if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { + // All data initialized here should be accessed on UI thread. Because object + // is being constructed now, anything that is going to access + // PrintingContextDelegate on UI thread would be scheduled after the tasks + // below. + BrowserThread::PostTask(BrowserThread::UI, + FROM_HERE, + base::Bind(&PrintingContextDelegate::InitOnUiThread, + weak_ptr_factory_.GetWeakPtr(), + render_process_id, + render_view_id)); + return; + } + content::RenderViewHost* view = + content::RenderViewHost::FromID(render_process_id, render_view_id); + if (!view) + return; + content::WebContents* wc = content::WebContents::FromRenderViewHost(view); + if (!wc) + return; + web_contents_observer_.reset(new PrintingUIWebContentsObserver(wc)); +} void NotificationCallback(PrintJobWorkerOwner* print_job, JobEventDetails::Type detail_type, @@ -49,13 +110,18 @@ void NotificationCallback(PrintJobWorkerOwner* print_job, content::Details(details)); } -PrintJobWorker::PrintJobWorker(PrintJobWorkerOwner* owner) +} // namespace + +PrintJobWorker::PrintJobWorker(int render_process_id, + int render_view_id, + PrintJobWorkerOwner* owner) : owner_(owner), thread_("Printing_Worker"), weak_factory_(this) { // The object is created in the IO thread. DCHECK(owner_->RunsTasksOnCurrentThread()); - printing_context_.reset(PrintingContext::Create( - g_browser_process->GetApplicationLocale())); + printing_context_delegate_.reset( + new PrintingContextDelegate(render_process_id, render_view_id)); + printing_context_ = PrintingContext::Create(printing_context_delegate_.get()); } PrintJobWorker::~PrintJobWorker() { @@ -78,7 +144,6 @@ void PrintJobWorker::SetPrintDestination( void PrintJobWorker::GetSettings( bool ask_user_for_settings, - scoped_ptr web_contents_observer, int document_page_count, bool has_selection, MarginType margin_type) { @@ -101,12 +166,9 @@ void PrintJobWorker::GetSettings( base::Bind(&HoldRefCallback, make_scoped_refptr(owner_), base::Bind(&PrintJobWorker::GetSettingsWithUI, base::Unretained(this), - base::Passed(&web_contents_observer), document_page_count, has_selection))); } else { - BrowserThread::DeleteSoon( - BrowserThread::UI, FROM_HERE, web_contents_observer.release()); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&HoldRefCallback, make_scoped_refptr(owner_), @@ -131,6 +193,7 @@ void PrintJobWorker::SetSettings( void PrintJobWorker::UpdatePrintSettings( scoped_ptr new_settings) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); PrintingContext::Result result = printing_context_->UpdatePrintSettings(*new_settings); GetSettingsDone(result); @@ -155,18 +218,12 @@ void PrintJobWorker::GetSettingsDone(PrintingContext::Result result) { } void PrintJobWorker::GetSettingsWithUI( - scoped_ptr web_contents_observer, int document_page_count, bool has_selection) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - - gfx::NativeView parent_view = web_contents_observer->GetParentView(); - if (!parent_view) { - GetSettingsWithUIDone(printing::PrintingContext::FAILED); - return; - } printing_context_->AskUserForSettings( - parent_view, document_page_count, has_selection, + document_page_count, + has_selection, base::Bind(&PrintJobWorker::GetSettingsWithUIDone, base::Unretained(this))); } @@ -316,7 +373,7 @@ void PrintJobWorker::OnDocumentDone() { } owner_->PostTask(FROM_HERE, - base::Bind(NotificationCallback, + base::Bind(&NotificationCallback, make_scoped_refptr(owner_), JobEventDetails::DOC_DONE, document_, @@ -332,7 +389,7 @@ void PrintJobWorker::SpoolPage(PrintedPage* page) { // Signal everyone that the page is about to be printed. owner_->PostTask(FROM_HERE, - base::Bind(NotificationCallback, + base::Bind(&NotificationCallback, make_scoped_refptr(owner_), JobEventDetails::NEW_PAGE, document_, @@ -371,7 +428,7 @@ void PrintJobWorker::SpoolPage(PrintedPage* page) { // Signal everyone that the page is printed. owner_->PostTask(FROM_HERE, - base::Bind(NotificationCallback, + base::Bind(&NotificationCallback, make_scoped_refptr(owner_), JobEventDetails::PAGE_DONE, document_, @@ -385,7 +442,7 @@ void PrintJobWorker::OnFailure() { scoped_refptr handle(owner_); owner_->PostTask(FROM_HERE, - base::Bind(NotificationCallback, + base::Bind(&NotificationCallback, make_scoped_refptr(owner_), JobEventDetails::FAILED, document_, diff --git a/chrome/browser/printing/print_job_worker.h b/chrome/browser/printing/print_job_worker.h index 2f6d2371c99181..6c86774dc0a2d9 100644 --- a/chrome/browser/printing/print_job_worker.h +++ b/chrome/browser/printing/print_job_worker.h @@ -9,10 +9,11 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" +#include "content/public/browser/browser_thread.h" #include "printing/page_number.h" #include "printing/print_destination_interface.h" -#include "printing/printing_context.h" #include "printing/print_job_constants.h" +#include "printing/printing_context.h" namespace base { class DictionaryValue; @@ -24,7 +25,6 @@ class PrintJob; class PrintJobWorkerOwner; class PrintedDocument; class PrintedPage; -class PrintingUIWebContentsObserver; // Worker thread code. It manages the PrintingContext, which can be blocking // and/or run a message loop. This is the object that generates most @@ -33,7 +33,9 @@ class PrintingUIWebContentsObserver; // PrintJob always outlives its worker instance. class PrintJobWorker { public: - explicit PrintJobWorker(PrintJobWorkerOwner* owner); + PrintJobWorker(int render_process_id, + int render_view_id, + PrintJobWorkerOwner* owner); virtual ~PrintJobWorker(); void SetNewOwner(PrintJobWorkerOwner* new_owner); @@ -46,14 +48,12 @@ class PrintJobWorker { // Print... dialog box will be shown to ask the user his preference. void GetSettings( bool ask_user_for_settings, - scoped_ptr web_contents_observer, int document_page_count, bool has_selection, MarginType margin_type); // Set the new print settings. - void SetSettings( - scoped_ptr new_settings); + void SetSettings(scoped_ptr new_settings); // Starts the printing loop. Every pages are printed as soon as the data is // available. Makes sure the new_document is the right one. @@ -112,7 +112,6 @@ class PrintJobWorker { // Required on Mac and Linux. Windows can display UI from non-main threads, // but sticks with this for consistency. void GetSettingsWithUI( - scoped_ptr web_contents_observer, int document_page_count, bool has_selection); @@ -132,6 +131,11 @@ class PrintJobWorker { // systems. void UseDefaultSettings(); + // Printing context delegate. + scoped_ptr + printing_context_delegate_; + // Information about the printer setting. scoped_ptr printing_context_; diff --git a/chrome/browser/printing/printer_query.cc b/chrome/browser/printing/printer_query.cc index 0120ba24574d44..ba2de8ce908651 100644 --- a/chrome/browser/printing/printer_query.cc +++ b/chrome/browser/printing/printer_query.cc @@ -14,8 +14,8 @@ namespace printing { -PrinterQuery::PrinterQuery() - : worker_(new PrintJobWorker(this)), +PrinterQuery::PrinterQuery(int render_process_id, int render_view_id) + : worker_(new PrintJobWorker(render_process_id, render_view_id, this)), is_print_dialog_box_shown_(false), cookie_(PrintSettings::NewCookie()), last_status_(PrintingContext::FAILED) { @@ -66,7 +66,6 @@ int PrinterQuery::cookie() const { void PrinterQuery::GetSettings( GetSettingsAskParam ask_user_for_settings, - scoped_ptr web_contents_observer, int expected_page_count, bool has_selection, MarginType margin_type, @@ -82,7 +81,6 @@ void PrinterQuery::GetSettings( base::Bind(&PrintJobWorker::GetSettings, base::Unretained(worker_.get()), is_print_dialog_box_shown_, - base::Passed(&web_contents_observer), expected_page_count, has_selection, margin_type)); diff --git a/chrome/browser/printing/printer_query.h b/chrome/browser/printing/printer_query.h index 24cad0b263d317..84cf24ace4f8e7 100644 --- a/chrome/browser/printing/printer_query.h +++ b/chrome/browser/printing/printer_query.h @@ -19,7 +19,6 @@ namespace printing { class PrintDestinationInterface; class PrintJobWorker; -class PrintingUIWebContentsObserver; // Query the printer for settings. class PrinterQuery : public PrintJobWorkerOwner { @@ -30,7 +29,7 @@ class PrinterQuery : public PrintJobWorkerOwner { ASK_USER, }; - PrinterQuery(); + PrinterQuery(int render_process_id, int render_view_id); // PrintJobWorkerOwner implementation. virtual void GetSettingsDone(const PrintSettings& new_settings, @@ -45,7 +44,6 @@ class PrinterQuery : public PrintJobWorkerOwner { // |ask_for_user_settings| is DEFAULTS. void GetSettings( GetSettingsAskParam ask_user_for_settings, - scoped_ptr web_contents_observer, int expected_page_count, bool has_selection, MarginType margin_type, diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc index 37c5984dab0db7..14657d793ac319 100644 --- a/chrome/browser/printing/printing_message_filter.cc +++ b/chrome/browser/printing/printing_message_filter.cc @@ -17,6 +17,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/child_process_host.h" #if defined(ENABLE_FULL_PRINTING) #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" @@ -258,49 +259,6 @@ content::WebContents* PrintingMessageFilter::GetWebContentsForRenderView( return view ? content::WebContents::FromRenderViewHost(view) : NULL; } -struct PrintingMessageFilter::GetPrintSettingsForRenderViewParams { - PrinterQuery::GetSettingsAskParam ask_user_for_settings; - int expected_page_count; - bool has_selection; - MarginType margin_type; -}; - -void PrintingMessageFilter::GetPrintSettingsForRenderView( - int render_view_id, - GetPrintSettingsForRenderViewParams params, - const base::Closure& callback, - scoped_refptr printer_query) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - content::WebContents* wc = GetWebContentsForRenderView(render_view_id); - if (wc) { - scoped_ptr wc_observer( - new PrintingUIWebContentsObserver(wc)); - BrowserThread::PostTask(BrowserThread::IO, - FROM_HERE, - base::Bind(&PrinterQuery::GetSettings, - printer_query, - params.ask_user_for_settings, - base::Passed(&wc_observer), - params.expected_page_count, - params.has_selection, - params.margin_type, - callback)); - } else { - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::Bind(&PrintingMessageFilter::OnGetPrintSettingsFailed, this, - callback, printer_query)); - } -} - -void PrintingMessageFilter::OnGetPrintSettingsFailed( - const base::Closure& callback, - scoped_refptr printer_query) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - printer_query->GetSettingsDone(PrintSettings(), PrintingContext::FAILED); - callback.Run(); -} - void PrintingMessageFilter::OnIsPrintingEnabled(bool* is_enabled) { DCHECK_CURRENTLY_ON(BrowserThread::IO); *is_enabled = profile_io_data_->printing_enabled()->GetValue(); @@ -315,23 +273,22 @@ void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) { return; } printer_query = queue_->PopPrinterQuery(0); - if (!printer_query) - printer_query = queue_->CreatePrinterQuery(); + if (!printer_query) { + printer_query = + queue_->CreatePrinterQuery(render_process_id_, reply_msg->routing_id()); + } // Loads default settings. This is asynchronous, only the IPC message sender // will hang until the settings are retrieved. - GetPrintSettingsForRenderViewParams params; - params.ask_user_for_settings = PrinterQuery::DEFAULTS; - params.expected_page_count = 0; - params.has_selection = false; - params.margin_type = DEFAULT_MARGINS; - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::Bind(&PrintingMessageFilter::GetPrintSettingsForRenderView, this, - reply_msg->routing_id(), params, - base::Bind(&PrintingMessageFilter::OnGetDefaultPrintSettingsReply, - this, printer_query, reply_msg), - printer_query)); + printer_query->GetSettings( + PrinterQuery::DEFAULTS, + 0, + false, + DEFAULT_MARGINS, + base::Bind(&PrintingMessageFilter::OnGetDefaultPrintSettingsReply, + this, + printer_query, + reply_msg)); } void PrintingMessageFilter::OnGetDefaultPrintSettingsReply( @@ -363,21 +320,19 @@ void PrintingMessageFilter::OnScriptedPrint( IPC::Message* reply_msg) { scoped_refptr printer_query = queue_->PopPrinterQuery(params.cookie); - if (!printer_query) - printer_query = queue_->CreatePrinterQuery(); - GetPrintSettingsForRenderViewParams settings_params; - settings_params.ask_user_for_settings = PrinterQuery::ASK_USER; - settings_params.expected_page_count = params.expected_pages_count; - settings_params.has_selection = params.has_selection; - settings_params.margin_type = params.margin_type; - - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::Bind(&PrintingMessageFilter::GetPrintSettingsForRenderView, this, - reply_msg->routing_id(), settings_params, - base::Bind(&PrintingMessageFilter::OnScriptedPrintReply, this, - printer_query, reply_msg), - printer_query)); + if (!printer_query) { + printer_query = + queue_->CreatePrinterQuery(render_process_id_, reply_msg->routing_id()); + } + printer_query->GetSettings( + PrinterQuery::ASK_USER, + params.expected_pages_count, + params.has_selection, + params.margin_type, + base::Bind(&PrintingMessageFilter::OnScriptedPrintReply, + this, + printer_query, + reply_msg)); } void PrintingMessageFilter::OnScriptedPrintReply( @@ -440,8 +395,18 @@ void PrintingMessageFilter::OnUpdatePrintSettings( return; } printer_query = queue_->PopPrinterQuery(document_cookie); - if (!printer_query) - printer_query = queue_->CreatePrinterQuery(); + if (!printer_query) { + int host_id = render_process_id_; + int routing_id = reply_msg->routing_id(); + if (!new_settings->GetInteger(printing::kPreviewInitiatorHostId, + &host_id) || + !new_settings->GetInteger(printing::kPreviewInitiatorRoutingId, + &routing_id)) { + host_id = content::ChildProcessHost::kInvalidUniqueID; + routing_id = content::ChildProcessHost::kInvalidUniqueID; + } + printer_query = queue_->CreatePrinterQuery(host_id, routing_id); + } printer_query->SetSettings( new_settings.Pass(), base::Bind(&PrintingMessageFilter::OnUpdatePrintSettingsReply, this, diff --git a/chrome/browser/printing/printing_message_filter.h b/chrome/browser/printing/printing_message_filter.h index d7614ff1298389..551fb7d7c3ebfd 100644 --- a/chrome/browser/printing/printing_message_filter.h +++ b/chrome/browser/printing/printing_message_filter.h @@ -32,7 +32,6 @@ namespace printing { class PrintJobManager; class PrintQueriesQueue; class PrinterQuery; -class PrintingUIWebContentsObserver; // This class filters out incoming printing related IPC messages for the // renderer process on the IPC thread. @@ -84,16 +83,6 @@ class PrintingMessageFilter : public content::BrowserMessageFilter { // to base::Bind. struct GetPrintSettingsForRenderViewParams; - // Retrieve print settings. Uses |render_view_id| to get a parent - // for any UI created if needed. - void GetPrintSettingsForRenderView(int render_view_id, - GetPrintSettingsForRenderViewParams params, - const base::Closure& callback, - scoped_refptr printer_query); - - void OnGetPrintSettingsFailed(const base::Closure& callback, - scoped_refptr printer_query); - // Checks if printing is enabled. void OnIsPrintingEnabled(bool* is_enabled); diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index f95cabfbcdd7a0..f872501281d31e 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc @@ -64,6 +64,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" +#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" @@ -261,10 +262,19 @@ std::string GetDefaultPrinterOnFileThread() { return default_printer; } +class PrintingContextDelegate : public printing::PrintingContext::Delegate { + public: + // PrintingContext::Delegate methods. + virtual gfx::NativeView GetParentView() OVERRIDE { return NULL; } + virtual std::string GetAppLocale() OVERRIDE { + return g_browser_process->GetApplicationLocale(); + } +}; + gfx::Size GetDefaultPdfMediaSizeMicrons() { + PrintingContextDelegate delegate; scoped_ptr printing_context( - printing::PrintingContext::Create( - g_browser_process->GetApplicationLocale())); + printing::PrintingContext::Create(&delegate)); if (printing::PrintingContext::OK != printing_context->UsePdfSettings() || printing_context->settings().device_units_per_inch() <= 0) { return gfx::Size(); @@ -835,6 +845,15 @@ void PrintPreviewHandler::HandlePrint(const base::ListValue* args) { // Do this so the initiator can open a new print preview dialog, while the // current print preview dialog is still handling its print job. WebContents* initiator = GetInitiator(); + if (initiator) { + // Save initiator IDs. |PrintingMessageFilter::OnUpdatePrintSettings| + // would be called when initiator info is cleared. + settings->SetInteger(printing::kPreviewInitiatorHostId, + initiator->GetRenderProcessHost()->GetID()); + settings->SetInteger(printing::kPreviewInitiatorRoutingId, + initiator->GetRoutingID()); + } + ClearInitiatorDetails(); // The PDF being printed contains only the pages that the user selected, @@ -1020,8 +1039,8 @@ void PrintPreviewHandler::HandleShowSystemDialog( print_view_manager->PrintForSystemDialogNow(); // Cancel the pending preview request if exists. - PrintPreviewUI* print_preview_ui = static_cast( - web_ui()->GetController()); + PrintPreviewUI* print_preview_ui = + static_cast(web_ui()->GetController()); print_preview_ui->OnCancelPendingPreviewRequest(); } diff --git a/content/browser/renderer_host/pepper/pepper_print_settings_manager.cc b/content/browser/renderer_host/pepper/pepper_print_settings_manager.cc index de5f5fec949025..496070909f82a7 100644 --- a/content/browser/renderer_host/pepper/pepper_print_settings_manager.cc +++ b/content/browser/renderer_host/pepper/pepper_print_settings_manager.cc @@ -5,6 +5,8 @@ #include "content/browser/renderer_host/pepper/pepper_print_settings_manager.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/content_browser_client.h" +#include "content/public/common/content_client.h" #include "ppapi/c/pp_errors.h" #include "printing/printing_context.h" #include "printing/units.h" @@ -42,12 +44,23 @@ PP_Rect PrintAreaToPPPrintArea(const gfx::Rect& print_area, return result; } +class PrintingContextDelegate : public printing::PrintingContext::Delegate { + public: + // PrintingContext::Delegate methods. + virtual gfx::NativeView GetParentView() OVERRIDE { return NULL; } + virtual std::string GetAppLocale() OVERRIDE { + return GetContentClient()->browser()->GetApplicationLocale(); + } +}; + PepperPrintSettingsManager::Result ComputeDefaultPrintSettings() { // This function should run on the UI thread because |PrintingContext| methods // call into platform APIs. DCHECK_CURRENTLY_ON(BrowserThread::UI); + + PrintingContextDelegate delegate; scoped_ptr context( - printing::PrintingContext::Create(std::string())); + printing::PrintingContext::Create(&delegate)); if (!context.get() || context->UseDefaultSettings() != printing::PrintingContext::OK) { return PepperPrintSettingsManager::Result(PP_PrintSettings_Dev(), diff --git a/printing/emf_win_unittest.cc b/printing/emf_win_unittest.cc index 8a5daaff4ef064..ec65c2844a9648 100644 --- a/printing/emf_win_unittest.cc +++ b/printing/emf_win_unittest.cc @@ -22,11 +22,13 @@ #include "ui/gfx/point.h" #include "ui/gfx/size.h" +namespace printing { + namespace { // This test is automatically disabled if no printer named "UnitTest Printer" is // available. -class EmfPrintingTest : public testing::Test { +class EmfPrintingTest : public testing::Test, public PrintingContext::Delegate { public: typedef testing::Test Parent; static bool IsTestCaseDisabled() { @@ -37,14 +39,16 @@ class EmfPrintingTest : public testing::Test { DeleteDC(hdc); return false; } + + // PrintingContext::Delegate methods. + virtual gfx::NativeView GetParentView() OVERRIDE { return NULL; } + virtual std::string GetAppLocale() OVERRIDE { return std::string(); } }; const uint32 EMF_HEADER_SIZE = 128; } // namespace -namespace printing { - TEST(EmfTest, DC) { // Simplest use case. uint32 size; @@ -83,7 +87,7 @@ TEST_F(EmfPrintingTest, Enumerate) { settings.set_device_name(L"UnitTest Printer"); // Initialize it. - scoped_ptr context(PrintingContext::Create(std::string())); + scoped_ptr context(PrintingContext::Create(this)); EXPECT_EQ(context->InitWithSettings(settings), PrintingContext::OK); base::FilePath emf_file; diff --git a/printing/print_job_constants.cc b/printing/print_job_constants.cc index 8ac5db4f7213f7..6ac461c3d6498a 100644 --- a/printing/print_job_constants.cc +++ b/printing/print_job_constants.cc @@ -12,6 +12,12 @@ const char kIsFirstRequest[] = "isFirstRequest"; // Unique ID sent along every preview request. const char kPreviewRequestID[] = "requestID"; +// Unique ID of Print Preview initiator host. +const char kPreviewInitiatorHostId[] = "previewInitiatorHostId"; + +// Routing ID of Print Preview initiator. +const char kPreviewInitiatorRoutingId[] = "previewInitiatorRoutingId"; + // Unique ID to identify a print preview UI. const char kPreviewUIID[] = "previewUIID"; diff --git a/printing/print_job_constants.h b/printing/print_job_constants.h index 257cba6d75d1a7..646191b9cad678 100644 --- a/printing/print_job_constants.h +++ b/printing/print_job_constants.h @@ -12,6 +12,8 @@ namespace printing { PRINTING_EXPORT extern const char kIsFirstRequest[]; PRINTING_EXPORT extern const char kPreviewRequestID[]; +PRINTING_EXPORT extern const char kPreviewInitiatorHostId[]; +PRINTING_EXPORT extern const char kPreviewInitiatorRoutingId[]; PRINTING_EXPORT extern const char kPreviewUIID[]; PRINTING_EXPORT extern const char kSettingCapabilities[]; PRINTING_EXPORT extern const char kSettingCloudPrintId[]; diff --git a/printing/printing_context.cc b/printing/printing_context.cc index c7f22a5003d302..d2b1e688838f83 100644 --- a/printing/printing_context.cc +++ b/printing/printing_context.cc @@ -18,11 +18,12 @@ namespace { const float kCloudPrintMarginInch = 0.25; } -PrintingContext::PrintingContext(const std::string& app_locale) - : dialog_box_dismissed_(false), +PrintingContext::PrintingContext(Delegate* delegate) + : delegate_(delegate), + dialog_box_dismissed_(false), in_print_job_(false), - abort_printing_(false), - app_locale_(app_locale) { + abort_printing_(false) { + CHECK(delegate_); } PrintingContext::~PrintingContext() { diff --git a/printing/printing_context.h b/printing/printing_context.h index 823a5af446678f..875c0703de4e0a 100644 --- a/printing/printing_context.h +++ b/printing/printing_context.h @@ -25,6 +25,19 @@ namespace printing { // printer and manage the document and page breaks. class PRINTING_EXPORT PrintingContext { public: + // Printing context delegate. + class Delegate { + public: + Delegate() {}; + virtual ~Delegate() {}; + + // Returns parent view to use for modal dialogs. + virtual gfx::NativeView GetParentView() = 0; + + // Returns application locale. + virtual std::string GetAppLocale() = 0; + }; + // Tri-state result for user behavior-dependent functions. enum Result { OK, @@ -42,8 +55,7 @@ class PRINTING_EXPORT PrintingContext { // context with the select device settings. The result of the call is returned // in the callback. This is necessary for Linux, which only has an // asynchronous printing API. - virtual void AskUserForSettings(gfx::NativeView parent_view, - int max_pages, + virtual void AskUserForSettings(int max_pages, bool has_selection, const PrintSettingsCallback& callback) = 0; @@ -98,9 +110,8 @@ class PRINTING_EXPORT PrintingContext { virtual gfx::NativeDrawingContext context() const = 0; // Creates an instance of this object. Implementers of this interface should - // implement this method to create an object of their implementation. The - // caller owns the returned object. - static PrintingContext* Create(const std::string& app_locale); + // implement this method to create an object of their implementation. + static scoped_ptr Create(Delegate* delegate); void set_margin_type(MarginType type); @@ -109,7 +120,7 @@ class PRINTING_EXPORT PrintingContext { } protected: - explicit PrintingContext(const std::string& app_locale); + explicit PrintingContext(Delegate* delegate); // Reinitializes the settings for object reuse. void ResetSettings(); @@ -120,6 +131,9 @@ class PRINTING_EXPORT PrintingContext { // Complete print context settings. PrintSettings settings_; + // Printing context delegate. + Delegate* delegate_; + // The dialog box has been dismissed. volatile bool dialog_box_dismissed_; @@ -129,9 +143,6 @@ class PRINTING_EXPORT PrintingContext { // Did the user cancel the print job. volatile bool abort_printing_; - // The application locale. - std::string app_locale_; - private: DISALLOW_COPY_AND_ASSIGN(PrintingContext); }; diff --git a/printing/printing_context_android.cc b/printing/printing_context_android.cc index 5729267f320a13..39f1c6dc5549af 100644 --- a/printing/printing_context_android.cc +++ b/printing/printing_context_android.cc @@ -61,8 +61,8 @@ void GetPageRanges(JNIEnv* env, namespace printing { // static -PrintingContext* PrintingContext::Create(const std::string& app_locale) { - return new PrintingContextAndroid(app_locale); +scoped_ptr PrintingContext::Create(Delegate* delegate) { + return make_scoped_ptr(new PrintingContextAndroid(delegate)); } // static @@ -71,8 +71,8 @@ void PrintingContextAndroid::PdfWritingDone(int fd, bool success) { Java_PrintingContext_pdfWritingDone(env, fd, success); } -PrintingContextAndroid::PrintingContextAndroid(const std::string& app_locale) - : PrintingContext(app_locale) { +PrintingContextAndroid::PrintingContextAndroid(Delegate* delegate) + : PrintingContext(delegate) { // The constructor is run in the IO thread. } @@ -80,7 +80,6 @@ PrintingContextAndroid::~PrintingContextAndroid() { } void PrintingContextAndroid::AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -149,7 +148,8 @@ gfx::Size PrintingContextAndroid::GetPdfPaperSizeDeviceUnits() { int32_t width = 0; int32_t height = 0; UErrorCode error = U_ZERO_ERROR; - ulocdata_getPaperSize(app_locale_.c_str(), &height, &width, &error); + ulocdata_getPaperSize( + delegate_->GetAppLocale().c_str(), &height, &width, &error); if (error > U_ZERO_ERROR) { // If the call failed, assume a paper size of 8.5 x 11 inches. LOG(WARNING) << "ulocdata_getPaperSize failed, using 8.5 x 11, error: " diff --git a/printing/printing_context_android.h b/printing/printing_context_android.h index b198e7baf24731..56068a127e215f 100644 --- a/printing/printing_context_android.h +++ b/printing/printing_context_android.h @@ -19,7 +19,7 @@ namespace printing { // Java side through JNI. class PRINTING_EXPORT PrintingContextAndroid : public PrintingContext { public: - explicit PrintingContextAndroid(const std::string& app_locale); + explicit PrintingContextAndroid(Delegate* delegate); virtual ~PrintingContextAndroid(); // Called when the page is successfully written to a PDF using the file @@ -32,7 +32,6 @@ class PRINTING_EXPORT PrintingContextAndroid : public PrintingContext { // PrintingContext implementation. virtual void AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) OVERRIDE; diff --git a/printing/printing_context_linux.cc b/printing/printing_context_linux.cc index 3b6d2ee9f1faca..c267478e764238 100644 --- a/printing/printing_context_linux.cc +++ b/printing/printing_context_linux.cc @@ -27,13 +27,12 @@ gfx::Size (*get_pdf_paper_size_)( namespace printing { // static -PrintingContext* PrintingContext::Create(const std::string& app_locale) { - return static_cast(new PrintingContextLinux(app_locale)); +scoped_ptr PrintingContext::Create(Delegate* delegate) { + return make_scoped_ptr(new PrintingContextLinux(delegate)); } -PrintingContextLinux::PrintingContextLinux(const std::string& app_locale) - : PrintingContext(app_locale), - print_dialog_(NULL) { +PrintingContextLinux::PrintingContextLinux(Delegate* delegate) + : PrintingContext(delegate), print_dialog_(NULL) { } PrintingContextLinux::~PrintingContextLinux() { @@ -67,7 +66,6 @@ void PrintingContextLinux::PrintDocument(const Metafile* metafile) { } void PrintingContextLinux::AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -79,7 +77,8 @@ void PrintingContextLinux::AskUserForSettings( return; } - print_dialog_->ShowDialog(parent_view, has_selection, callback); + print_dialog_->ShowDialog( + delegate_->GetParentView(), has_selection, callback); } PrintingContext::Result PrintingContextLinux::UseDefaultSettings() { diff --git a/printing/printing_context_linux.h b/printing/printing_context_linux.h index 307601488db9de..984d7dc1f9f26e 100644 --- a/printing/printing_context_linux.h +++ b/printing/printing_context_linux.h @@ -21,7 +21,7 @@ class PrintDialogGtkInterface; // PrintingContext with optional native UI for print dialog and pdf_paper_size. class PRINTING_EXPORT PrintingContextLinux : public PrintingContext { public: - explicit PrintingContextLinux(const std::string& app_locale); + explicit PrintingContextLinux(Delegate* delegate); virtual ~PrintingContextLinux(); // Sets the function that creates the print dialog. @@ -38,7 +38,6 @@ class PRINTING_EXPORT PrintingContextLinux : public PrintingContext { // PrintingContext implementation. virtual void AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) OVERRIDE; diff --git a/printing/printing_context_mac.h b/printing/printing_context_mac.h index f16ef545e7c7d2..9eb924ad95b215 100644 --- a/printing/printing_context_mac.h +++ b/printing/printing_context_mac.h @@ -21,12 +21,11 @@ namespace printing { class PRINTING_EXPORT PrintingContextMac : public PrintingContext { public: - explicit PrintingContextMac(const std::string& app_locale); + explicit PrintingContextMac(Delegate* delegate); virtual ~PrintingContextMac(); // PrintingContext implementation. virtual void AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) OVERRIDE; diff --git a/printing/printing_context_mac.mm b/printing/printing_context_mac.mm index 9bbe5ac1de9e67..fa907b579a4449 100644 --- a/printing/printing_context_mac.mm +++ b/printing/printing_context_mac.mm @@ -68,12 +68,12 @@ PMPaper MatchPaper(CFArrayRef paper_list, } // namespace // static -PrintingContext* PrintingContext::Create(const std::string& app_locale) { - return static_cast(new PrintingContextMac(app_locale)); +scoped_ptr PrintingContext::Create(Delegate* delegate) { + return make_scoped_ptr(new PrintingContextMac(delegate)); } -PrintingContextMac::PrintingContextMac(const std::string& app_locale) - : PrintingContext(app_locale), +PrintingContextMac::PrintingContextMac(Delegate* delegate) + : PrintingContext(delegate), print_info_([[NSPrintInfo sharedPrintInfo] copy]), context_(NULL) { } @@ -83,7 +83,6 @@ PMPaper MatchPaper(CFArrayRef paper_list, } void PrintingContextMac::AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -115,6 +114,7 @@ PMPaper MatchPaper(CFArrayRef paper_list, [panel setOptions:options]; // Set the print job title text. + gfx::NativeView parent_view = delegate_->GetParentView(); if (parent_view) { NSString* job_title = [[parent_view window] title]; if (job_title) { diff --git a/printing/printing_context_no_system_dialog.cc b/printing/printing_context_no_system_dialog.cc index 4768e4d3a3d65f..fd6e1663a33bcf 100644 --- a/printing/printing_context_no_system_dialog.cc +++ b/printing/printing_context_no_system_dialog.cc @@ -15,13 +15,13 @@ namespace printing { // static -PrintingContext* PrintingContext::Create(const std::string& app_locale) { - return static_cast( - new PrintingContextNoSystemDialog(app_locale)); +scoped_ptr PrintingContext::Create(Delegate* delegate) { + return make_scoped_ptr( + new PrintingContextNoSystemDialog(delegate)); } -PrintingContextNoSystemDialog::PrintingContextNoSystemDialog( - const std::string& app_locale) : PrintingContext(app_locale) { +PrintingContextNoSystemDialog::PrintingContextNoSystemDialog(Delegate* delegate) + : PrintingContext(delegate) { } PrintingContextNoSystemDialog::~PrintingContextNoSystemDialog() { @@ -29,7 +29,6 @@ PrintingContextNoSystemDialog::~PrintingContextNoSystemDialog() { } void PrintingContextNoSystemDialog::AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -54,7 +53,8 @@ gfx::Size PrintingContextNoSystemDialog::GetPdfPaperSizeDeviceUnits() { int32_t width = 0; int32_t height = 0; UErrorCode error = U_ZERO_ERROR; - ulocdata_getPaperSize(app_locale_.c_str(), &height, &width, &error); + ulocdata_getPaperSize( + delegate_->GetAppLocale().c_str(), &height, &width, &error); if (error > U_ZERO_ERROR) { // If the call failed, assume a paper size of 8.5 x 11 inches. LOG(WARNING) << "ulocdata_getPaperSize failed, using 8.5 x 11, error: " diff --git a/printing/printing_context_no_system_dialog.h b/printing/printing_context_no_system_dialog.h index 5472a811187c01..fbc69aa1a5ac94 100644 --- a/printing/printing_context_no_system_dialog.h +++ b/printing/printing_context_no_system_dialog.h @@ -17,12 +17,11 @@ namespace printing { class PRINTING_EXPORT PrintingContextNoSystemDialog : public PrintingContext { public: - explicit PrintingContextNoSystemDialog(const std::string& app_locale); + explicit PrintingContextNoSystemDialog(Delegate* delegate); virtual ~PrintingContextNoSystemDialog(); // PrintingContext implementation. virtual void AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) OVERRIDE; diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index b0a964448cd65e..dd0e2c48097f55 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -45,24 +45,26 @@ HWND GetRootWindow(gfx::NativeView view) { namespace printing { // static -PrintingContext* PrintingContext::Create(const std::string& app_locale) { - return static_cast(new PrintingContextWin(app_locale)); +scoped_ptr PrintingContext::Create(Delegate* delegate) { + return make_scoped_ptr(new PrintingContextWin(delegate)); } -PrintingContextWin::PrintingContextWin(const std::string& app_locale) - : PrintingContext(app_locale), context_(NULL), dialog_box_(NULL) {} +PrintingContextWin::PrintingContextWin(Delegate* delegate) + : PrintingContext(delegate), context_(NULL), dialog_box_(NULL) { +} PrintingContextWin::~PrintingContextWin() { ReleaseContext(); } void PrintingContextWin::AskUserForSettings( - gfx::NativeView view, int max_pages, bool has_selection, + int max_pages, + bool has_selection, const PrintSettingsCallback& callback) { DCHECK(!in_print_job_); dialog_box_dismissed_ = false; - HWND window = GetRootWindow(view); + HWND window = GetRootWindow(delegate_->GetParentView()); DCHECK(window); // Show the OS-dependent dialog box. diff --git a/printing/printing_context_win.h b/printing/printing_context_win.h index 6c1e42041b655e..94fd04143de73c 100644 --- a/printing/printing_context_win.h +++ b/printing/printing_context_win.h @@ -19,12 +19,11 @@ namespace printing { class PRINTING_EXPORT PrintingContextWin : public PrintingContext { public: - explicit PrintingContextWin(const std::string& app_locale); - ~PrintingContextWin(); + explicit PrintingContextWin(Delegate* delegate); + virtual ~PrintingContextWin(); // PrintingContext implementation. virtual void AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) OVERRIDE; diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc index c9facc9c0b8cc3..1d27935be55088 100644 --- a/printing/printing_context_win_unittest.cc +++ b/printing/printing_context_win_unittest.cc @@ -22,12 +22,17 @@ namespace printing { // This test is automatically disabled if no printer is available. -class PrintingContextTest : public PrintingTest { +class PrintingContextTest : public PrintingTest, + public PrintingContext::Delegate { public: void PrintSettingsCallback(PrintingContext::Result result) { result_ = result; } + // PrintingContext::Delegate methods. + virtual gfx::NativeView GetParentView() OVERRIDE { return NULL; } + virtual std::string GetAppLocale() OVERRIDE { return std::string(); } + protected: PrintingContext::Result result() const { return result_; } @@ -37,7 +42,7 @@ class PrintingContextTest : public PrintingTest { class MockPrintingContextWin : public PrintingContextWin { public: - MockPrintingContextWin() : PrintingContextWin("") {} + MockPrintingContextWin(Delegate* delegate) : PrintingContextWin(delegate) {} protected: // This is a fake PrintDlgEx implementation that sets the right fields in @@ -159,7 +164,7 @@ TEST_F(PrintingContextTest, Base) { PrintSettings settings; settings.set_device_name(GetDefaultPrinter()); // Initialize it. - scoped_ptr context(PrintingContext::Create(std::string())); + scoped_ptr context(PrintingContext::Create(this)); EXPECT_EQ(PrintingContext::OK, context->InitWithSettings(settings)); // The print may lie to use and may not support world transformation. @@ -174,10 +179,12 @@ TEST_F(PrintingContextTest, PrintAll) { if (IsTestCaseDisabled()) return; - MockPrintingContextWin context; + MockPrintingContextWin context(this); context.AskUserForSettings( - NULL, 123, false, base::Bind(&PrintingContextTest::PrintSettingsCallback, - base::Unretained(this))); + 123, + false, + base::Bind(&PrintingContextTest::PrintSettingsCallback, + base::Unretained(this))); EXPECT_EQ(PrintingContext::OK, result()); PrintSettings settings = context.settings(); EXPECT_EQ(settings.ranges().size(), 0);