Index: chrome/browser/ui/webui/print_preview_handler.cc |
=================================================================== |
--- chrome/browser/ui/webui/print_preview_handler.cc (revision 110058) |
+++ chrome/browser/ui/webui/print_preview_handler.cc (working copy) |
@@ -25,6 +25,7 @@ |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/platform_util.h" |
#include "chrome/browser/prefs/pref_service.h" |
+#include "chrome/browser/printing/background_printing_manager.h" |
#include "chrome/browser/printing/cloud_print/cloud_print_url.h" |
#include "chrome/browser/printing/print_dialog_cloud.h" |
#include "chrome/browser/printing/print_job_manager.h" |
@@ -33,6 +34,8 @@ |
#include "chrome/browser/printing/print_view_manager.h" |
#include "chrome/browser/printing/printer_manager_dialog.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/sessions/restore_tab_helper.h" |
+#include "chrome/browser/tabs/tab_strip_model.h" |
#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
#include "chrome/browser/ui/webui/cloud_print_signin_dialog.h" |
@@ -67,7 +70,7 @@ |
FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, |
PREVIEW_FAILED, |
PREVIEW_STARTED, |
- INITIATOR_TAB_CRASHED, // UNUSED |
+ INITIATOR_TAB_CRASHED, |
INITIATOR_TAB_CLOSED, |
PRINT_WITH_CLOUD_PRINT, |
USERACTION_BUCKET_BOUNDARY |
@@ -173,6 +176,10 @@ |
} |
} |
+printing::BackgroundPrintingManager* GetBackgroundPrintingManager() { |
+ return g_browser_process->background_printing_manager(); |
+} |
+ |
} // namespace |
// A Task implementation that stores a PDF file on disk. |
@@ -253,6 +260,9 @@ |
web_ui_->RegisterMessageCallback("manageLocalPrinters", |
base::Bind(&PrintPreviewHandler::HandleManagePrinters, |
base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("reloadCrashedInitiatorTab", |
+ base::Bind(&PrintPreviewHandler::HandleReloadCrashedInitiatorTab, |
+ base::Unretained(this))); |
web_ui_->RegisterMessageCallback("closePrintPreviewTab", |
base::Bind(&PrintPreviewHandler::HandleClosePreviewTab, |
base::Unretained(this))); |
@@ -312,7 +322,7 @@ |
TabContentsWrapper* initiator_tab = GetInitiatorTab(); |
if (!initiator_tab) { |
ReportUserActionHistogram(INITIATOR_TAB_CLOSED); |
- print_preview_ui->OnClosePrintPreviewTab(); |
+ print_preview_ui->OnInitiatorTabClosed(); |
return; |
} |
@@ -422,8 +432,7 @@ |
// This tries to activate the initiator tab as well, so do not clear the |
// association with the initiator tab yet. |
- PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
- print_preview_ui->OnHidePreviewTab(); |
+ HidePreviewTab(); |
// Do this so the initiator tab can open a new print preview tab. |
ClearInitiatorTabDetails(); |
@@ -467,8 +476,7 @@ |
} |
void PrintPreviewHandler::HandleHidePreview(const ListValue* /*args*/) { |
- PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
- print_preview_ui->OnHidePreviewTab(); |
+ HidePreviewTab(); |
} |
void PrintPreviewHandler::HandleCancelPendingPrintRequest( |
@@ -579,6 +587,21 @@ |
printing::PrinterManagerDialog::ShowPrinterManagerDialog(); |
} |
+void PrintPreviewHandler::HandleReloadCrashedInitiatorTab( |
+ const ListValue* /*args*/) { |
+ ReportStats(); |
+ ReportUserActionHistogram(INITIATOR_TAB_CRASHED); |
+ |
+ TabContentsWrapper* initiator_tab = GetInitiatorTab(); |
+ if (!initiator_tab) |
+ return; |
+ |
+ TabContents* contents = initiator_tab->tab_contents(); |
+ contents->OpenURL(contents->GetURL(), GURL(), CURRENT_TAB, |
+ content::PAGE_TRANSITION_RELOAD); |
+ ActivateInitiatorTabAndClosePreviewTab(); |
+} |
+ |
void PrintPreviewHandler::HandleClosePreviewTab(const ListValue* /*args*/) { |
ReportStats(); |
ReportUserActionHistogram(CANCEL); |
@@ -587,6 +610,8 @@ |
// before cancelling. |
UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforeCancel", |
regenerate_preview_request_count_); |
+ |
+ ActivateInitiatorTabAndClosePreviewTab(); |
} |
void PrintPreviewHandler::ReportStats() { |
@@ -663,8 +688,7 @@ |
static_cast<RenderViewHostDelegate*>( |
initiator_tab->tab_contents())->Activate(); |
} |
- PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
- print_preview_ui->OnClosePrintPreviewTab(); |
+ ClosePrintPreviewTab(); |
} |
void PrintPreviewHandler::SendPrinterCapabilities( |
@@ -703,7 +727,7 @@ |
std::string print_job_title = UTF16ToUTF8(print_job_title_utf16); |
std::string printer_id; |
settings.GetString(printing::kSettingCloudPrintId, &printer_id); |
- // BASE64 encode the job data. |
+// BASE64 encode the job data. |
std::string raw_data(reinterpret_cast<const char*>(data->front()), |
data->size()); |
std::string base64_data; |
@@ -725,8 +749,8 @@ |
"data:application/pdf;base64,%s\r\n" |
"--%s\r\n"; |
- // TODO(abodenha@chromium.org) This implies a large copy operation. |
- // Profile this and optimize if necessary. |
+// TODO(abodenha@chromium.org) This implies a large copy operation. |
+// Profile this and optimize if necessary. |
std::string final_data; |
base::SStringPrintf(&final_data, |
prolog, |
@@ -755,6 +779,25 @@ |
return tab_controller->GetInitiatorTab(preview_tab_wrapper()); |
} |
+void PrintPreviewHandler::ClosePrintPreviewTab() { |
+ TabContentsWrapper* tab = |
+ TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); |
+ if (!tab) |
+ return; |
+ Browser* preview_tab_browser = BrowserList::FindBrowserWithID( |
+ tab->restore_tab_helper()->window_id().id()); |
+ if (!preview_tab_browser) |
+ return; |
+ TabStripModel* tabstrip = preview_tab_browser->tabstrip_model(); |
+ int index = tabstrip->GetIndexOfTabContents(tab); |
+ if (index == TabStripModel::kNoTab) |
+ return; |
+ |
+ // Keep print preview tab out of the recently closed tab list, because |
+ // re-opening that page will just display a non-functional print preview page. |
+ tabstrip->CloseTabContentsAt(index, TabStripModel::CLOSE_NONE); |
+} |
+ |
void PrintPreviewHandler::OnPrintDialogShown() { |
ActivateInitiatorTabAndClosePreviewTab(); |
} |
@@ -843,6 +886,12 @@ |
print_preview_ui->OnFileSelectionCancelled(); |
} |
+void PrintPreviewHandler::HidePreviewTab() { |
+ if (GetBackgroundPrintingManager()->HasPrintPreviewTab(preview_tab_wrapper())) |
+ return; |
+ GetBackgroundPrintingManager()->OwnPrintPreviewTab(preview_tab_wrapper()); |
+} |
+ |
void PrintPreviewHandler::ClearInitiatorTabDetails() { |
TabContentsWrapper* initiator_tab = GetInitiatorTab(); |
if (!initiator_tab) |