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