1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/printing/print_preview_message_handler.h" 6 7 #include "chrome/browser/browser_process.h" 8 #include "chrome/browser/printing/print_job_manager.h" 9 #include "chrome/browser/printing/print_preview_tab_controller.h" 10 #include "chrome/browser/printing/print_view_manager.h" 11 #include "chrome/browser/printing/printer_query.h" 12 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 13 #include "chrome/browser/ui/webui/print_preview_handler.h" 14 #include "chrome/browser/ui/webui/print_preview_ui.h" 15 #include "chrome/browser/ui/webui/print_preview_ui_html_source.h" 16 #include "chrome/common/content_restriction.h" 17 #include "chrome/common/print_messages.h" 18 #include "content/browser/browser_thread.h" 19 #include "content/browser/renderer_host/render_view_host.h" 20 #include "content/browser/tab_contents/tab_contents.h" 21 22 namespace printing { 23 24 PrintPreviewMessageHandler::PrintPreviewMessageHandler( 25 TabContents* tab_contents) 26 : TabContentsObserver(tab_contents) { 27 DCHECK(tab_contents); 28 } 29 30 PrintPreviewMessageHandler::~PrintPreviewMessageHandler() { 31 } 32 33 TabContents* PrintPreviewMessageHandler::GetPrintPreviewTab() { 34 // Get/Create preview tab for initiator tab. 35 printing::PrintPreviewTabController* tab_controller = 36 printing::PrintPreviewTabController::GetInstance(); 37 if (!tab_controller) 38 return NULL; 39 return tab_controller->GetPrintPreviewForTab(tab_contents()); 40 } 41 42 void PrintPreviewMessageHandler::OnPagesReadyForPreview( 43 const PrintHostMsg_DidPreviewDocument_Params& params) { 44 // Always need to stop the worker and send PrintMsg_PrintingDone. 45 PrintJobManager* print_job_manager = g_browser_process->print_job_manager(); 46 scoped_refptr<printing::PrinterQuery> printer_query; 47 print_job_manager->PopPrinterQuery(params.document_cookie, &printer_query); 48 if (printer_query.get()) { 49 BrowserThread::PostTask( 50 BrowserThread::IO, FROM_HERE, 51 NewRunnableMethod(printer_query.get(), 52 &printing::PrinterQuery::StopWorker)); 53 } 54 55 RenderViewHost* rvh = tab_contents()->render_view_host(); 56 rvh->Send(new PrintMsg_PrintingDone(rvh->routing_id(), 57 params.document_cookie, 58 true)); 59 60 // Get the print preview tab. 61 TabContents* print_preview_tab = GetPrintPreviewTab(); 62 // User might have closed it already. 63 if (!print_preview_tab) 64 return; 65 66 base::SharedMemory* shared_buf = 67 new base::SharedMemory(params.metafile_data_handle, true); 68 if (!shared_buf->Map(params.data_size)) { 69 NOTREACHED(); 70 delete shared_buf; 71 return; 72 } 73 74 TabContentsWrapper* wrapper = 75 TabContentsWrapper::GetCurrentWrapperForContents(print_preview_tab); 76 wrapper->print_view_manager()->OverrideTitle(tab_contents()); 77 78 PrintPreviewUI* print_preview_ui = 79 static_cast<PrintPreviewUI*>(print_preview_tab->web_ui()); 80 PrintPreviewUIHTMLSource* html_source = print_preview_ui->html_source(); 81 html_source->SetPrintPreviewData( 82 std::make_pair(shared_buf, params.data_size)); 83 print_preview_ui->PreviewDataIsAvailable( 84 params.expected_pages_count, 85 wrapper->print_view_manager()->RenderSourceName()); 86 } 87 88 void PrintPreviewMessageHandler::OnPrintPreviewNodeUnderContextMenu() { 89 PrintPreviewTabController::PrintPreview(tab_contents()); 90 } 91 92 void PrintPreviewMessageHandler::OnScriptInitiatedPrintPreview() { 93 PrintPreviewTabController::PrintPreview(tab_contents()); 94 } 95 96 bool PrintPreviewMessageHandler::OnMessageReceived( 97 const IPC::Message& message) { 98 bool handled = true; 99 IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message) 100 IPC_MESSAGE_HANDLER(PrintHostMsg_PagesReadyForPreview, 101 OnPagesReadyForPreview) 102 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewNodeUnderContextMenu, 103 OnPrintPreviewNodeUnderContextMenu) 104 IPC_MESSAGE_HANDLER(PrintHostMsg_ScriptInitiatedPrintPreview, 105 OnScriptInitiatedPrintPreview) 106 IPC_MESSAGE_UNHANDLED(handled = false) 107 IPC_END_MESSAGE_MAP() 108 return handled; 109 } 110 111 void PrintPreviewMessageHandler::DidStartLoading() { 112 if (tab_contents()->delegate() && 113 printing::PrintPreviewTabController::IsPrintPreviewTab(tab_contents())) { 114 tab_contents()->SetContentRestrictions(CONTENT_RESTRICTION_PRINT); 115 } 116 } 117 118 } // namespace printing 119