diff options
| author | finnur <finnur@chromium.org> | 2014-08-25 03:08:15 -0700 |
|---|---|---|
| committer | Commit bot <commit-bot@chromium.org> | 2014-08-25 10:09:09 +0000 |
| commit | c921afdcc249a89bd9e8cc1cc898e4c320cc5d03 (patch) | |
| tree | d3a070f77fb354815c81dcd1d993783d298deab0 | |
| parent | bb1bd87a4fad403340fe8e3168552a933954a535 (diff) | |
| download | chromium_src-c921afdcc249a89bd9e8cc1cc898e4c320cc5d03.zip chromium_src-c921afdcc249a89bd9e8cc1cc898e4c320cc5d03.tar.gz chromium_src-c921afdcc249a89bd9e8cc1cc898e4c320cc5d03.tar.bz2 | |
Revert of Added PrintingContext::Delegate to get parent view handle and application locale. (patchset #13 of https://codereview.chromium.org/478183005/)
Reason for revert:
PrintJobTest.SimplePrint leaking on Linux ASAN bots since this was checked in:
http://build.chromium.org/p/chromium.memory/builders/Linux%20ASan%20LSan%20Tests%20%282%29?numbuilds=100
This CL looks like the likeliest culprit.
Original issue's description:
> Added PrintingContext::Delegate to get parent view handle and application locale.
>
> BUG=374321
>
> Committed: https://chromium.googlesource.com/chromium/src/+/ee8f4e4029c09ba77e7dbb8fddd85186642b3de8
TBR=noamsml@chromium.org,inferno@chromium.org,yzshen@chromium.org,thestig@chromium.org,jschuh@chromium.org,vitalybuka@chromium.org
NOTREECHECKS=true
NOTRY=true
BUG=374321
Review URL: https://codereview.chromium.org/504763002
Cr-Commit-Position: refs/heads/master@{#291654}
25 files changed, 193 insertions, 244 deletions
diff --git a/chrome/browser/printing/print_job_manager.cc b/chrome/browser/printing/print_job_manager.cc index 9ba9f46..56c71ac 100644 --- a/chrome/browser/printing/print_job_manager.cc +++ b/chrome/browser/printing/print_job_manager.cc @@ -49,11 +49,8 @@ scoped_refptr<PrinterQuery> PrintQueriesQueue::PopPrinterQuery( return NULL; } -scoped_refptr<PrinterQuery> PrintQueriesQueue::CreatePrinterQuery( - int render_process_id, - int render_view_id) { - scoped_refptr<PrinterQuery> job = - new printing::PrinterQuery(render_process_id, render_view_id); +scoped_refptr<PrinterQuery> PrintQueriesQueue::CreatePrinterQuery() { + scoped_refptr<PrinterQuery> job = new printing::PrinterQuery; 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 5efd966..9d03d9a3 100644 --- a/chrome/browser/printing/print_job_manager.h +++ b/chrome/browser/printing/print_job_manager.h @@ -10,7 +10,6 @@ #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" @@ -40,8 +39,7 @@ class PrintQueriesQueue : public base::RefCountedThreadSafe<PrintQueriesQueue> { scoped_refptr<PrinterQuery> PopPrinterQuery(int document_cookie); // Creates new query. - scoped_refptr<PrinterQuery> CreatePrinterQuery(int render_process_id, - int render_view_id); + scoped_refptr<PrinterQuery> CreatePrinterQuery(); void Shutdown(); diff --git a/chrome/browser/printing/print_job_unittest.cc b/chrome/browser/printing/print_job_unittest.cc index 06291e4..9c2d2c1 100644 --- a/chrome/browser/printing/print_job_unittest.cc +++ b/chrome/browser/printing/print_job_unittest.cc @@ -2,15 +2,13 @@ // 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 "printing/printed_pages_source.h" #include "testing/gtest/include/gtest/gtest.h" @@ -26,9 +24,8 @@ class TestSource : public printing::PrintedPagesSource { class TestPrintJobWorker : public printing::PrintJobWorker { public: explicit TestPrintJobWorker(printing::PrintJobWorkerOwner* owner) - : printing::PrintJobWorker(content::ChildProcessHost::kInvalidUniqueID, - content::ChildProcessHost::kInvalidUniqueID, - owner) {} + : printing::PrintJobWorker(owner) { + } friend class TestOwner; }; diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc index 2dcd788..9ee5262 100644 --- a/chrome/browser/printing/print_job_worker.cc +++ b/chrome/browser/printing/print_job_worker.cc @@ -17,8 +17,6 @@ #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" @@ -37,66 +35,7 @@ void HoldRefCallback(const scoped_refptr<printing::PrintJobWorkerOwner>& owner, callback.Run(); } -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<PrintingUIWebContentsObserver> web_contents_observer_; - base::WeakPtrFactory<PrintingContextDelegate> 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)); -} +} // namespace void NotificationCallback(PrintJobWorkerOwner* print_job, JobEventDetails::Type detail_type, @@ -110,18 +49,13 @@ void NotificationCallback(PrintJobWorkerOwner* print_job, content::Details<JobEventDetails>(details)); } -} // namespace - -PrintJobWorker::PrintJobWorker(int render_process_id, - int render_view_id, - PrintJobWorkerOwner* owner) +PrintJobWorker::PrintJobWorker(PrintJobWorkerOwner* owner) : owner_(owner), thread_("Printing_Worker"), weak_factory_(this) { // The object is created in the IO thread. DCHECK(owner_->RunsTasksOnCurrentThread()); - printing_context_delegate_.reset( - new PrintingContextDelegate(render_process_id, render_view_id)); - printing_context_ = PrintingContext::Create(printing_context_delegate_.get()); + printing_context_.reset(PrintingContext::Create( + g_browser_process->GetApplicationLocale())); } PrintJobWorker::~PrintJobWorker() { @@ -144,6 +78,7 @@ void PrintJobWorker::SetPrintDestination( void PrintJobWorker::GetSettings( bool ask_user_for_settings, + scoped_ptr<PrintingUIWebContentsObserver> web_contents_observer, int document_page_count, bool has_selection, MarginType margin_type) { @@ -166,9 +101,12 @@ 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_), @@ -193,7 +131,6 @@ void PrintJobWorker::SetSettings( void PrintJobWorker::UpdatePrintSettings( scoped_ptr<base::DictionaryValue> new_settings) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); PrintingContext::Result result = printing_context_->UpdatePrintSettings(*new_settings); GetSettingsDone(result); @@ -218,12 +155,18 @@ void PrintJobWorker::GetSettingsDone(PrintingContext::Result result) { } void PrintJobWorker::GetSettingsWithUI( + scoped_ptr<PrintingUIWebContentsObserver> 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( - document_page_count, - has_selection, + parent_view, document_page_count, has_selection, base::Bind(&PrintJobWorker::GetSettingsWithUIDone, base::Unretained(this))); } @@ -373,7 +316,7 @@ void PrintJobWorker::OnDocumentDone() { } owner_->PostTask(FROM_HERE, - base::Bind(&NotificationCallback, + base::Bind(NotificationCallback, make_scoped_refptr(owner_), JobEventDetails::DOC_DONE, document_, @@ -389,7 +332,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_, @@ -428,7 +371,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_, @@ -442,7 +385,7 @@ void PrintJobWorker::OnFailure() { scoped_refptr<PrintJobWorkerOwner> 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 6c86774..2f6d237 100644 --- a/chrome/browser/printing/print_job_worker.h +++ b/chrome/browser/printing/print_job_worker.h @@ -9,11 +9,10 @@ #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/print_job_constants.h" #include "printing/printing_context.h" +#include "printing/print_job_constants.h" namespace base { class DictionaryValue; @@ -25,6 +24,7 @@ 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,9 +33,7 @@ class PrintedPage; // PrintJob always outlives its worker instance. class PrintJobWorker { public: - PrintJobWorker(int render_process_id, - int render_view_id, - PrintJobWorkerOwner* owner); + explicit PrintJobWorker(PrintJobWorkerOwner* owner); virtual ~PrintJobWorker(); void SetNewOwner(PrintJobWorkerOwner* new_owner); @@ -48,12 +46,14 @@ class PrintJobWorker { // Print... dialog box will be shown to ask the user his preference. void GetSettings( bool ask_user_for_settings, + scoped_ptr<PrintingUIWebContentsObserver> web_contents_observer, int document_page_count, bool has_selection, MarginType margin_type); // Set the new print settings. - void SetSettings(scoped_ptr<base::DictionaryValue> new_settings); + void SetSettings( + scoped_ptr<base::DictionaryValue> 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,6 +112,7 @@ 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<PrintingUIWebContentsObserver> web_contents_observer, int document_page_count, bool has_selection); @@ -131,11 +132,6 @@ class PrintJobWorker { // systems. void UseDefaultSettings(); - // Printing context delegate. - scoped_ptr<PrintingContext::Delegate, - content::BrowserThread::DeleteOnUIThread> - printing_context_delegate_; - // Information about the printer setting. scoped_ptr<PrintingContext> printing_context_; diff --git a/chrome/browser/printing/printer_query.cc b/chrome/browser/printing/printer_query.cc index ba2de8c..0120ba2 100644 --- a/chrome/browser/printing/printer_query.cc +++ b/chrome/browser/printing/printer_query.cc @@ -14,8 +14,8 @@ namespace printing { -PrinterQuery::PrinterQuery(int render_process_id, int render_view_id) - : worker_(new PrintJobWorker(render_process_id, render_view_id, this)), +PrinterQuery::PrinterQuery() + : worker_(new PrintJobWorker(this)), is_print_dialog_box_shown_(false), cookie_(PrintSettings::NewCookie()), last_status_(PrintingContext::FAILED) { @@ -66,6 +66,7 @@ int PrinterQuery::cookie() const { void PrinterQuery::GetSettings( GetSettingsAskParam ask_user_for_settings, + scoped_ptr<PrintingUIWebContentsObserver> web_contents_observer, int expected_page_count, bool has_selection, MarginType margin_type, @@ -81,6 +82,7 @@ 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 84cf24a..24cad0b 100644 --- a/chrome/browser/printing/printer_query.h +++ b/chrome/browser/printing/printer_query.h @@ -19,6 +19,7 @@ namespace printing { class PrintDestinationInterface; class PrintJobWorker; +class PrintingUIWebContentsObserver; // Query the printer for settings. class PrinterQuery : public PrintJobWorkerOwner { @@ -29,7 +30,7 @@ class PrinterQuery : public PrintJobWorkerOwner { ASK_USER, }; - PrinterQuery(int render_process_id, int render_view_id); + PrinterQuery(); // PrintJobWorkerOwner implementation. virtual void GetSettingsDone(const PrintSettings& new_settings, @@ -44,6 +45,7 @@ class PrinterQuery : public PrintJobWorkerOwner { // |ask_for_user_settings| is DEFAULTS. void GetSettings( GetSettingsAskParam ask_user_for_settings, + scoped_ptr<PrintingUIWebContentsObserver> 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 9e1096a..37c5984 100644 --- a/chrome/browser/printing/printing_message_filter.cc +++ b/chrome/browser/printing/printing_message_filter.cc @@ -258,6 +258,49 @@ 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<PrinterQuery> printer_query) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + content::WebContents* wc = GetWebContentsForRenderView(render_view_id); + if (wc) { + scoped_ptr<PrintingUIWebContentsObserver> 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<PrinterQuery> 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(); @@ -272,22 +315,23 @@ void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) { return; } printer_query = queue_->PopPrinterQuery(0); - if (!printer_query) { - printer_query = - queue_->CreatePrinterQuery(render_process_id_, reply_msg->routing_id()); - } + if (!printer_query) + printer_query = queue_->CreatePrinterQuery(); // Loads default settings. This is asynchronous, only the IPC message sender // will hang until the settings are retrieved. - printer_query->GetSettings( - PrinterQuery::DEFAULTS, - 0, - false, - DEFAULT_MARGINS, - base::Bind(&PrintingMessageFilter::OnGetDefaultPrintSettingsReply, - this, - printer_query, - reply_msg)); + 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)); } void PrintingMessageFilter::OnGetDefaultPrintSettingsReply( @@ -319,19 +363,21 @@ void PrintingMessageFilter::OnScriptedPrint( IPC::Message* reply_msg) { scoped_refptr<PrinterQuery> printer_query = queue_->PopPrinterQuery(params.cookie); - 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)); + 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)); } void PrintingMessageFilter::OnScriptedPrintReply( @@ -394,10 +440,8 @@ void PrintingMessageFilter::OnUpdatePrintSettings( return; } printer_query = queue_->PopPrinterQuery(document_cookie); - if (!printer_query) { - printer_query = - queue_->CreatePrinterQuery(render_process_id_, reply_msg->routing_id()); - } + if (!printer_query) + printer_query = queue_->CreatePrinterQuery(); 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 551fb7d..d7614ff 100644 --- a/chrome/browser/printing/printing_message_filter.h +++ b/chrome/browser/printing/printing_message_filter.h @@ -32,6 +32,7 @@ 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. @@ -83,6 +84,16 @@ 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<PrinterQuery> printer_query); + + void OnGetPrintSettingsFailed(const base::Closure& callback, + scoped_refptr<PrinterQuery> 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 e804368..3af9562 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc @@ -261,19 +261,10 @@ 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::PrintingContext> printing_context( - printing::PrintingContext::Create(&delegate)); + printing::PrintingContext::Create( + g_browser_process->GetApplicationLocale())); if (printing::PrintingContext::OK != printing_context->UsePdfSettings() || printing_context->settings().device_units_per_inch() <= 0) { return gfx::Size(); 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 49607090..de5f5fe 100644 --- a/content/browser/renderer_host/pepper/pepper_print_settings_manager.cc +++ b/content/browser/renderer_host/pepper/pepper_print_settings_manager.cc @@ -5,8 +5,6 @@ #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" @@ -44,23 +42,12 @@ 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<printing::PrintingContext> context( - printing::PrintingContext::Create(&delegate)); + printing::PrintingContext::Create(std::string())); 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 ec65c28..8a5daaf 100644 --- a/printing/emf_win_unittest.cc +++ b/printing/emf_win_unittest.cc @@ -22,13 +22,11 @@ #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, public PrintingContext::Delegate { +class EmfPrintingTest : public testing::Test { public: typedef testing::Test Parent; static bool IsTestCaseDisabled() { @@ -39,16 +37,14 @@ class EmfPrintingTest : public testing::Test, public PrintingContext::Delegate { 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; @@ -87,7 +83,7 @@ TEST_F(EmfPrintingTest, Enumerate) { settings.set_device_name(L"UnitTest Printer"); // Initialize it. - scoped_ptr<PrintingContext> context(PrintingContext::Create(this)); + scoped_ptr<PrintingContext> context(PrintingContext::Create(std::string())); EXPECT_EQ(context->InitWithSettings(settings), PrintingContext::OK); base::FilePath emf_file; diff --git a/printing/printing_context.cc b/printing/printing_context.cc index d2b1e68..c7f22a5 100644 --- a/printing/printing_context.cc +++ b/printing/printing_context.cc @@ -18,12 +18,11 @@ namespace { const float kCloudPrintMarginInch = 0.25; } -PrintingContext::PrintingContext(Delegate* delegate) - : delegate_(delegate), - dialog_box_dismissed_(false), +PrintingContext::PrintingContext(const std::string& app_locale) + : dialog_box_dismissed_(false), in_print_job_(false), - abort_printing_(false) { - CHECK(delegate_); + abort_printing_(false), + app_locale_(app_locale) { } PrintingContext::~PrintingContext() { diff --git a/printing/printing_context.h b/printing/printing_context.h index 875c070..823a5af 100644 --- a/printing/printing_context.h +++ b/printing/printing_context.h @@ -25,19 +25,6 @@ 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, @@ -55,7 +42,8 @@ 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(int max_pages, + virtual void AskUserForSettings(gfx::NativeView parent_view, + int max_pages, bool has_selection, const PrintSettingsCallback& callback) = 0; @@ -110,8 +98,9 @@ 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. - static scoped_ptr<PrintingContext> Create(Delegate* delegate); + // implement this method to create an object of their implementation. The + // caller owns the returned object. + static PrintingContext* Create(const std::string& app_locale); void set_margin_type(MarginType type); @@ -120,7 +109,7 @@ class PRINTING_EXPORT PrintingContext { } protected: - explicit PrintingContext(Delegate* delegate); + explicit PrintingContext(const std::string& app_locale); // Reinitializes the settings for object reuse. void ResetSettings(); @@ -131,9 +120,6 @@ 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_; @@ -143,6 +129,9 @@ 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 39f1c6d..5729267 100644 --- a/printing/printing_context_android.cc +++ b/printing/printing_context_android.cc @@ -61,8 +61,8 @@ void GetPageRanges(JNIEnv* env, namespace printing { // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>(new PrintingContextAndroid(delegate)); +PrintingContext* PrintingContext::Create(const std::string& app_locale) { + return new PrintingContextAndroid(app_locale); } // static @@ -71,8 +71,8 @@ void PrintingContextAndroid::PdfWritingDone(int fd, bool success) { Java_PrintingContext_pdfWritingDone(env, fd, success); } -PrintingContextAndroid::PrintingContextAndroid(Delegate* delegate) - : PrintingContext(delegate) { +PrintingContextAndroid::PrintingContextAndroid(const std::string& app_locale) + : PrintingContext(app_locale) { // The constructor is run in the IO thread. } @@ -80,6 +80,7 @@ PrintingContextAndroid::~PrintingContextAndroid() { } void PrintingContextAndroid::AskUserForSettings( + gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -148,8 +149,7 @@ gfx::Size PrintingContextAndroid::GetPdfPaperSizeDeviceUnits() { int32_t width = 0; int32_t height = 0; UErrorCode error = U_ZERO_ERROR; - ulocdata_getPaperSize( - delegate_->GetAppLocale().c_str(), &height, &width, &error); + ulocdata_getPaperSize(app_locale_.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 56068a1..b198e7b 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(Delegate* delegate); + explicit PrintingContextAndroid(const std::string& app_locale); virtual ~PrintingContextAndroid(); // Called when the page is successfully written to a PDF using the file @@ -32,6 +32,7 @@ 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 c267478..3b6d2ee 100644 --- a/printing/printing_context_linux.cc +++ b/printing/printing_context_linux.cc @@ -27,12 +27,13 @@ gfx::Size (*get_pdf_paper_size_)( namespace printing { // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>(new PrintingContextLinux(delegate)); +PrintingContext* PrintingContext::Create(const std::string& app_locale) { + return static_cast<PrintingContext*>(new PrintingContextLinux(app_locale)); } -PrintingContextLinux::PrintingContextLinux(Delegate* delegate) - : PrintingContext(delegate), print_dialog_(NULL) { +PrintingContextLinux::PrintingContextLinux(const std::string& app_locale) + : PrintingContext(app_locale), + print_dialog_(NULL) { } PrintingContextLinux::~PrintingContextLinux() { @@ -66,6 +67,7 @@ void PrintingContextLinux::PrintDocument(const Metafile* metafile) { } void PrintingContextLinux::AskUserForSettings( + gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -77,8 +79,7 @@ void PrintingContextLinux::AskUserForSettings( return; } - print_dialog_->ShowDialog( - delegate_->GetParentView(), has_selection, callback); + print_dialog_->ShowDialog(parent_view, has_selection, callback); } PrintingContext::Result PrintingContextLinux::UseDefaultSettings() { diff --git a/printing/printing_context_linux.h b/printing/printing_context_linux.h index 984d7dc..3076014 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(Delegate* delegate); + explicit PrintingContextLinux(const std::string& app_locale); virtual ~PrintingContextLinux(); // Sets the function that creates the print dialog. @@ -38,6 +38,7 @@ 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 9eb924a..f16ef54 100644 --- a/printing/printing_context_mac.h +++ b/printing/printing_context_mac.h @@ -21,11 +21,12 @@ namespace printing { class PRINTING_EXPORT PrintingContextMac : public PrintingContext { public: - explicit PrintingContextMac(Delegate* delegate); + explicit PrintingContextMac(const std::string& app_locale); 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 fa907b5..9bbe5ac1 100644 --- a/printing/printing_context_mac.mm +++ b/printing/printing_context_mac.mm @@ -68,12 +68,12 @@ PMPaper MatchPaper(CFArrayRef paper_list, } // namespace // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>(new PrintingContextMac(delegate)); +PrintingContext* PrintingContext::Create(const std::string& app_locale) { + return static_cast<PrintingContext*>(new PrintingContextMac(app_locale)); } -PrintingContextMac::PrintingContextMac(Delegate* delegate) - : PrintingContext(delegate), +PrintingContextMac::PrintingContextMac(const std::string& app_locale) + : PrintingContext(app_locale), print_info_([[NSPrintInfo sharedPrintInfo] copy]), context_(NULL) { } @@ -83,6 +83,7 @@ PrintingContextMac::~PrintingContextMac() { } void PrintingContextMac::AskUserForSettings( + gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -114,7 +115,6 @@ void PrintingContextMac::AskUserForSettings( [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 fd6e166..4768e4d 100644 --- a/printing/printing_context_no_system_dialog.cc +++ b/printing/printing_context_no_system_dialog.cc @@ -15,13 +15,13 @@ namespace printing { // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>( - new PrintingContextNoSystemDialog(delegate)); +PrintingContext* PrintingContext::Create(const std::string& app_locale) { + return static_cast<PrintingContext*>( + new PrintingContextNoSystemDialog(app_locale)); } -PrintingContextNoSystemDialog::PrintingContextNoSystemDialog(Delegate* delegate) - : PrintingContext(delegate) { +PrintingContextNoSystemDialog::PrintingContextNoSystemDialog( + const std::string& app_locale) : PrintingContext(app_locale) { } PrintingContextNoSystemDialog::~PrintingContextNoSystemDialog() { @@ -29,6 +29,7 @@ PrintingContextNoSystemDialog::~PrintingContextNoSystemDialog() { } void PrintingContextNoSystemDialog::AskUserForSettings( + gfx::NativeView parent_view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { @@ -53,8 +54,7 @@ gfx::Size PrintingContextNoSystemDialog::GetPdfPaperSizeDeviceUnits() { int32_t width = 0; int32_t height = 0; UErrorCode error = U_ZERO_ERROR; - ulocdata_getPaperSize( - delegate_->GetAppLocale().c_str(), &height, &width, &error); + ulocdata_getPaperSize(app_locale_.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 fbc69aa..5472a81 100644 --- a/printing/printing_context_no_system_dialog.h +++ b/printing/printing_context_no_system_dialog.h @@ -17,11 +17,12 @@ namespace printing { class PRINTING_EXPORT PrintingContextNoSystemDialog : public PrintingContext { public: - explicit PrintingContextNoSystemDialog(Delegate* delegate); + explicit PrintingContextNoSystemDialog(const std::string& app_locale); 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 dd0e2c4..b0a9644 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -45,26 +45,24 @@ HWND GetRootWindow(gfx::NativeView view) { namespace printing { // static -scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { - return make_scoped_ptr<PrintingContext>(new PrintingContextWin(delegate)); +PrintingContext* PrintingContext::Create(const std::string& app_locale) { + return static_cast<PrintingContext*>(new PrintingContextWin(app_locale)); } -PrintingContextWin::PrintingContextWin(Delegate* delegate) - : PrintingContext(delegate), context_(NULL), dialog_box_(NULL) { -} +PrintingContextWin::PrintingContextWin(const std::string& app_locale) + : PrintingContext(app_locale), context_(NULL), dialog_box_(NULL) {} PrintingContextWin::~PrintingContextWin() { ReleaseContext(); } void PrintingContextWin::AskUserForSettings( - int max_pages, - bool has_selection, + gfx::NativeView view, int max_pages, bool has_selection, const PrintSettingsCallback& callback) { DCHECK(!in_print_job_); dialog_box_dismissed_ = false; - HWND window = GetRootWindow(delegate_->GetParentView()); + HWND window = GetRootWindow(view); DCHECK(window); // Show the OS-dependent dialog box. diff --git a/printing/printing_context_win.h b/printing/printing_context_win.h index 94fd041..6c1e420 100644 --- a/printing/printing_context_win.h +++ b/printing/printing_context_win.h @@ -19,11 +19,12 @@ namespace printing { class PRINTING_EXPORT PrintingContextWin : public PrintingContext { public: - explicit PrintingContextWin(Delegate* delegate); - virtual ~PrintingContextWin(); + explicit PrintingContextWin(const std::string& app_locale); + ~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 1d27935..c9facc9 100644 --- a/printing/printing_context_win_unittest.cc +++ b/printing/printing_context_win_unittest.cc @@ -22,17 +22,12 @@ namespace printing { // This test is automatically disabled if no printer is available. -class PrintingContextTest : public PrintingTest<testing::Test>, - public PrintingContext::Delegate { +class PrintingContextTest : public PrintingTest<testing::Test> { 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_; } @@ -42,7 +37,7 @@ class PrintingContextTest : public PrintingTest<testing::Test>, class MockPrintingContextWin : public PrintingContextWin { public: - MockPrintingContextWin(Delegate* delegate) : PrintingContextWin(delegate) {} + MockPrintingContextWin() : PrintingContextWin("") {} protected: // This is a fake PrintDlgEx implementation that sets the right fields in @@ -164,7 +159,7 @@ TEST_F(PrintingContextTest, Base) { PrintSettings settings; settings.set_device_name(GetDefaultPrinter()); // Initialize it. - scoped_ptr<PrintingContext> context(PrintingContext::Create(this)); + scoped_ptr<PrintingContext> context(PrintingContext::Create(std::string())); EXPECT_EQ(PrintingContext::OK, context->InitWithSettings(settings)); // The print may lie to use and may not support world transformation. @@ -179,12 +174,10 @@ TEST_F(PrintingContextTest, PrintAll) { if (IsTestCaseDisabled()) return; - MockPrintingContextWin context(this); + MockPrintingContextWin context; context.AskUserForSettings( - 123, - false, - base::Bind(&PrintingContextTest::PrintSettingsCallback, - base::Unretained(this))); + NULL, 123, false, base::Bind(&PrintingContextTest::PrintSettingsCallback, + base::Unretained(this))); EXPECT_EQ(PrintingContext::OK, result()); PrintSettings settings = context.settings(); EXPECT_EQ(settings.ranges().size(), 0); |
