Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(433)

Side by Side Diff: chrome/renderer/print_web_view_helper.cc

Issue 7365003: Print Preview: Make preview generation event driven to eliminate synchronous messages. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Speculative fix for DidFinishPrint DCHECK Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/print_web_view_helper.h" 5 #include "chrome/renderer/print_web_view_helper.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
12 #include "base/process_util.h" 12 #include "base/process_util.h"
13 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
14 #include "chrome/common/chrome_switches.h" 14 #include "chrome/common/chrome_switches.h"
15 #include "chrome/common/print_messages.h" 15 #include "chrome/common/print_messages.h"
16 #include "chrome/common/render_messages.h" 16 #include "chrome/common/render_messages.h"
17 #include "chrome/common/url_constants.h" 17 #include "chrome/common/url_constants.h"
18 #include "chrome/renderer/prerender/prerender_helper.h" 18 #include "chrome/renderer/prerender/prerender_helper.h"
19 #include "content/renderer/render_view.h" 19 #include "content/renderer/render_view.h"
20 #include "grit/generated_resources.h" 20 #include "grit/generated_resources.h"
21 #include "printing/metafile.h" 21 #include "printing/metafile_impl.h"
22 #include "printing/print_job_constants.h" 22 #include "printing/print_job_constants.h"
23 #include "printing/units.h" 23 #include "printing/units.h"
24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" 24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h"
25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" 25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h"
26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" 27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h"
28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" 29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h"
30 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" 30 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
31 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" 31 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 oldParams.pages.size() == newParams.pages.size() && 90 oldParams.pages.size() == newParams.pages.size() &&
91 std::equal(oldParams.pages.begin(), oldParams.pages.end(), 91 std::equal(oldParams.pages.begin(), oldParams.pages.end(),
92 newParams.pages.begin()); 92 newParams.pages.begin());
93 } 93 }
94 94
95 } // namespace 95 } // namespace
96 96
97 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( 97 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint(
98 const PrintMsg_Print_Params& print_params, 98 const PrintMsg_Print_Params& print_params,
99 WebFrame* frame, 99 WebFrame* frame,
100 WebNode* node, 100 WebNode* node)
101 WebView* web_view)
102 : frame_(frame), 101 : frame_(frame),
103 web_view_(web_view), 102 web_view_(frame->view()),
104 expected_pages_count_(0), 103 expected_pages_count_(0),
105 use_browser_overlays_(true), 104 use_browser_overlays_(true),
106 finished_(false) { 105 finished_(false) {
107 int dpi = GetDPI(&print_params); 106 int dpi = GetDPI(&print_params);
108 print_canvas_size_.set_width( 107 print_canvas_size_.set_width(
109 ConvertUnit(print_params.printable_size.width(), dpi, 108 ConvertUnit(print_params.printable_size.width(), dpi,
110 print_params.desired_dpi)); 109 print_params.desired_dpi));
111 110
112 print_canvas_size_.set_height( 111 print_canvas_size_.set_height(
113 ConvertUnit(print_params.printable_size.height(), dpi, 112 ConvertUnit(print_params.printable_size.height(), dpi,
114 print_params.desired_dpi)); 113 print_params.desired_dpi));
115 114
116 // Layout page according to printer page size. Since WebKit shrinks the 115 // Layout page according to printer page size. Since WebKit shrinks the
117 // size of the page automatically (from 125% to 200%) we trick it to 116 // size of the page automatically (from 125% to 200%) we trick it to
118 // think the page is 125% larger so the size of the page is correct for 117 // think the page is 125% larger so the size of the page is correct for
119 // minimum (default) scaling. 118 // minimum (default) scaling.
120 // This is important for sites that try to fill the page. 119 // This is important for sites that try to fill the page.
121 gfx::Size print_layout_size(print_canvas_size_); 120 gfx::Size print_layout_size(print_canvas_size_);
122 print_layout_size.set_height(static_cast<int>( 121 print_layout_size.set_height(static_cast<int>(
123 static_cast<double>(print_layout_size.height()) * 1.25)); 122 static_cast<double>(print_layout_size.height()) * 1.25));
124 123
125 if (WebFrame* web_frame = web_view_->mainFrame()) 124 if (WebFrame* web_frame = web_view_->mainFrame())
126 prev_scroll_offset_ = web_frame->scrollOffset(); 125 prev_scroll_offset_ = web_frame->scrollOffset();
127 prev_view_size_ = web_view->size(); 126 prev_view_size_ = web_view_->size();
128 127
129 web_view->resize(print_layout_size); 128 web_view_->resize(print_layout_size);
130 129
131 WebNode node_to_print; 130 WebNode node_to_print;
132 if (node) 131 if (node)
133 node_to_print = *node; 132 node_to_print = *node;
134 expected_pages_count_ = frame->printBegin( 133 expected_pages_count_ = frame->printBegin(
135 print_canvas_size_, node_to_print, static_cast<int>(print_params.dpi), 134 print_canvas_size_, node_to_print, static_cast<int>(print_params.dpi),
136 &use_browser_overlays_); 135 &use_browser_overlays_);
137 } 136 }
138 137
139 PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { 138 PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() {
140 FinishPrinting(); 139 FinishPrinting();
141 } 140 }
142 141
143 void PrepareFrameAndViewForPrint::FinishPrinting() { 142 void PrepareFrameAndViewForPrint::FinishPrinting() {
144 if (!finished_) { 143 if (!finished_) {
145 finished_ = true; 144 finished_ = true;
146 frame_->printEnd(); 145 frame_->printEnd();
147 web_view_->resize(prev_view_size_); 146 web_view_->resize(prev_view_size_);
148 if (WebFrame* web_frame = web_view_->mainFrame()) 147 if (WebFrame* web_frame = web_view_->mainFrame())
149 web_frame->setScrollOffset(prev_scroll_offset_); 148 web_frame->setScrollOffset(prev_scroll_offset_);
150 } 149 }
151 } 150 }
152 151
153 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) 152 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view)
154 : RenderViewObserver(render_view), 153 : RenderViewObserver(render_view),
155 RenderViewObserverTracker<PrintWebViewHelper>(render_view), 154 RenderViewObserverTracker<PrintWebViewHelper>(render_view),
156 print_web_view_(NULL), 155 print_web_view_(NULL),
157 script_initiated_preview_frame_(NULL),
158 context_menu_preview_node_(NULL),
159 user_cancelled_scripted_print_count_(0), 156 user_cancelled_scripted_print_count_(0),
160 notify_browser_of_print_failure_(true), 157 notify_browser_of_print_failure_(true) {
161 preview_page_count_(0) {
162 is_preview_ = switches::IsPrintPreviewEnabled(); 158 is_preview_ = switches::IsPrintPreviewEnabled();
163 } 159 }
164 160
165 PrintWebViewHelper::~PrintWebViewHelper() {} 161 PrintWebViewHelper::~PrintWebViewHelper() {}
166 162
167 // Prints |frame| which called window.print(). 163 // Prints |frame| which called window.print().
168 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { 164 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) {
169 DCHECK(frame); 165 DCHECK(frame);
170 166
171 // Allow Prerendering to cancel this print request if necessary. 167 // Allow Prerendering to cancel this print request if necessary.
172 if (prerender::PrerenderHelper::IsPrerendering(render_view())) { 168 if (prerender::PrerenderHelper::IsPrerendering(render_view())) {
173 Send(new ViewHostMsg_CancelPrerenderForPrinting(routing_id())); 169 Send(new ViewHostMsg_CancelPrerenderForPrinting(routing_id()));
174 return; 170 return;
175 } 171 }
176 172
177 if (IsScriptInitiatedPrintTooFrequent(frame)) 173 if (IsScriptInitiatedPrintTooFrequent(frame))
178 return; 174 return;
179 IncrementScriptedPrintCount(); 175 IncrementScriptedPrintCount();
180 176
181 if (is_preview_) { 177 if (is_preview_) {
182 script_initiated_preview_frame_ = frame; 178 print_preview_context_.InitWithFrame(frame);
183 context_menu_preview_node_.reset();
184 RequestPrintPreview(); 179 RequestPrintPreview();
185 } else { 180 } else {
186 Print(frame, NULL); 181 Print(frame, NULL);
187 } 182 }
188 } 183 }
189 184
190 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { 185 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
191 bool handled = true; 186 bool handled = true;
192 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) 187 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message)
193 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) 188 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages)
194 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, 189 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview)
195 OnInitiatePrintPreview)
196 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, 190 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu,
197 OnPrintNodeUnderContextMenu) 191 OnPrintNodeUnderContextMenu)
198 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) 192 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview)
199 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, 193 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview)
200 OnPrintForPrintPreview)
201 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) 194 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone)
202 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, 195 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount,
203 ResetScriptedPrintCount) 196 ResetScriptedPrintCount)
197 IPC_MESSAGE_HANDLER(PrintMsg_ContinuePreview, OnContinuePreview)
198 IPC_MESSAGE_HANDLER(PrintMsg_CancelPreview, OnCancelPreview)
199 IPC_MESSAGE_HANDLER(PrintMsg_AbortPreview, OnAbortPreview)
204 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, 200 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled,
205 DisplayPrintJobError) 201 DisplayPrintJobError)
206 IPC_MESSAGE_UNHANDLED(handled = false) 202 IPC_MESSAGE_UNHANDLED(handled = false)
207 IPC_END_MESSAGE_MAP() 203 IPC_END_MESSAGE_MAP()
208 return handled; 204 return handled;
209 } 205 }
210 206
211 void PrintWebViewHelper::OnPrintForPrintPreview( 207 void PrintWebViewHelper::OnPrintForPrintPreview(
212 const DictionaryValue& job_settings) { 208 const DictionaryValue& job_settings) {
213 DCHECK(is_preview_); 209 DCHECK(is_preview_);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 257 }
262 258
263 void PrintWebViewHelper::OnPrintPages() { 259 void PrintWebViewHelper::OnPrintPages() {
264 WebFrame* frame; 260 WebFrame* frame;
265 if (GetPrintFrame(&frame)) 261 if (GetPrintFrame(&frame))
266 Print(frame, NULL); 262 Print(frame, NULL);
267 } 263 }
268 264
269 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { 265 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
270 DCHECK(is_preview_); 266 DCHECK(is_preview_);
271 DCHECK(!context_menu_preview_node_.get() || !script_initiated_preview_frame_); 267 print_preview_context_.OnPrintPreview();
272 268
273 if (script_initiated_preview_frame_) { 269 if (!InitPrintSettings(print_preview_context_.frame(),
274 // Script initiated print preview. 270 print_preview_context_.node())) {
275 PrintPreview(script_initiated_preview_frame_, NULL, settings); 271 NOTREACHED();
276 } else if (context_menu_preview_node_.get()) { 272 return;
277 // User initiated - print node under context menu.
278 PrintPreview(context_menu_preview_node_->document().frame(),
279 context_menu_preview_node_.get(), settings);
280 } else {
281 // User initiated - normal print preview.
282 WebFrame* frame;
283 if (GetPrintFrame(&frame))
284 PrintPreview(frame, NULL, settings);
285 } 273 }
274
275 if (!UpdatePrintSettings(settings)) {
276 DidFinishPrinting(FAIL_PREVIEW);
277 return;
278 }
279
280 if (print_pages_params_->params.preview_request_id != 0 &&
281 old_print_pages_params_.get() &&
282 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_,
283 *print_pages_params_)) {
284 PrintHostMsg_DidPreviewDocument_Params preview_params;
285 preview_params.reuse_existing_data = true;
286 preview_params.data_size = 0;
287 preview_params.document_cookie =
288 print_pages_params_->params.document_cookie;
289 preview_params.expected_pages_count =
290 print_preview_context_.total_page_count();
291 preview_params.modifiable = print_preview_context_.IsModifiable();
292 preview_params.preview_request_id =
293 print_pages_params_->params.preview_request_id;
294
295 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params));
296 return;
297 }
298
299 // PDF printer device supports alpha blending.
300 print_pages_params_->params.supports_alpha_blend = true;
301 if (!CreatePreviewDocument())
302 DidFinishPrinting(FAIL_PREVIEW);
303 }
304
305 bool PrintWebViewHelper::CreatePreviewDocument() {
306 PrintMsg_Print_Params printParams = print_pages_params_->params;
307 UpdatePrintableSizeInPrintParameters(print_preview_context_.frame(),
308 print_preview_context_.node(),
309 &printParams);
310
311 const std::vector<int>& pages = print_pages_params_->pages;
312 if (!print_preview_context_.CreatePreviewDocument(printParams, pages))
313 return false;
314 int page_count = print_preview_context_.total_page_count();
315 int document_cookie = print_pages_params_->params.document_cookie;
316 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), document_cookie,
317 page_count));
318 PreviewPageRendered(-1);
319 return true;
320 }
321
322 void PrintWebViewHelper::OnContinuePreview() {
323 // Spurious message. We already finished/cancelled/aborted the print preview.
324 if (!print_preview_context_.IsBusy())
325 return;
326
327 int page_number = print_preview_context_.GetNextPageNumber();
328 if (page_number >= 0) {
329 // Continue generating the print preview.
330 RenderPreviewPage(page_number);
331 return;
332 }
333
334 // Finished generating preview. Finalize the document.
335 if (FinalizePreviewDocument())
336 DidFinishPrinting(OK);
337 else
338 DidFinishPrinting(FAIL_PREVIEW);
339 }
340
341 void PrintWebViewHelper::OnCancelPreview() {
342 DidFinishPrinting(CANCEL_PREVIEW);
343 return;
344 }
345
346 void PrintWebViewHelper::OnAbortPreview() {
347 DidFinishPrinting(ABORT_PREVIEW);
348 return;
349 }
350
351 bool PrintWebViewHelper::FinalizePreviewDocument() {
352 print_preview_context_.FinalizePreviewDocument();
353
354 // Get the size of the resulting metafile.
355 printing::Metafile* metafile = print_preview_context_.metafile();
356 uint32 buf_size = metafile->GetDataSize();
357 DCHECK_GT(buf_size, 0u);
358
359 PrintHostMsg_DidPreviewDocument_Params preview_params;
360 preview_params.reuse_existing_data = false;
361 preview_params.data_size = buf_size;
362 preview_params.document_cookie = print_pages_params_->params.document_cookie;
363 preview_params.expected_pages_count =
364 print_preview_context_.total_page_count();
365 preview_params.modifiable = print_preview_context_.IsModifiable();
366 preview_params.preview_request_id =
367 print_pages_params_->params.preview_request_id;
368
369 // Ask the browser to create the shared memory for us.
370 if (!CopyMetafileDataToSharedMem(metafile,
371 &(preview_params.metafile_data_handle))) {
372 return false;
373 }
374 #if defined(OS_WIN)
375 Send(new PrintHostMsg_DuplicateSection(routing_id(),
376 preview_params.metafile_data_handle,
377 &preview_params.metafile_data_handle));
378 #endif
379 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params));
380 return true;
286 } 381 }
287 382
288 void PrintWebViewHelper::OnPrintingDone(bool success) { 383 void PrintWebViewHelper::OnPrintingDone(bool success) {
289 notify_browser_of_print_failure_ = false; 384 notify_browser_of_print_failure_ = false;
290 DidFinishPrinting(success ? OK : FAIL_PRINT); 385 DidFinishPrinting(success ? OK : FAIL_PRINT);
291 } 386 }
292 387
293 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { 388 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() {
294 const WebNode& context_menu_node = render_view()->context_menu_node(); 389 const WebNode& context_menu_node = render_view()->context_menu_node();
295 if (context_menu_node.isNull()) { 390 if (context_menu_node.isNull()) {
296 NOTREACHED(); 391 NOTREACHED();
297 return; 392 return;
298 } 393 }
299 394
300 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets 395 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets
301 // its |context_menu_node_|. 396 // its |context_menu_node_|.
302 if (is_preview_) { 397 if (is_preview_) {
303 context_menu_preview_node_.reset(new WebNode(context_menu_node)); 398 print_preview_context_.InitWithNode(context_menu_node);
304 script_initiated_preview_frame_ = NULL;
305 RequestPrintPreview(); 399 RequestPrintPreview();
306 } else { 400 } else {
307 WebNode duplicate_node(context_menu_node); 401 WebNode duplicate_node(context_menu_node);
308 Print(duplicate_node.document().frame(), &duplicate_node); 402 Print(duplicate_node.document().frame(), &duplicate_node);
309 } 403 }
310 } 404 }
311 405
312 void PrintWebViewHelper::OnInitiatePrintPreview() { 406 void PrintWebViewHelper::OnInitiatePrintPreview() {
313 DCHECK(is_preview_); 407 DCHECK(is_preview_);
314 script_initiated_preview_frame_ = NULL; 408 WebFrame* frame;
315 context_menu_preview_node_.reset(); 409 if (GetPrintFrame(&frame)) {
316 RequestPrintPreview(); 410 print_preview_context_.InitWithFrame(frame);
411 RequestPrintPreview();
412 }
317 } 413 }
318 414
319 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { 415 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) {
320 // If still not finished with earlier print request simply ignore. 416 // If still not finished with earlier print request simply ignore.
321 if (print_web_view_) 417 if (print_web_view_)
322 return; 418 return;
323 419
324 // Initialize print settings. 420 // Initialize print settings.
325 if (!InitPrintSettings(frame, node)) 421 if (!InitPrintSettings(frame, node))
326 return; // Failed to init print page settings. 422 return; // Failed to init print page settings.
327 423
328 int expected_pages_count = 0; 424 int expected_pages_count = 0;
329 bool use_browser_overlays = true; 425 bool use_browser_overlays = true;
330 426
331 // Prepare once to calculate the estimated page count. This must be in 427 // Prepare once to calculate the estimated page count. This must be in
332 // a scope for itself (see comments on PrepareFrameAndViewForPrint). 428 // a scope for itself (see comments on PrepareFrameAndViewForPrint).
333 { 429 {
334 PrepareFrameAndViewForPrint prep_frame_view( 430 PrepareFrameAndViewForPrint prep_frame_view(
335 print_pages_params_->params, frame, node, frame->view()); 431 print_pages_params_->params, frame, node);
336 expected_pages_count = prep_frame_view.GetExpectedPageCount(); 432 expected_pages_count = prep_frame_view.GetExpectedPageCount();
337 if (expected_pages_count) 433 if (expected_pages_count)
338 use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays(); 434 use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays();
339 } 435 }
340 436
341 // Some full screen plugins can say they don't want to print. 437 // Some full screen plugins can say they don't want to print.
342 if (!expected_pages_count) { 438 if (!expected_pages_count) {
343 DidFinishPrinting(OK); // Release resources and fail silently. 439 DidFinishPrinting(OK); // Release resources and fail silently.
344 return; 440 return;
345 } 441 }
346 442
347 // Ask the browser to show UI to retrieve the final print settings. 443 // Ask the browser to show UI to retrieve the final print settings.
348 if (!GetPrintSettingsFromUser(frame, expected_pages_count, 444 if (!GetPrintSettingsFromUser(frame, expected_pages_count,
349 use_browser_overlays)) { 445 use_browser_overlays)) {
350 DidFinishPrinting(OK); // Release resources and fail silently. 446 DidFinishPrinting(OK); // Release resources and fail silently.
351 return; 447 return;
352 } 448 }
353 449
354 // Render Pages for printing. 450 // Render Pages for printing.
355 if (!RenderPagesForPrint(frame, node)) 451 if (!RenderPagesForPrint(frame, node))
356 DidFinishPrinting(FAIL_PRINT); 452 DidFinishPrinting(FAIL_PRINT);
357 ResetScriptedPrintCount(); 453 ResetScriptedPrintCount();
358 } 454 }
359 455
360 void PrintWebViewHelper::PrintPreview(WebKit::WebFrame* frame,
361 WebKit::WebNode* node,
362 const DictionaryValue& settings) {
363 DCHECK(is_preview_);
364
365 if (!InitPrintSettings(frame, node)) {
366 NOTREACHED() << "Failed to initialize print page settings";
367 return;
368 }
369
370 if (!UpdatePrintSettings(settings)) {
371 DidFinishPrinting(FAIL_PREVIEW);
372 return;
373 }
374
375 if (print_pages_params_->params.preview_request_id != 0 &&
376 old_print_pages_params_.get() &&
377 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_,
378 *print_pages_params_)) {
379 PrintHostMsg_DidPreviewDocument_Params preview_params;
380 preview_params.reuse_existing_data = true;
381 preview_params.data_size = 0;
382 preview_params.document_cookie =
383 print_pages_params_->params.document_cookie;
384 preview_params.expected_pages_count = preview_page_count_;
385 preview_params.modifiable = IsModifiable(frame, node);
386 preview_params.preview_request_id =
387 print_pages_params_->params.preview_request_id;
388
389 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params));
390 return;
391 }
392
393 // Render Pages for preview.
394 if (!RenderPagesForPreview(frame, node))
395 DidFinishPrinting(FAIL_PREVIEW);
396 }
397
398 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { 456 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
399 bool store_print_pages_params = true; 457 bool store_print_pages_params = true;
400 if (result == FAIL_PRINT) { 458 if (result == FAIL_PRINT) {
401 DisplayPrintJobError(); 459 DisplayPrintJobError();
402 460
403 if (notify_browser_of_print_failure_) { 461 if (notify_browser_of_print_failure_) {
404 int cookie = print_pages_params_->params.document_cookie; 462 int cookie = print_pages_params_->params.document_cookie;
405 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); 463 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie));
406 } 464 }
407 } else if (result == FAIL_PREVIEW) { 465 } else if (result == FAIL_PREVIEW) {
466 DCHECK(is_preview_);
467 store_print_pages_params = false;
408 int cookie = print_pages_params_->params.document_cookie; 468 int cookie = print_pages_params_->params.document_cookie;
469 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie));
470 print_preview_context_.Abort();
471 } else if (result == CANCEL_PREVIEW) {
472 DCHECK(is_preview_);
409 store_print_pages_params = false; 473 store_print_pages_params = false;
410 if (notify_browser_of_print_failure_) { 474 print_preview_context_.Cancel();
411 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); 475 } else if (result == ABORT_PREVIEW) {
412 } else { 476 DCHECK(is_preview_);
413 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); 477 store_print_pages_params = false;
414 } 478 print_preview_context_.Abort();
479 } else if (result == OK && is_preview_) {
480 print_preview_context_.Finished();
415 } 481 }
416 482
417 if (print_web_view_) { 483 if (print_web_view_) {
418 print_web_view_->close(); 484 print_web_view_->close();
419 print_web_view_ = NULL; 485 print_web_view_ = NULL;
420 } 486 }
421 487
422 if (store_print_pages_params) { 488 if (store_print_pages_params) {
423 old_print_pages_params_.reset(print_pages_params_.release()); 489 old_print_pages_params_.reset(print_pages_params_.release());
424 } else { 490 } else {
(...skipping 30 matching lines...) Expand all
455 return true; 521 return true;
456 } 522 }
457 523
458 #if defined(OS_MACOSX) || defined(OS_WIN) 524 #if defined(OS_MACOSX) || defined(OS_WIN)
459 bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params, 525 bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params,
460 WebFrame* frame, 526 WebFrame* frame,
461 WebNode* node) { 527 WebNode* node) {
462 PrintMsg_Print_Params printParams = params.params; 528 PrintMsg_Print_Params printParams = params.params;
463 UpdatePrintableSizeInPrintParameters(frame, node, &printParams); 529 UpdatePrintableSizeInPrintParameters(frame, node, &printParams);
464 530
465 PrepareFrameAndViewForPrint prep_frame_view(printParams, 531 PrepareFrameAndViewForPrint prep_frame_view(printParams, frame, node);
466 frame,
467 node,
468 frame->view());
469 int page_count = prep_frame_view.GetExpectedPageCount(); 532 int page_count = prep_frame_view.GetExpectedPageCount();
470 if (!page_count) 533 if (!page_count)
471 return false; 534 return false;
472 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), 535 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(),
473 printParams.document_cookie, 536 printParams.document_cookie,
474 page_count)); 537 page_count));
475 538
476 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize(); 539 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize();
477 PrintMsg_PrintPage_Params page_params; 540 PrintMsg_PrintPage_Params page_params;
478 page_params.params = printParams; 541 page_params.params = printParams;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 *margin_right_in_points = 631 *margin_right_in_points =
569 ConvertPixelsToPointDouble(margin_right_in_pixels); 632 ConvertPixelsToPointDouble(margin_right_in_pixels);
570 if (margin_bottom_in_points) 633 if (margin_bottom_in_points)
571 *margin_bottom_in_points = 634 *margin_bottom_in_points =
572 ConvertPixelsToPointDouble(margin_bottom_in_pixels); 635 ConvertPixelsToPointDouble(margin_bottom_in_pixels);
573 if (margin_left_in_points) 636 if (margin_left_in_points)
574 *margin_left_in_points = 637 *margin_left_in_points =
575 ConvertPixelsToPointDouble(margin_left_in_pixels); 638 ConvertPixelsToPointDouble(margin_left_in_pixels);
576 } 639 }
577 640
578 bool PrintWebViewHelper::IsModifiable(WebKit::WebFrame* frame,
579 WebKit::WebNode* node) {
580 if (node)
581 return false;
582 std::string mime(frame->dataSource()->response().mimeType().utf8());
583 if (mime == "application/pdf")
584 return false;
585 return true;
586 }
587
588 void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters( 641 void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters(
589 WebFrame* frame, 642 WebFrame* frame,
590 WebNode* node, 643 WebNode* node,
591 PrintMsg_Print_Params* params) { 644 PrintMsg_Print_Params* params) {
592 double content_width_in_points; 645 double content_width_in_points;
593 double content_height_in_points; 646 double content_height_in_points;
594 double margin_top_in_points; 647 double margin_top_in_points;
595 double margin_right_in_points; 648 double margin_right_in_points;
596 double margin_bottom_in_points; 649 double margin_bottom_in_points;
597 double margin_left_in_points; 650 double margin_left_in_points;
598 PrepareFrameAndViewForPrint prepare(*params, frame, node, frame->view()); 651 PrepareFrameAndViewForPrint prepare(*params, frame, node);
599 PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params, 652 PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params,
600 &content_width_in_points, &content_height_in_points, 653 &content_width_in_points, &content_height_in_points,
601 &margin_top_in_points, &margin_right_in_points, 654 &margin_top_in_points, &margin_right_in_points,
602 &margin_bottom_in_points, &margin_left_in_points); 655 &margin_bottom_in_points, &margin_left_in_points);
603 int dpi = GetDPI(params); 656 int dpi = GetDPI(params);
604 params->printable_size = gfx::Size( 657 params->printable_size = gfx::Size(
605 static_cast<int>(ConvertUnitDouble(content_width_in_points, 658 static_cast<int>(ConvertUnitDouble(content_width_in_points,
606 printing::kPointsPerInch, dpi)), 659 printing::kPointsPerInch, dpi)),
607 static_cast<int>(ConvertUnitDouble(content_height_in_points, 660 static_cast<int>(ConvertUnitDouble(content_height_in_points,
608 printing::kPointsPerInch, dpi))); 661 printing::kPointsPerInch, dpi)));
(...skipping 10 matching lines...) Expand all
619 page_height_in_points, printing::kPointsPerInch, dpi))); 672 page_height_in_points, printing::kPointsPerInch, dpi)));
620 673
621 params->margin_top = static_cast<int>(ConvertUnitDouble( 674 params->margin_top = static_cast<int>(ConvertUnitDouble(
622 margin_top_in_points, printing::kPointsPerInch, dpi)); 675 margin_top_in_points, printing::kPointsPerInch, dpi));
623 params->margin_left = static_cast<int>(ConvertUnitDouble( 676 params->margin_left = static_cast<int>(ConvertUnitDouble(
624 margin_left_in_points, printing::kPointsPerInch, dpi)); 677 margin_left_in_points, printing::kPointsPerInch, dpi));
625 } 678 }
626 679
627 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, 680 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame,
628 WebKit::WebNode* node) { 681 WebKit::WebNode* node) {
682 DCHECK(frame);
629 PrintMsg_PrintPages_Params settings; 683 PrintMsg_PrintPages_Params settings;
630 684
631 // TODO(abodenha@chromium.org) It doesn't make sense to do this if our 685 // TODO(abodenha@chromium.org) It doesn't make sense to do this if our
632 // "default" is a cloud based printer. Split InitPrintSettings up 686 // "default" is a cloud based printer. Split InitPrintSettings up
633 // so that we can avoid the overhead of unneeded calls into the native 687 // so that we can avoid the overhead of unneeded calls into the native
634 // print system. 688 // print system.
635 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), 689 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(),
636 &settings.params)); 690 &settings.params));
637 // Check if the printer returned any settings, if the settings is empty, we 691 // Check if the printer returned any settings, if the settings is empty, we
638 // can safely assume there are no printer drivers configured. So we safely 692 // can safely assume there are no printer drivers configured. So we safely
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 WebKit::WebNode* node) { 798 WebKit::WebNode* node) {
745 PrintMsg_PrintPages_Params print_settings = *print_pages_params_; 799 PrintMsg_PrintPages_Params print_settings = *print_pages_params_;
746 if (print_settings.params.selection_only) { 800 if (print_settings.params.selection_only) {
747 return CopyAndPrint(frame); 801 return CopyAndPrint(frame);
748 } else { 802 } else {
749 // TODO: Always copy before printing. 803 // TODO: Always copy before printing.
750 return PrintPages(print_settings, frame, node); 804 return PrintPages(print_settings, frame, node);
751 } 805 }
752 } 806 }
753 807
754 bool PrintWebViewHelper::RenderPagesForPreview(WebKit::WebFrame* frame,
755 WebKit::WebNode* node) {
756 PrintMsg_PrintPages_Params print_settings = *print_pages_params_;
757 // PDF printer device supports alpha blending.
758 print_settings.params.supports_alpha_blend = true;
759 // TODO(kmadhusu): Handle print selection.
760 return CreatePreviewDocument(print_settings, frame, node);
761 }
762
763 base::TimeTicks PrintWebViewHelper::ReportPreviewPageRenderTime(
764 base::TimeTicks start_time) {
765 base::TimeTicks now = base::TimeTicks::Now();
766 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", now - start_time);
767 return now;
768 }
769
770 void PrintWebViewHelper::ReportTotalPreviewGenerationTime(
771 int selected_pages_length, int total_pages,
772 base::TimeDelta render_time, base::TimeDelta total_time) {
773 if (selected_pages_length == 0)
774 selected_pages_length = total_pages;
775
776 if (selected_pages_length <= 0) {
777 // This shouldn't happen, but this makes sure it doesn't affect the
778 // statistics if it does.
779 return;
780 }
781
782 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime",
783 render_time);
784 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime",
785 total_time);
786 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage",
787 total_time / selected_pages_length);
788 }
789
790 #if defined(OS_POSIX) 808 #if defined(OS_POSIX)
791 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( 809 bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
792 printing::Metafile* metafile, 810 printing::Metafile* metafile,
793 base::SharedMemoryHandle* shared_mem_handle) { 811 base::SharedMemoryHandle* shared_mem_handle) {
794 uint32 buf_size = metafile->GetDataSize(); 812 uint32 buf_size = metafile->GetDataSize();
795 base::SharedMemoryHandle mem_handle; 813 base::SharedMemoryHandle mem_handle;
796 Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, &mem_handle)); 814 Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, &mem_handle));
797 if (base::SharedMemory::IsHandleValid(mem_handle)) { 815 if (base::SharedMemory::IsHandleValid(mem_handle)) {
798 base::SharedMemory shared_buf(mem_handle, false); 816 base::SharedMemory shared_buf(mem_handle, false);
799 if (shared_buf.Map(buf_size)) { 817 if (shared_buf.Map(buf_size)) {
800 metafile->GetData(shared_buf.memory(), buf_size); 818 metafile->GetData(shared_buf.memory(), buf_size);
801 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), 819 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(),
802 shared_mem_handle); 820 shared_mem_handle);
803 return true; 821 return true;
804 } 822 }
805 } 823 }
806 NOTREACHED(); 824 NOTREACHED();
807 return false; 825 return false;
808 } 826 }
809 #endif // defined(OS_POSIX) 827 #endif // defined(OS_POSIX)
810 828
811 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( 829 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent(
812 WebKit::WebFrame* frame) { 830 WebKit::WebFrame* frame) {
813 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; 831 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2;
814 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; 832 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32;
833 bool too_frequent = false;
815 834
816 // Check if there is script repeatedly trying to print and ignore it if too 835 // Check if there is script repeatedly trying to print and ignore it if too
817 // frequent. The first 3 times, we use a constant wait time, but if this 836 // frequent. The first 3 times, we use a constant wait time, but if this
818 // gets excessive, we switch to exponential wait time. So for a page that 837 // gets excessive, we switch to exponential wait time. So for a page that
819 // calls print() in a loop the user will need to cancel the print dialog 838 // calls print() in a loop the user will need to cancel the print dialog
820 // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds. 839 // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds.
821 // This gives the user time to navigate from the page. 840 // This gives the user time to navigate from the page.
822 if (user_cancelled_scripted_print_count_ > 0) { 841 if (user_cancelled_scripted_print_count_ > 0) {
823 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; 842 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_;
824 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; 843 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint;
825 if (user_cancelled_scripted_print_count_ > 3) { 844 if (user_cancelled_scripted_print_count_ > 3) {
826 min_wait_seconds = std::min( 845 min_wait_seconds = std::min(
827 kMinSecondsToIgnoreJavascriptInitiatedPrint << 846 kMinSecondsToIgnoreJavascriptInitiatedPrint <<
828 (user_cancelled_scripted_print_count_ - 3), 847 (user_cancelled_scripted_print_count_ - 3),
829 kMaxSecondsToIgnoreJavascriptInitiatedPrint); 848 kMaxSecondsToIgnoreJavascriptInitiatedPrint);
830 } 849 }
831 if (diff.InSeconds() < min_wait_seconds) { 850 if (diff.InSeconds() < min_wait_seconds) {
832 WebString message(WebString::fromUTF8( 851 too_frequent = true;
833 "Ignoring too frequent calls to print()."));
834 frame->addMessageToConsole(WebConsoleMessage(
835 WebConsoleMessage::LevelWarning,
836 message));
837 return true;
838 } 852 }
839 } 853 }
840 return false; 854
855 if (!too_frequent && print_preview_context_.IsBusy())
856 too_frequent = true;
857
858 if (!too_frequent)
859 return false;
860
861 WebString message(WebString::fromUTF8(
862 "Ignoring too frequent calls to print()."));
863 frame->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelWarning,
864 message));
865 return true;
841 } 866 }
842 867
843 void PrintWebViewHelper::ResetScriptedPrintCount() { 868 void PrintWebViewHelper::ResetScriptedPrintCount() {
844 // Reset cancel counter on successful print. 869 // Reset cancel counter on successful print.
845 user_cancelled_scripted_print_count_ = 0; 870 user_cancelled_scripted_print_count_ = 0;
846 } 871 }
847 872
848 void PrintWebViewHelper::IncrementScriptedPrintCount() { 873 void PrintWebViewHelper::IncrementScriptedPrintCount() {
849 ++user_cancelled_scripted_print_count_; 874 ++user_cancelled_scripted_print_count_;
850 last_cancelled_script_print_ = base::Time::Now(); 875 last_cancelled_script_print_ = base::Time::Now();
851 } 876 }
852 877
853 void PrintWebViewHelper::DisplayPrintJobError() { 878 void PrintWebViewHelper::DisplayPrintJobError() {
854 WebView* web_view = print_web_view_; 879 WebView* web_view = print_web_view_;
855 if (!web_view) 880 if (!web_view)
856 web_view = render_view()->webview(); 881 web_view = render_view()->webview();
857 882
858 render_view()->runModalAlertDialog( 883 render_view()->runModalAlertDialog(
859 web_view->mainFrame(), 884 web_view->mainFrame(),
860 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); 885 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT));
861 } 886 }
862 887
863 void PrintWebViewHelper::RequestPrintPreview() { 888 void PrintWebViewHelper::RequestPrintPreview() {
864 old_print_pages_params_.reset(); 889 old_print_pages_params_.reset();
865 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); 890 Send(new PrintHostMsg_RequestPrintPreview(routing_id()));
866 } 891 }
867 892
868 bool PrintWebViewHelper::PreviewPageRendered(int page_number) { 893 void PrintWebViewHelper::PreviewPageRendered(int page_number) {
869 bool cancel = false; 894 Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number));
870 Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number, &cancel));
871 if (cancel)
872 notify_browser_of_print_failure_ = false;
873 return !cancel;
874 } 895 }
896
897 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
898 : frame_(NULL),
899 total_page_count_(0),
900 actual_page_count_(0),
901 current_page_number_(0),
902 state_(UNINITIALIZED) {
903 }
904
905 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame(
906 WebKit::WebFrame* web_frame) {
907 DCHECK(web_frame);
908 if (IsReadyToRender())
909 return;
910 state_ = INITIALIZED;
911 frame_ = web_frame;
912 node_.reset();
913 }
914
915 void PrintWebViewHelper::PrintPreviewContext::InitWithNode(
916 const WebKit::WebNode& web_node) {
917 DCHECK(!web_node.isNull());
918 if (IsReadyToRender())
919 return;
920 state_ = INITIALIZED;
921 frame_ = web_node.document().frame();
922 node_.reset(new WebNode(web_node));
923 }
924
925 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() {
926 DCHECK(IsReadyToRender());
927 ResetRenderingState();
928 }
929
930 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
931 const PrintMsg_Print_Params& printParams,
932 const std::vector<int>& pages) {
933 DCHECK(IsReadyToRender());
934 state_ = RENDERING;
935
936 print_params_.reset(new PrintMsg_Print_Params(printParams));
937
938 metafile_.reset(new printing::PreviewMetafile);
939 if (!metafile_->Init())
940 return false;
941
942 // Need to make sure old object gets destroyed first.
943 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(printParams, frame(),
944 node()));
945 total_page_count_ = prep_frame_view_->GetExpectedPageCount();
946 if (total_page_count_ == 0)
947 return false;
948
949 current_page_number_ = 0;
950 if (pages.empty()) {
951 actual_page_count_ = total_page_count_;
952 rendered_pages_ = std::vector<bool>(total_page_count_, false);
953 } else {
954 actual_page_count_ = pages.size();
955 rendered_pages_ = std::vector<bool>(total_page_count_, true);
956 for (int i = 0; i < actual_page_count_; ++i) {
957 int page_number = pages[i];
958 if (page_number < 0 || page_number >= total_page_count_)
959 return false;
960 rendered_pages_[page_number] = false;
961 }
962 }
963
964 document_render_time_ = base::TimeDelta();
965 begin_time_ = base::TimeTicks::Now();
966
967 return true;
968 }
969
970 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage(
971 const base::TimeDelta& page_time) {
972 DCHECK_EQ(RENDERING, state_);
973 document_render_time_ += page_time;
974 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time);
975 }
976
977 void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() {
978 DCHECK_EQ(RENDERING, state_);
979 state_ = DONE;
980
981 base::TimeTicks begin_time = base::TimeTicks::Now();
982
983 prep_frame_view_->FinishPrinting();
984 metafile_->FinishDocument();
985
986 if (actual_page_count_ <= 0) {
987 NOTREACHED();
988 return;
989 }
990
991 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime",
992 document_render_time_);
993 base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) +
994 document_render_time_;
995 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime",
996 total_time);
997 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage",
998 total_time / actual_page_count_);
999 }
1000
1001 void PrintWebViewHelper::PrintPreviewContext::Finished() {
1002 DCHECK_EQ(DONE, state_);
1003 ResetRenderingState();
1004 }
1005
1006 void PrintWebViewHelper::PrintPreviewContext::Abort() {
1007 state_ = UNINITIALIZED;
1008 ResetRenderingState();
1009 frame_ = NULL;
1010 node_.reset();
1011 }
1012
1013 void PrintWebViewHelper::PrintPreviewContext::Cancel() {
1014 DCHECK(IsReadyToRender());
1015 state_ = DONE;
1016 ResetRenderingState();
1017 }
1018
1019 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
1020 DCHECK_EQ(RENDERING, state_);
1021 while (current_page_number_ < total_page_count_ &&
1022 rendered_pages_[current_page_number_]) {
1023 ++current_page_number_;
1024 }
1025 if (current_page_number_ == total_page_count_)
1026 return -1;
1027 rendered_pages_[current_page_number_] = true;
1028 return current_page_number_++;
1029 }
1030
1031 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
1032 return state_ != UNINITIALIZED;
1033 }
1034
1035 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const {
1036 return state_ == INITIALIZED || state_ == RENDERING;
1037 }
1038
1039 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
1040 if (node())
1041 return false;
1042 std::string mime(frame()->dataSource()->response().mimeType().utf8());
1043 return mime != "application/pdf";
1044 }
1045
1046 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
1047 return frame_;
1048 }
1049
1050 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const {
1051 return node_.get();
1052 }
1053
1054 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const {
1055 return total_page_count_;
1056 }
1057
1058 printing::Metafile* PrintWebViewHelper::PrintPreviewContext::metafile() const {
1059 return metafile_.get();
1060 }
1061
1062 const PrintMsg_Print_Params&
1063 PrintWebViewHelper::PrintPreviewContext::print_params() const {
1064 return *print_params_;
1065 }
1066
1067 const gfx::Size&
1068 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
1069 return prep_frame_view_->GetPrintCanvasSize();
1070 }
1071
1072 void PrintWebViewHelper::PrintPreviewContext::ResetRenderingState() {
1073 prep_frame_view_.reset();
1074 metafile_.reset();
1075 rendered_pages_.clear();
1076 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698