| Index: chrome/browser/printing/print_view_manager_base.cc
|
| diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager_base.cc
|
| similarity index 67%
|
| copy from chrome/browser/printing/print_view_manager.cc
|
| copy to chrome/browser/printing/print_view_manager_base.cc
|
| index 7ed48ac70b5461d8f474153c7c331aa479036a47..89c7bd7678330676537e138708e563498f1bb1b3 100644
|
| --- a/chrome/browser/printing/print_view_manager.cc
|
| +++ b/chrome/browser/printing/print_view_manager_base.cc
|
| @@ -1,30 +1,22 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| // 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_view_manager.h"
|
| +#include "chrome/browser/printing/print_view_manager_base.h"
|
|
|
| #include <map>
|
|
|
| #include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/lazy_instance.h"
|
| #include "base/memory/scoped_ptr.h"
|
| -#include "base/metrics/histogram.h"
|
| #include "base/prefs/pref_service.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/timer/timer.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/browser/printing/print_error_dialog.h"
|
| #include "chrome/browser/printing/print_job.h"
|
| #include "chrome/browser/printing/print_job_manager.h"
|
| -#include "chrome/browser/printing/print_preview_dialog_controller.h"
|
| -#include "chrome/browser/printing/print_view_manager_observer.h"
|
| #include "chrome/browser/printing/printer_query.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/common/print_messages.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -35,27 +27,24 @@
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/browser/web_contents_view.h"
|
| #include "grit/generated_resources.h"
|
| -#include "printing/metafile.h"
|
| #include "printing/metafile_impl.h"
|
| -#include "printing/print_destination_interface.h"
|
| #include "printing/printed_document.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| +#if defined(OS_WIN)
|
| +#include "base/command_line.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#endif
|
| +
|
| +#if defined(ENABLE_FULL_PRINTING)
|
| +#include "chrome/browser/printing/print_error_dialog.h"
|
| +#endif
|
| +
|
| using base::TimeDelta;
|
| using content::BrowserThread;
|
| -using content::WebContents;
|
| -
|
| -DEFINE_WEB_CONTENTS_USER_DATA_KEY(printing::PrintViewManager);
|
|
|
| namespace {
|
|
|
| -// Keeps track of pending scripted print preview closures.
|
| -// No locking, only access on the UI thread.
|
| -typedef std::map<content::RenderProcessHost*, base::Closure>
|
| - ScriptedPrintPreviewClosureMap;
|
| -static base::LazyInstance<ScriptedPrintPreviewClosureMap>
|
| - g_scripted_print_preview_closure_map = LAZY_INSTANCE_INITIALIZER;
|
| -
|
| // Limits memory usage by raster to 64 MiB.
|
| const int kMaxRasterSizeInPixels = 16*1024*1024;
|
|
|
| @@ -63,15 +52,12 @@ const int kMaxRasterSizeInPixels = 16*1024*1024;
|
|
|
| namespace printing {
|
|
|
| -PrintViewManager::PrintViewManager(content::WebContents* web_contents)
|
| +PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents)
|
| : content::WebContentsObserver(web_contents),
|
| number_pages_(0),
|
| printing_succeeded_(false),
|
| inside_inner_message_loop_(false),
|
| - observer_(NULL),
|
| cookie_(0),
|
| - print_preview_state_(NOT_PREVIEWING),
|
| - scripted_print_preview_rph_(NULL),
|
| tab_content_blocked_(false) {
|
| #if defined(OS_POSIX) && !defined(OS_MACOSX)
|
| expecting_first_page_ = true;
|
| @@ -83,109 +69,31 @@ PrintViewManager::PrintViewManager(content::WebContents* web_contents)
|
| printing_enabled_.Init(
|
| prefs::kPrintingEnabled,
|
| profile->GetPrefs(),
|
| - base::Bind(&PrintViewManager::UpdateScriptedPrintingBlocked,
|
| + base::Bind(&PrintViewManagerBase::UpdateScriptedPrintingBlocked,
|
| base::Unretained(this)));
|
| }
|
|
|
| -PrintViewManager::~PrintViewManager() {
|
| - DCHECK_EQ(NOT_PREVIEWING, print_preview_state_);
|
| +PrintViewManagerBase::~PrintViewManagerBase() {
|
| ReleasePrinterQuery();
|
| DisconnectFromCurrentPrintJob();
|
| }
|
|
|
| -bool PrintViewManager::PrintNow() {
|
| +bool PrintViewManagerBase::PrintNow() {
|
| return PrintNowInternal(new PrintMsg_PrintPages(routing_id()));
|
| }
|
|
|
| -bool PrintViewManager::PrintForSystemDialogNow() {
|
| - return PrintNowInternal(new PrintMsg_PrintForSystemDialog(routing_id()));
|
| -}
|
| -
|
| -bool PrintViewManager::AdvancedPrintNow() {
|
| - PrintPreviewDialogController* dialog_controller =
|
| - PrintPreviewDialogController::GetInstance();
|
| - if (!dialog_controller)
|
| - return false;
|
| - WebContents* print_preview_dialog =
|
| - dialog_controller->GetPrintPreviewForContents(web_contents());
|
| - if (print_preview_dialog) {
|
| - if (!print_preview_dialog->GetWebUI())
|
| - return false;
|
| - PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
|
| - print_preview_dialog->GetWebUI()->GetController());
|
| - print_preview_ui->OnShowSystemDialog();
|
| - return true;
|
| - } else {
|
| - return PrintNow();
|
| - }
|
| -}
|
| -
|
| -bool PrintViewManager::PrintToDestination() {
|
| - // TODO(mad): Remove this once we can send user metrics from the metro driver.
|
| - // crbug.com/142330
|
| - UMA_HISTOGRAM_ENUMERATION("Metro.Print", 0, 2);
|
| - // TODO(mad): Use a passed in destination interface instead.
|
| - g_browser_process->print_job_manager()->SetPrintDestination(
|
| - printing::CreatePrintDestination());
|
| - return PrintNowInternal(new PrintMsg_PrintPages(routing_id()));
|
| -}
|
| -
|
| -bool PrintViewManager::PrintPreviewNow(bool selection_only) {
|
| - // Users can send print commands all they want and it is beyond
|
| - // PrintViewManager's control. Just ignore the extra commands.
|
| - // See http://crbug.com/136842 for example.
|
| - if (print_preview_state_ != NOT_PREVIEWING)
|
| - return false;
|
| -
|
| - if (!PrintNowInternal(new PrintMsg_InitiatePrintPreview(routing_id(),
|
| - selection_only))) {
|
| - return false;
|
| - }
|
| -
|
| - print_preview_state_ = USER_INITIATED_PREVIEW;
|
| - return true;
|
| -}
|
| -
|
| -void PrintViewManager::PrintPreviewForWebNode() {
|
| - DCHECK_EQ(NOT_PREVIEWING, print_preview_state_);
|
| - print_preview_state_ = USER_INITIATED_PREVIEW;
|
| -}
|
| -
|
| -void PrintViewManager::PrintPreviewDone() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK_NE(NOT_PREVIEWING, print_preview_state_);
|
| -
|
| - if (print_preview_state_ == SCRIPTED_PREVIEW) {
|
| - ScriptedPrintPreviewClosureMap& map =
|
| - g_scripted_print_preview_closure_map.Get();
|
| - ScriptedPrintPreviewClosureMap::iterator it =
|
| - map.find(scripted_print_preview_rph_);
|
| - CHECK(it != map.end());
|
| - it->second.Run();
|
| - map.erase(scripted_print_preview_rph_);
|
| - scripted_print_preview_rph_ = NULL;
|
| - }
|
| - print_preview_state_ = NOT_PREVIEWING;
|
| -}
|
| -
|
| -void PrintViewManager::UpdateScriptedPrintingBlocked() {
|
| +void PrintViewManagerBase::UpdateScriptedPrintingBlocked() {
|
| Send(new PrintMsg_SetScriptedPrintingBlocked(
|
| routing_id(),
|
| !printing_enabled_.GetValue() || tab_content_blocked_));
|
| }
|
|
|
| -void PrintViewManager::set_observer(PrintViewManagerObserver* observer) {
|
| - DCHECK(!observer || !observer_);
|
| - observer_ = observer;
|
| -}
|
| -
|
| -void PrintViewManager::StopNavigation() {
|
| +void PrintViewManagerBase::StopNavigation() {
|
| // Cancel the current job, wait for the worker to finish.
|
| TerminatePrintJob(true);
|
| }
|
|
|
| -void PrintViewManager::RenderProcessGone(base::TerminationStatus status) {
|
| - print_preview_state_ = NOT_PREVIEWING;
|
| +void PrintViewManagerBase::RenderProcessGone(base::TerminationStatus status) {
|
| ReleasePrinterQuery();
|
|
|
| if (!print_job_.get())
|
| @@ -200,30 +108,26 @@ void PrintViewManager::RenderProcessGone(base::TerminationStatus status) {
|
| }
|
| }
|
|
|
| -string16 PrintViewManager::RenderSourceName() {
|
| +string16 PrintViewManagerBase::RenderSourceName() {
|
| string16 name(web_contents()->GetTitle());
|
| if (name.empty())
|
| name = l10n_util::GetStringUTF16(IDS_DEFAULT_PRINT_DOCUMENT_TITLE);
|
| return name;
|
| }
|
|
|
| -void PrintViewManager::OnDidGetPrintedPagesCount(int cookie, int number_pages) {
|
| +void PrintViewManagerBase::OnDidGetPrintedPagesCount(int cookie,
|
| + int number_pages) {
|
| DCHECK_GT(cookie, 0);
|
| DCHECK_GT(number_pages, 0);
|
| number_pages_ = number_pages;
|
| OpportunisticallyCreatePrintJob(cookie);
|
| }
|
|
|
| -void PrintViewManager::OnDidGetDocumentCookie(int cookie) {
|
| +void PrintViewManagerBase::OnDidGetDocumentCookie(int cookie) {
|
| cookie_ = cookie;
|
| }
|
|
|
| -void PrintViewManager::OnDidShowPrintDialog() {
|
| - if (observer_)
|
| - observer_->OnPrintDialogShown();
|
| -}
|
| -
|
| -void PrintViewManager::OnDidPrintPage(
|
| +void PrintViewManagerBase::OnDidPrintPage(
|
| const PrintHostMsg_DidPrintPage_Params& params) {
|
| if (!OpportunisticallyCreatePrintJob(params.document_cookie))
|
| return;
|
| @@ -290,14 +194,16 @@ void PrintViewManager::OnDidPrintPage(
|
| ShouldQuitFromInnerMessageLoop();
|
| }
|
|
|
| -void PrintViewManager::OnPrintingFailed(int cookie) {
|
| +void PrintViewManagerBase::OnPrintingFailed(int cookie) {
|
| if (cookie != cookie_) {
|
| NOTREACHED();
|
| return;
|
| }
|
|
|
| +#if defined(ENABLE_FULL_PRINTING)
|
| chrome::ShowPrintErrorDialog(
|
| web_contents()->GetView()->GetTopLevelNativeWindow());
|
| +#endif
|
|
|
| ReleasePrinterQuery();
|
|
|
| @@ -307,79 +213,29 @@ void PrintViewManager::OnPrintingFailed(int cookie) {
|
| content::NotificationService::NoDetails());
|
| }
|
|
|
| -void PrintViewManager::OnScriptedPrintPreview(bool source_is_modifiable,
|
| - IPC::Message* reply_msg) {
|
| - BrowserThread::CurrentlyOn(BrowserThread::UI);
|
| - ScriptedPrintPreviewClosureMap& map =
|
| - g_scripted_print_preview_closure_map.Get();
|
| - content::RenderProcessHost* rph = web_contents()->GetRenderProcessHost();
|
| -
|
| - // This should always be 0 once we get modal window.print().
|
| - if (map.count(rph) != 0) {
|
| - // Renderer already handling window.print() in another View.
|
| - Send(reply_msg);
|
| - return;
|
| - }
|
| - if (print_preview_state_ != NOT_PREVIEWING) {
|
| - // If a user initiated print dialog is already open, ignore the scripted
|
| - // print message.
|
| - DCHECK_EQ(USER_INITIATED_PREVIEW, print_preview_state_);
|
| - Send(reply_msg);
|
| - return;
|
| - }
|
| -
|
| - PrintPreviewDialogController* dialog_controller =
|
| - PrintPreviewDialogController::GetInstance();
|
| - if (!dialog_controller) {
|
| - Send(reply_msg);
|
| - return;
|
| - }
|
| -
|
| - print_preview_state_ = SCRIPTED_PREVIEW;
|
| - base::Closure callback =
|
| - base::Bind(&PrintViewManager::OnScriptedPrintPreviewReply,
|
| - base::Unretained(this),
|
| - reply_msg);
|
| - map[rph] = callback;
|
| - scripted_print_preview_rph_ = rph;
|
| -
|
| - dialog_controller->PrintPreview(web_contents());
|
| - PrintHostMsg_RequestPrintPreview_Params params;
|
| - params.is_modifiable = source_is_modifiable;
|
| - PrintPreviewUI::SetInitialParams(
|
| - dialog_controller->GetPrintPreviewForContents(web_contents()), params);
|
| -}
|
| -
|
| -void PrintViewManager::OnScriptedPrintPreviewReply(IPC::Message* reply_msg) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - Send(reply_msg);
|
| -}
|
| -
|
| -void PrintViewManager::DidStartLoading(
|
| +void PrintViewManagerBase::DidStartLoading(
|
| content::RenderViewHost* render_view_host) {
|
| UpdateScriptedPrintingBlocked();
|
| }
|
|
|
| -bool PrintViewManager::OnMessageReceived(const IPC::Message& message) {
|
| +bool PrintViewManagerBase::OnMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(PrintViewManager, message)
|
| + IPC_BEGIN_MESSAGE_MAP(PrintViewManagerBase, message)
|
| IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPrintedPagesCount,
|
| OnDidGetPrintedPagesCount)
|
| IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDocumentCookie,
|
| OnDidGetDocumentCookie)
|
| - IPC_MESSAGE_HANDLER(PrintHostMsg_DidShowPrintDialog, OnDidShowPrintDialog)
|
| IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrintPage, OnDidPrintPage)
|
| IPC_MESSAGE_HANDLER(PrintHostMsg_PrintingFailed, OnPrintingFailed)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_ScriptedPrintPreview,
|
| - OnScriptedPrintPreview)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| IPC_END_MESSAGE_MAP()
|
| return handled;
|
| }
|
|
|
| -void PrintViewManager::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| +void PrintViewManagerBase::Observe(
|
| + int type,
|
| + const content::NotificationSource& source,
|
| + const content::NotificationDetails& details) {
|
| switch (type) {
|
| case chrome::NOTIFICATION_PRINT_JOB_EVENT: {
|
| OnNotifyPrintJobEvent(*content::Details<JobEventDetails>(details).ptr());
|
| @@ -397,7 +253,7 @@ void PrintViewManager::Observe(int type,
|
| }
|
| }
|
|
|
| -void PrintViewManager::OnNotifyPrintJobEvent(
|
| +void PrintViewManagerBase::OnNotifyPrintJobEvent(
|
| const JobEventDetails& event_details) {
|
| switch (event_details.type()) {
|
| case JobEventDetails::FAILED: {
|
| @@ -446,7 +302,7 @@ void PrintViewManager::OnNotifyPrintJobEvent(
|
| }
|
| }
|
|
|
| -bool PrintViewManager::RenderAllMissingPagesNow() {
|
| +bool PrintViewManagerBase::RenderAllMissingPagesNow() {
|
| if (!print_job_.get() || !print_job_->is_job_pending())
|
| return false;
|
|
|
| @@ -482,7 +338,7 @@ bool PrintViewManager::RenderAllMissingPagesNow() {
|
| return true;
|
| }
|
|
|
| -void PrintViewManager::ShouldQuitFromInnerMessageLoop() {
|
| +void PrintViewManagerBase::ShouldQuitFromInnerMessageLoop() {
|
| // Look at the reason.
|
| DCHECK(print_job_->document());
|
| if (print_job_->document() &&
|
| @@ -495,7 +351,7 @@ void PrintViewManager::ShouldQuitFromInnerMessageLoop() {
|
| }
|
| }
|
|
|
| -bool PrintViewManager::CreateNewPrintJob(PrintJobWorkerOwner* job) {
|
| +bool PrintViewManagerBase::CreateNewPrintJob(PrintJobWorkerOwner* job) {
|
| DCHECK(!inside_inner_message_loop_);
|
|
|
| // Disconnect the current print_job_.
|
| @@ -522,7 +378,7 @@ bool PrintViewManager::CreateNewPrintJob(PrintJobWorkerOwner* job) {
|
| return true;
|
| }
|
|
|
| -void PrintViewManager::DisconnectFromCurrentPrintJob() {
|
| +void PrintViewManagerBase::DisconnectFromCurrentPrintJob() {
|
| // Make sure all the necessary rendered page are done. Don't bother with the
|
| // return value.
|
| bool result = RenderAllMissingPagesNow();
|
| @@ -543,13 +399,13 @@ void PrintViewManager::DisconnectFromCurrentPrintJob() {
|
| #endif
|
| }
|
|
|
| -void PrintViewManager::PrintingDone(bool success) {
|
| +void PrintViewManagerBase::PrintingDone(bool success) {
|
| if (!print_job_.get())
|
| return;
|
| Send(new PrintMsg_PrintingDone(routing_id(), success));
|
| }
|
|
|
| -void PrintViewManager::TerminatePrintJob(bool cancel) {
|
| +void PrintViewManagerBase::TerminatePrintJob(bool cancel) {
|
| if (!print_job_.get())
|
| return;
|
|
|
| @@ -569,7 +425,7 @@ void PrintViewManager::TerminatePrintJob(bool cancel) {
|
| ReleasePrintJob();
|
| }
|
|
|
| -void PrintViewManager::ReleasePrintJob() {
|
| +void PrintViewManagerBase::ReleasePrintJob() {
|
| if (!print_job_.get())
|
| return;
|
|
|
| @@ -582,7 +438,7 @@ void PrintViewManager::ReleasePrintJob() {
|
| print_job_ = NULL;
|
| }
|
|
|
| -bool PrintViewManager::RunInnerMessageLoop() {
|
| +bool PrintViewManagerBase::RunInnerMessageLoop() {
|
| // This value may actually be too low:
|
| //
|
| // - If we're looping because of printer settings initialization, the premise
|
| @@ -619,7 +475,7 @@ bool PrintViewManager::RunInnerMessageLoop() {
|
| return success;
|
| }
|
|
|
| -bool PrintViewManager::OpportunisticallyCreatePrintJob(int cookie) {
|
| +bool PrintViewManagerBase::OpportunisticallyCreatePrintJob(int cookie) {
|
| if (print_job_.get())
|
| return true;
|
|
|
| @@ -649,7 +505,7 @@ bool PrintViewManager::OpportunisticallyCreatePrintJob(int cookie) {
|
| return true;
|
| }
|
|
|
| -bool PrintViewManager::PrintNowInternal(IPC::Message* message) {
|
| +bool PrintViewManagerBase::PrintNowInternal(IPC::Message* message) {
|
| // Don't print / print preview interstitials.
|
| if (web_contents()->ShowingInterstitialPage()) {
|
| delete message;
|
| @@ -658,7 +514,7 @@ bool PrintViewManager::PrintNowInternal(IPC::Message* message) {
|
| return Send(message);
|
| }
|
|
|
| -void PrintViewManager::ReleasePrinterQuery() {
|
| +void PrintViewManagerBase::ReleasePrinterQuery() {
|
| if (!cookie_)
|
| return;
|
|
|
|
|