summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@chromium.org>2014-08-26 01:57:54 -0700
committerVitaly Buka <vitalybuka@chromium.org>2014-08-26 09:00:31 +0000
commitbd7c981343caf492e552ae6c9498a15bbc38f1c7 (patch)
treedb09e4d4292f5ca88788635fe0e1f1439f4d9106
parent4d18cc81f71b4edf191e359526224080e275d65e (diff)
downloadchromium_src-bd7c981343caf492e552ae6c9498a15bbc38f1c7.zip
chromium_src-bd7c981343caf492e552ae6c9498a15bbc38f1c7.tar.gz
chromium_src-bd7c981343caf492e552ae6c9498a15bbc38f1c7.tar.bz2
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}
-rw-r--r--chrome/browser/printing/print_job_manager.cc7
-rw-r--r--chrome/browser/printing/print_job_manager.h4
-rw-r--r--chrome/browser/printing/print_job_unittest.cc27
-rw-r--r--chrome/browser/printing/print_job_worker.cc97
-rw-r--r--chrome/browser/printing/print_job_worker.h18
-rw-r--r--chrome/browser/printing/printer_query.cc6
-rw-r--r--chrome/browser/printing/printer_query.h4
-rw-r--r--chrome/browser/printing/printing_message_filter.cc113
-rw-r--r--chrome/browser/printing/printing_message_filter.h11
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_handler.cc27
-rw-r--r--content/browser/renderer_host/pepper/pepper_print_settings_manager.cc15
-rw-r--r--printing/emf_win_unittest.cc12
-rw-r--r--printing/print_job_constants.cc6
-rw-r--r--printing/print_job_constants.h2
-rw-r--r--printing/printing_context.cc9
-rw-r--r--printing/printing_context.h29
-rw-r--r--printing/printing_context_android.cc12
-rw-r--r--printing/printing_context_android.h3
-rw-r--r--printing/printing_context_linux.cc13
-rw-r--r--printing/printing_context_linux.h3
-rw-r--r--printing/printing_context_mac.h3
-rw-r--r--printing/printing_context_mac.mm10
-rw-r--r--printing/printing_context_no_system_dialog.cc14
-rw-r--r--printing/printing_context_no_system_dialog.h3
-rw-r--r--printing/printing_context_win.cc14
-rw-r--r--printing/printing_context_win.h5
-rw-r--r--printing/printing_context_win_unittest.cc19
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 56c71ac..9ba9f46 100644
--- a/chrome/browser/printing/print_job_manager.cc
+++ b/chrome/browser/printing/print_job_manager.cc
@@ -49,8 +49,11 @@ scoped_refptr<PrinterQuery> PrintQueriesQueue::PopPrinterQuery(
return NULL;
}
-scoped_refptr<PrinterQuery> PrintQueriesQueue::CreatePrinterQuery() {
- scoped_refptr<PrinterQuery> job = new printing::PrinterQuery;
+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);
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 9d03d9a3..5efd966 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<PrintQueriesQueue> {
scoped_refptr<PrinterQuery> PopPrinterQuery(int document_cookie);
// Creates new query.
- scoped_refptr<PrinterQuery> CreatePrinterQuery();
+ scoped_refptr<PrinterQuery> 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 9c2d2c1..12a3dd9 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<printing::PrintJob> 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<printing::PrintJob> job(new TestPrintJob(&check));
diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc
index 9ee5262..2dcd788 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<printing::PrintJobWorkerOwner>& 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<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));
+}
void NotificationCallback(PrintJobWorkerOwner* print_job,
JobEventDetails::Type detail_type,
@@ -49,13 +110,18 @@ void NotificationCallback(PrintJobWorkerOwner* print_job,
content::Details<JobEventDetails>(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<PrintingUIWebContentsObserver> 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<base::DictionaryValue> 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<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(
- 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<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 2f6d237..6c86774 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<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,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<PrintingUIWebContentsObserver> web_contents_observer,
int document_page_count,
bool has_selection);
@@ -132,6 +131,11 @@ 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 0120ba2..ba2de8c 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<PrintingUIWebContentsObserver> 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 24cad0b..84cf24a 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<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 37c5984..14657d79 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<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();
@@ -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<PrinterQuery> 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 d7614ff..551fb7d 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<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 f95cabf..f872501 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::PrintingContext> 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<PrintPreviewUI*>(
- web_ui()->GetController());
+ PrintPreviewUI* print_preview_ui =
+ static_cast<PrintPreviewUI*>(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 de5f5fe..49607090 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<printing::PrintingContext> 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 8a5daaf..ec65c28 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<PrintingContext> context(PrintingContext::Create(std::string()));
+ scoped_ptr<PrintingContext> 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 8ac5db4..6ac461c 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 257cba6..646191b 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 c7f22a5..d2b1e68 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 823a5af..875c070 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<PrintingContext> 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 5729267..39f1c6d 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> PrintingContext::Create(Delegate* delegate) {
+ return make_scoped_ptr<PrintingContext>(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 b198e7b..56068a1 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 3b6d2ee..c267478 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<PrintingContext*>(new PrintingContextLinux(app_locale));
+scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
+ return make_scoped_ptr<PrintingContext>(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 3076014..984d7dc 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 f16ef54..9eb924a 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 9bbe5ac1..fa907b5 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<PrintingContext*>(new PrintingContextMac(app_locale));
+scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
+ return make_scoped_ptr<PrintingContext>(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 @@ PrintingContextMac::~PrintingContextMac() {
}
void PrintingContextMac::AskUserForSettings(
- gfx::NativeView parent_view,
int max_pages,
bool has_selection,
const PrintSettingsCallback& callback) {
@@ -115,6 +114,7 @@ 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 4768e4d..fd6e166 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<PrintingContext*>(
- new PrintingContextNoSystemDialog(app_locale));
+scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
+ return make_scoped_ptr<PrintingContext>(
+ 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 5472a81..fbc69aa 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 b0a9644..dd0e2c4 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<PrintingContext*>(new PrintingContextWin(app_locale));
+scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
+ return make_scoped_ptr<PrintingContext>(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 6c1e420..94fd041 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 c9facc9..1d27935 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<testing::Test> {
+class PrintingContextTest : public PrintingTest<testing::Test>,
+ 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<testing::Test> {
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<PrintingContext> context(PrintingContext::Create(std::string()));
+ scoped_ptr<PrintingContext> 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);