summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfinnur <finnur@chromium.org>2014-08-25 03:08:15 -0700
committerCommit bot <commit-bot@chromium.org>2014-08-25 10:09:09 +0000
commitc921afdcc249a89bd9e8cc1cc898e4c320cc5d03 (patch)
treed3a070f77fb354815c81dcd1d993783d298deab0
parentbb1bd87a4fad403340fe8e3168552a933954a535 (diff)
downloadchromium_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}
-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.cc9
-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.cc104
-rw-r--r--chrome/browser/printing/printing_message_filter.h11
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_handler.cc13
-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/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
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);