172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/printing/print_view_manager.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/printing/print_job.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/printing/print_job_manager.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/printing/print_preview_tab_controller.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/printing/printer_query.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/print_preview_ui.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/print_messages.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_entry.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "printing/metafile.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "printing/metafile_impl.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "printing/printed_document.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::TimeDelta;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 GenerateRenderSourceName(TabContents* tab_contents) {
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 name(tab_contents->GetTitle());
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (name.empty())
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    name = l10n_util::GetStringUTF16(IDS_DEFAULT_PRINT_DOCUMENT_TITLE);
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return name;
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace printing {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenPrintViewManager::PrintViewManager(TabContents* tab_contents)
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : TabContentsObserver(tab_contents),
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      number_pages_(0),
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      waiting_to_print_(false),
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      printing_succeeded_(false),
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      inside_inner_message_loop_(false),
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      is_title_overridden_(false) {
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_POSIX) && !defined(OS_MACOSX)
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  expecting_first_page_ = true;
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPrintViewManager::~PrintViewManager() {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DisconnectFromCurrentPrintJob();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool PrintViewManager::PrintNow() {
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Don't print interstitials.
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (tab_contents()->showing_interstitial_page())
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return Send(new PrintMsg_PrintPages(routing_id()));
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PrintViewManager::StopNavigation() {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cancel the current job, wait for the worker to finish.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TerminatePrintJob(true);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PrintViewManager::RenderViewGone() {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!print_job_.get())
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<PrintedDocument> document(print_job_->document());
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (document) {
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // If IsComplete() returns false, the document isn't completely rendered.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Since our renderer is gone, there's nothing to do, cancel it. Otherwise,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // the print job may finish without problem.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TerminatePrintJob(!document->IsComplete());
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PrintViewManager::OverrideTitle(TabContents* tab_contents) {
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  is_title_overridden_ = true;
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  overridden_title_ = GenerateRenderSourceName(tab_contents);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstring16 PrintViewManager::RenderSourceName() {
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (is_title_overridden_)
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return overridden_title_;
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return GenerateRenderSourceName(tab_contents());
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGURL PrintViewManager::RenderSourceUrl() {
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NavigationEntry* entry = tab_contents()->controller().GetActiveEntry();
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (entry)
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return entry->virtual_url();
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return GURL();
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrintViewManager::OnDidGetPrintedPagesCount(int cookie, int number_pages) {
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_GT(cookie, 0);
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK_GT(number_pages, 0);
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  number_pages_ = number_pages;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!OpportunisticallyCreatePrintJob(cookie))
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrintedDocument* document = print_job_->document();
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!document || cookie != document->cookie()) {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Out of sync. It may happens since we are completely asynchronous. Old
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // spurious message can happen if one of the processes is overloaded.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrintViewManager::OnDidPrintPage(
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const PrintHostMsg_DidPrintPage_Params& params) {
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!OpportunisticallyCreatePrintJob(params.document_cookie))
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrintedDocument* document = print_job_->document();
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!document || params.document_cookie != document->cookie()) {
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Out of sync. It may happen since we are completely asynchronous. Old
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // spurious messages can be received if one of the processes is overloaded.
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // http://msdn2.microsoft.com/en-us/library/ms535522.aspx
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Windows 2000/XP: When a page in a spooled file exceeds approximately 350
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // MB, it can fail to print and not send an error message.
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (params.data_size && params.data_size >= 350*1024*1024) {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED() << "size:" << params.data_size;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TerminatePrintJob(true);
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    tab_contents()->Stop();
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_WIN) || defined(OS_MACOSX)
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const bool metafile_must_be_valid = true;
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#elif defined(OS_POSIX)
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const bool metafile_must_be_valid = expecting_first_page_;
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  expecting_first_page_ = false;
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::SharedMemory shared_buf(params.metafile_data_handle, true);
149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (metafile_must_be_valid) {
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!shared_buf.Map(params.data_size)) {
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NOTREACHED() << "couldn't map";
152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      tab_contents()->Stop();
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<Metafile> metafile(new NativeMetafile);
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (metafile_must_be_valid) {
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!metafile->InitFromData(shared_buf.memory(), params.data_size)) {
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NOTREACHED() << "Invalid metafile header";
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      tab_contents()->Stop();
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Update the rendered document. It will send notifications to the listener.
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  document->SetPage(params.page_number,
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    metafile.release(),
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    params.actual_shrink,
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    params.page_size,
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    params.content_area,
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    params.has_visible_overlays);
173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShouldQuitFromInnerMessageLoop();
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool PrintViewManager::OnMessageReceived(const IPC::Message& message) {
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool handled = true;
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  IPC_BEGIN_MESSAGE_MAP(PrintViewManager, message)
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPrintedPagesCount,
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        OnDidGetPrintedPagesCount)
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrintPage, OnDidPrintPage)
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    IPC_MESSAGE_UNHANDLED(handled = false)
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  IPC_END_MESSAGE_MAP()
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return handled;
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PrintViewManager::Observe(NotificationType type,
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               const NotificationSource& source,
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               const NotificationDetails& details) {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (type.value) {
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NotificationType::PRINT_JOB_EVENT: {
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnNotifyPrintJobEvent(*Details<JobEventDetails>(details).ptr());
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default: {
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PrintViewManager::OnNotifyPrintJobEvent(
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const JobEventDetails& event_details) {
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (event_details.type()) {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::FAILED: {
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      TerminatePrintJob(true);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::USER_INIT_DONE:
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::DEFAULT_INIT_DONE:
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::USER_INIT_CANCELED: {
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::ALL_PAGES_REQUESTED: {
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShouldQuitFromInnerMessageLoop();
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::NEW_DOC:
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::NEW_PAGE:
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::PAGE_DONE: {
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Don't care about the actual printing process.
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::DOC_DONE: {
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      waiting_to_print_ = false;
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case JobEventDetails::JOB_DONE: {
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Printing is done, we don't need it anymore.
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // print_job_->is_job_pending() may still be true, depending on the order
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // of object registration.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      printing_succeeded_ = true;
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ReleasePrintJob();
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default: {
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PrintViewManager::RenderAllMissingPagesNow() {
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!print_job_.get() || !print_job_->is_job_pending()) {
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK_EQ(waiting_to_print_, false);
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We can't print if there is no renderer.
252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!tab_contents() ||
253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !tab_contents()->render_view_host() ||
254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !tab_contents()->render_view_host()->IsRenderViewLive()) {
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    waiting_to_print_ = false;
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Is the document already complete?
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (print_job_->document() && print_job_->document()->IsComplete()) {
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    waiting_to_print_ = false;
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    printing_succeeded_ = true;
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TabContents is either dying or a second consecutive request to print
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // happened before the first had time to finish. We need to render all the
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // pages in an hurry if a print_job_ is still pending. No need to wait for it
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to actually spool the pages, only to have the renderer generate them. Run
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a message loop until we get our signal that the print job is satisfied.
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // PrintJob will send a ALL_PAGES_REQUESTED after having received all the
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // pages it needs. MessageLoop::current()->Quit() will be called as soon as
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // print_job_->document()->IsComplete() is true on either ALL_PAGES_REQUESTED
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or in DidPrintPage(). The check is done in
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ShouldQuitFromInnerMessageLoop().
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BLOCKS until all the pages are received. (Need to enable recursive task)
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!RunInnerMessageLoop()) {
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This function is always called from DisconnectFromCurrentPrintJob() so we
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // know that the job will be stopped/canceled in any case.
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PrintViewManager::ShouldQuitFromInnerMessageLoop() {
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Look at the reason.
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(print_job_->document());
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (print_job_->document() &&
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      print_job_->document()->IsComplete() &&
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      inside_inner_message_loop_) {
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We are in a message loop created by RenderAllMissingPagesNow. Quit from
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // it.
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->Quit();
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    inside_inner_message_loop_ = false;
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    waiting_to_print_ = false;
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PrintViewManager::CreateNewPrintJob(PrintJobWorkerOwner* job) {
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!inside_inner_message_loop_);
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (waiting_to_print_) {
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We can't help; we are waiting for a print job initialization. The user is
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // button bashing. The only thing we could do is to batch up the requests.
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disconnect the current print_job_.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DisconnectFromCurrentPrintJob();
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We can't print if there is no renderer.
311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!tab_contents()->render_view_host() ||
312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !tab_contents()->render_view_host()->IsRenderViewLive()) {
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ask the renderer to generate the print preview, create the print preview
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // view and switch to it, initialize the printer and show the print dialog.
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!print_job_.get());
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(job);
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!job)
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  print_job_ = new PrintJob();
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  print_job_->Initialize(job, this, number_pages_);
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::PRINT_JOB_EVENT,
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 Source<PrintJob>(print_job_.get()));
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  printing_succeeded_ = false;
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PrintViewManager::DisconnectFromCurrentPrintJob() {
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure all the necessary rendered page are done. Don't bother with the
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // return value.
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool result = RenderAllMissingPagesNow();
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify that assertion.
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (print_job_.get() &&
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      print_job_->document() &&
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      !print_job_->document()->IsComplete()) {
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(!result);
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // That failed.
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TerminatePrintJob(true);
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // DO NOT wait for the job to finish.
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ReleasePrintJob();
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
347dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_POSIX) && !defined(OS_MACOSX)
348dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  expecting_first_page_ = true;
349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PrintViewManager::PrintingDone(bool success) {
353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!print_job_.get() || !tab_contents())
354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RenderViewHost* rvh = tab_contents()->render_view_host();
356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  rvh->Send(new PrintMsg_PrintingDone(rvh->routing_id(),
357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      print_job_->cookie(),
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      success));
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PrintViewManager::TerminatePrintJob(bool cancel) {
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!print_job_.get())
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (cancel) {
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We don't need the metafile data anymore because the printing is canceled.
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    print_job_->Cancel();
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    waiting_to_print_ = false;
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    inside_inner_message_loop_ = false;
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(!inside_inner_message_loop_);
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(!print_job_->document() || print_job_->document()->IsComplete() ||
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           !waiting_to_print_);
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // TabContents is either dying or navigating elsewhere. We need to render
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // all the pages in an hurry if a print job is still pending. This does the
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // trick since it runs a blocking message loop:
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    print_job_->Stop();
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ReleasePrintJob();
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PrintViewManager::ReleasePrintJob() {
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_EQ(waiting_to_print_, false);
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!print_job_.get())
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrintingDone(printing_succeeded_);
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Remove(this, NotificationType::PRINT_JOB_EVENT,
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    Source<PrintJob>(print_job_.get()));
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  print_job_->DisconnectSource();
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't close the worker thread.
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  print_job_ = NULL;
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PrintViewManager::RunInnerMessageLoop() {
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This value may actually be too low:
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // - If we're looping because of printer settings initializaton, the premise
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // here is that some poor users have their print server away on a VPN over
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dialup. In this situation, the simple fact of opening the printer can be
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dead slow. On the other side, we don't want to die infinitely for a real
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // network error. Give the printer 60 seconds to comply.
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // - If we're looping because of renderer page generation, the renderer could
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be cpu bound, the page overly complex/large or the system just
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // memory-bound.
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kPrinterSettingsTimeout = 60000;
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::OneShotTimer<MessageLoop> quit_timer;
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  quit_timer.Start(TimeDelta::FromMilliseconds(kPrinterSettingsTimeout),
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   MessageLoop::current(), &MessageLoop::Quit);
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inside_inner_message_loop_ = true;
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Need to enable recursive task.
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool old_state = MessageLoop::current()->NestableTasksAllowed();
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->SetNestableTasksAllowed(true);
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->Run();
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore task state.
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->SetNestableTasksAllowed(old_state);
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool success = true;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (inside_inner_message_loop_) {
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Ok we timed out. That's sad.
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    inside_inner_message_loop_ = false;
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    success = false;
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return success;
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool PrintViewManager::OpportunisticallyCreatePrintJob(int cookie) {
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (print_job_.get())
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!cookie) {
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Out of sync. It may happens since we are completely asynchronous. Old
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // spurious message can happen if one of the processes is overloaded.
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The job was initiated by a script. Time to get the corresponding worker
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thread.
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<PrinterQuery> queued_query;
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_browser_process->print_job_manager()->PopPrinterQuery(cookie,
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          &queued_query);
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(queued_query.get());
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!queued_query.get())
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!CreateNewPrintJob(queued_query.get())) {
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Don't kill anything.
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Settings are already loaded. Go ahead. This will set
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // print_job_->is_job_pending() to true.
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  print_job_->StartPrinting();
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace printing
464