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 22namespace printing { 23 24PrintPreviewMessageHandler::PrintPreviewMessageHandler( 25 TabContents* tab_contents) 26 : TabContentsObserver(tab_contents) { 27 DCHECK(tab_contents); 28} 29 30PrintPreviewMessageHandler::~PrintPreviewMessageHandler() { 31} 32 33TabContents* 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 42void 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 88void PrintPreviewMessageHandler::OnPrintPreviewNodeUnderContextMenu() { 89 PrintPreviewTabController::PrintPreview(tab_contents()); 90} 91 92void PrintPreviewMessageHandler::OnScriptInitiatedPrintPreview() { 93 PrintPreviewTabController::PrintPreview(tab_contents()); 94} 95 96bool 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 111void 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