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