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

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: address comments 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(FAIL_PREVIEW);
337 }
338
339 void PrintWebViewHelper::OnCancelPreview() {
340 DidFinishPrinting(CANCEL_PREVIEW);
341 return;
342 }
343
344 void PrintWebViewHelper::OnAbortPreview() {
345 DidFinishPrinting(ABORT_PREVIEW);
346 return;
347 }
348
349 bool PrintWebViewHelper::FinalizePreviewDocument() {
350 print_preview_context_.FinalizePreviewDocument();
351
352 // Get the size of the resulting metafile.
353 printing::Metafile* metafile = print_preview_context_.metafile();
354 uint32 buf_size = metafile->GetDataSize();
355 DCHECK_GT(buf_size, 0u);
356
357 PrintHostMsg_DidPreviewDocument_Params preview_params;
358 preview_params.reuse_existing_data = false;
359 preview_params.data_size = buf_size;
360 preview_params.document_cookie = print_pages_params_->params.document_cookie;
361 preview_params.expected_pages_count =
362 print_preview_context_.total_page_count();
363 preview_params.modifiable = print_preview_context_.IsModifiable();
364 preview_params.preview_request_id =
365 print_pages_params_->params.preview_request_id;
366
367 // Ask the browser to create the shared memory for us.
368 if (!CopyMetafileDataToSharedMem(metafile,
369 &(preview_params.metafile_data_handle))) {
370 return false;
371 }
372 #if defined(OS_WIN)
373 Send(new PrintHostMsg_DuplicateSection(routing_id(),
374 preview_params.metafile_data_handle,
375 &preview_params.metafile_data_handle));
376 #endif
377 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params));
378 return true;
286 } 379 }
287 380
288 void PrintWebViewHelper::OnPrintingDone(bool success) { 381 void PrintWebViewHelper::OnPrintingDone(bool success) {
289 notify_browser_of_print_failure_ = false; 382 notify_browser_of_print_failure_ = false;
290 DidFinishPrinting(success ? OK : FAIL_PRINT); 383 DidFinishPrinting(success ? OK : FAIL_PRINT);
291 } 384 }
292 385
293 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { 386 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() {
294 const WebNode& context_menu_node = render_view()->context_menu_node(); 387 const WebNode& context_menu_node = render_view()->context_menu_node();
295 if (context_menu_node.isNull()) { 388 if (context_menu_node.isNull()) {
296 NOTREACHED(); 389 NOTREACHED();
297 return; 390 return;
298 } 391 }
299 392
300 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets 393 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets
301 // its |context_menu_node_|. 394 // its |context_menu_node_|.
302 if (is_preview_) { 395 if (is_preview_) {
303 context_menu_preview_node_.reset(new WebNode(context_menu_node)); 396 print_preview_context_.InitWithNode(context_menu_node);
304 script_initiated_preview_frame_ = NULL;
305 RequestPrintPreview(); 397 RequestPrintPreview();
306 } else { 398 } else {
307 WebNode duplicate_node(context_menu_node); 399 WebNode duplicate_node(context_menu_node);
308 Print(duplicate_node.document().frame(), &duplicate_node); 400 Print(duplicate_node.document().frame(), &duplicate_node);
309 } 401 }
310 } 402 }
311 403
312 void PrintWebViewHelper::OnInitiatePrintPreview() { 404 void PrintWebViewHelper::OnInitiatePrintPreview() {
313 DCHECK(is_preview_); 405 DCHECK(is_preview_);
314 script_initiated_preview_frame_ = NULL; 406 WebFrame* frame;
315 context_menu_preview_node_.reset(); 407 if (GetPrintFrame(&frame)) {
316 RequestPrintPreview(); 408 print_preview_context_.InitWithFrame(frame);
409 RequestPrintPreview();
410 }
317 } 411 }
318 412
319 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { 413 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) {
320 // If still not finished with earlier print request simply ignore. 414 // If still not finished with earlier print request simply ignore.
321 if (print_web_view_) 415 if (print_web_view_)
322 return; 416 return;
323 417
324 // Initialize print settings. 418 // Initialize print settings.
325 if (!InitPrintSettings(frame, node)) 419 if (!InitPrintSettings(frame, node))
326 return; // Failed to init print page settings. 420 return; // Failed to init print page settings.
327 421
328 int expected_pages_count = 0; 422 int expected_pages_count = 0;
329 bool use_browser_overlays = true; 423 bool use_browser_overlays = true;
330 424
331 // Prepare once to calculate the estimated page count. This must be in 425 // Prepare once to calculate the estimated page count. This must be in
332 // a scope for itself (see comments on PrepareFrameAndViewForPrint). 426 // a scope for itself (see comments on PrepareFrameAndViewForPrint).
333 { 427 {
334 PrepareFrameAndViewForPrint prep_frame_view( 428 PrepareFrameAndViewForPrint prep_frame_view(
335 print_pages_params_->params, frame, node, frame->view()); 429 print_pages_params_->params, frame, node);
336 expected_pages_count = prep_frame_view.GetExpectedPageCount(); 430 expected_pages_count = prep_frame_view.GetExpectedPageCount();
337 if (expected_pages_count) 431 if (expected_pages_count)
338 use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays(); 432 use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays();
339 } 433 }
340 434
341 // Some full screen plugins can say they don't want to print. 435 // Some full screen plugins can say they don't want to print.
342 if (!expected_pages_count) { 436 if (!expected_pages_count) {
343 DidFinishPrinting(OK); // Release resources and fail silently. 437 DidFinishPrinting(OK); // Release resources and fail silently.
344 return; 438 return;
345 } 439 }
346 440
347 // Ask the browser to show UI to retrieve the final print settings. 441 // Ask the browser to show UI to retrieve the final print settings.
348 if (!GetPrintSettingsFromUser(frame, expected_pages_count, 442 if (!GetPrintSettingsFromUser(frame, expected_pages_count,
349 use_browser_overlays)) { 443 use_browser_overlays)) {
350 DidFinishPrinting(OK); // Release resources and fail silently. 444 DidFinishPrinting(OK); // Release resources and fail silently.
351 return; 445 return;
352 } 446 }
353 447
354 // Render Pages for printing. 448 // Render Pages for printing.
355 if (!RenderPagesForPrint(frame, node)) 449 if (!RenderPagesForPrint(frame, node))
356 DidFinishPrinting(FAIL_PRINT); 450 DidFinishPrinting(FAIL_PRINT);
357 ResetScriptedPrintCount(); 451 ResetScriptedPrintCount();
358 } 452 }
359 453
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) { 454 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
399 bool store_print_pages_params = true; 455 bool store_print_pages_params = true;
400 if (result == FAIL_PRINT) { 456 if (result == FAIL_PRINT) {
401 DisplayPrintJobError(); 457 DisplayPrintJobError();
402 458
403 if (notify_browser_of_print_failure_) { 459 if (notify_browser_of_print_failure_) {
404 int cookie = print_pages_params_->params.document_cookie; 460 int cookie = print_pages_params_->params.document_cookie;
405 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); 461 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie));
406 } 462 }
407 } else if (result == FAIL_PREVIEW) { 463 } else if (result == FAIL_PREVIEW) {
464 DCHECK(is_preview_);
465 store_print_pages_params = false;
408 int cookie = print_pages_params_->params.document_cookie; 466 int cookie = print_pages_params_->params.document_cookie;
467 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie));
468 print_preview_context_.Abort();
469 } else if (result == CANCEL_PREVIEW) {
470 DCHECK(is_preview_);
409 store_print_pages_params = false; 471 store_print_pages_params = false;
410 if (notify_browser_of_print_failure_) { 472 print_preview_context_.Cancel();
411 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); 473 } else if (result == ABORT_PREVIEW) {
412 } else { 474 DCHECK(is_preview_);
413 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); 475 store_print_pages_params = false;
414 } 476 print_preview_context_.Abort();
477 } else if (result == OK && is_preview_) {
478 print_preview_context_.Finished();
415 } 479 }
416 480
417 if (print_web_view_) { 481 if (print_web_view_) {
418 print_web_view_->close(); 482 print_web_view_->close();
419 print_web_view_ = NULL; 483 print_web_view_ = NULL;
420 } 484 }
421 485
422 if (store_print_pages_params) { 486 if (store_print_pages_params) {
423 old_print_pages_params_.reset(print_pages_params_.release()); 487 old_print_pages_params_.reset(print_pages_params_.release());
424 } else { 488 } else {
(...skipping 30 matching lines...) Expand all
455 return true; 519 return true;
456 } 520 }
457 521
458 #if defined(OS_MACOSX) || defined(OS_WIN) 522 #if defined(OS_MACOSX) || defined(OS_WIN)
459 bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params, 523 bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params,
460 WebFrame* frame, 524 WebFrame* frame,
461 WebNode* node) { 525 WebNode* node) {
462 PrintMsg_Print_Params printParams = params.params; 526 PrintMsg_Print_Params printParams = params.params;
463 UpdatePrintableSizeInPrintParameters(frame, node, &printParams); 527 UpdatePrintableSizeInPrintParameters(frame, node, &printParams);
464 528
465 PrepareFrameAndViewForPrint prep_frame_view(printParams, 529 PrepareFrameAndViewForPrint prep_frame_view(printParams, frame, node);
466 frame,
467 node,
468 frame->view());
469 int page_count = prep_frame_view.GetExpectedPageCount(); 530 int page_count = prep_frame_view.GetExpectedPageCount();
470 if (!page_count) 531 if (!page_count)
471 return false; 532 return false;
472 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), 533 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(),
473 printParams.document_cookie, 534 printParams.document_cookie,
474 page_count)); 535 page_count));
475 536
476 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize(); 537 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize();
477 PrintMsg_PrintPage_Params page_params; 538 PrintMsg_PrintPage_Params page_params;
478 page_params.params = printParams; 539 page_params.params = printParams;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 *margin_right_in_points = 629 *margin_right_in_points =
569 ConvertPixelsToPointDouble(margin_right_in_pixels); 630 ConvertPixelsToPointDouble(margin_right_in_pixels);
570 if (margin_bottom_in_points) 631 if (margin_bottom_in_points)
571 *margin_bottom_in_points = 632 *margin_bottom_in_points =
572 ConvertPixelsToPointDouble(margin_bottom_in_pixels); 633 ConvertPixelsToPointDouble(margin_bottom_in_pixels);
573 if (margin_left_in_points) 634 if (margin_left_in_points)
574 *margin_left_in_points = 635 *margin_left_in_points =
575 ConvertPixelsToPointDouble(margin_left_in_pixels); 636 ConvertPixelsToPointDouble(margin_left_in_pixels);
576 } 637 }
577 638
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( 639 void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters(
589 WebFrame* frame, 640 WebFrame* frame,
590 WebNode* node, 641 WebNode* node,
591 PrintMsg_Print_Params* params) { 642 PrintMsg_Print_Params* params) {
592 double content_width_in_points; 643 double content_width_in_points;
593 double content_height_in_points; 644 double content_height_in_points;
594 double margin_top_in_points; 645 double margin_top_in_points;
595 double margin_right_in_points; 646 double margin_right_in_points;
596 double margin_bottom_in_points; 647 double margin_bottom_in_points;
597 double margin_left_in_points; 648 double margin_left_in_points;
598 PrepareFrameAndViewForPrint prepare(*params, frame, node, frame->view()); 649 PrepareFrameAndViewForPrint prepare(*params, frame, node);
599 PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params, 650 PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params,
600 &content_width_in_points, &content_height_in_points, 651 &content_width_in_points, &content_height_in_points,
601 &margin_top_in_points, &margin_right_in_points, 652 &margin_top_in_points, &margin_right_in_points,
602 &margin_bottom_in_points, &margin_left_in_points); 653 &margin_bottom_in_points, &margin_left_in_points);
603 int dpi = GetDPI(params); 654 int dpi = GetDPI(params);
604 params->printable_size = gfx::Size( 655 params->printable_size = gfx::Size(
605 static_cast<int>(ConvertUnitDouble(content_width_in_points, 656 static_cast<int>(ConvertUnitDouble(content_width_in_points,
606 printing::kPointsPerInch, dpi)), 657 printing::kPointsPerInch, dpi)),
607 static_cast<int>(ConvertUnitDouble(content_height_in_points, 658 static_cast<int>(ConvertUnitDouble(content_height_in_points,
608 printing::kPointsPerInch, dpi))); 659 printing::kPointsPerInch, dpi)));
(...skipping 10 matching lines...) Expand all
619 page_height_in_points, printing::kPointsPerInch, dpi))); 670 page_height_in_points, printing::kPointsPerInch, dpi)));
620 671
621 params->margin_top = static_cast<int>(ConvertUnitDouble( 672 params->margin_top = static_cast<int>(ConvertUnitDouble(
622 margin_top_in_points, printing::kPointsPerInch, dpi)); 673 margin_top_in_points, printing::kPointsPerInch, dpi));
623 params->margin_left = static_cast<int>(ConvertUnitDouble( 674 params->margin_left = static_cast<int>(ConvertUnitDouble(
624 margin_left_in_points, printing::kPointsPerInch, dpi)); 675 margin_left_in_points, printing::kPointsPerInch, dpi));
625 } 676 }
626 677
627 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, 678 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame,
628 WebKit::WebNode* node) { 679 WebKit::WebNode* node) {
680 DCHECK(frame);
629 PrintMsg_PrintPages_Params settings; 681 PrintMsg_PrintPages_Params settings;
630 682
631 // TODO(abodenha@chromium.org) It doesn't make sense to do this if our 683 // TODO(abodenha@chromium.org) It doesn't make sense to do this if our
632 // "default" is a cloud based printer. Split InitPrintSettings up 684 // "default" is a cloud based printer. Split InitPrintSettings up
633 // so that we can avoid the overhead of unneeded calls into the native 685 // so that we can avoid the overhead of unneeded calls into the native
634 // print system. 686 // print system.
635 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), 687 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(),
636 &settings.params)); 688 &settings.params));
637 // Check if the printer returned any settings, if the settings is empty, we 689 // 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 690 // 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) { 796 WebKit::WebNode* node) {
745 PrintMsg_PrintPages_Params print_settings = *print_pages_params_; 797 PrintMsg_PrintPages_Params print_settings = *print_pages_params_;
746 if (print_settings.params.selection_only) { 798 if (print_settings.params.selection_only) {
747 return CopyAndPrint(frame); 799 return CopyAndPrint(frame);
748 } else { 800 } else {
749 // TODO: Always copy before printing. 801 // TODO: Always copy before printing.
750 return PrintPages(print_settings, frame, node); 802 return PrintPages(print_settings, frame, node);
751 } 803 }
752 } 804 }
753 805
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) 806 #if defined(OS_POSIX)
791 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( 807 bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
792 printing::Metafile* metafile, 808 printing::Metafile* metafile,
793 base::SharedMemoryHandle* shared_mem_handle) { 809 base::SharedMemoryHandle* shared_mem_handle) {
794 uint32 buf_size = metafile->GetDataSize(); 810 uint32 buf_size = metafile->GetDataSize();
795 base::SharedMemoryHandle mem_handle; 811 base::SharedMemoryHandle mem_handle;
796 Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, &mem_handle)); 812 Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, &mem_handle));
797 if (base::SharedMemory::IsHandleValid(mem_handle)) { 813 if (base::SharedMemory::IsHandleValid(mem_handle)) {
798 base::SharedMemory shared_buf(mem_handle, false); 814 base::SharedMemory shared_buf(mem_handle, false);
799 if (shared_buf.Map(buf_size)) { 815 if (shared_buf.Map(buf_size)) {
800 metafile->GetData(shared_buf.memory(), buf_size); 816 metafile->GetData(shared_buf.memory(), buf_size);
801 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), 817 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(),
802 shared_mem_handle); 818 shared_mem_handle);
803 return true; 819 return true;
804 } 820 }
805 } 821 }
806 NOTREACHED(); 822 NOTREACHED();
807 return false; 823 return false;
808 } 824 }
809 #endif // defined(OS_POSIX) 825 #endif // defined(OS_POSIX)
810 826
811 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( 827 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent(
812 WebKit::WebFrame* frame) { 828 WebKit::WebFrame* frame) {
813 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; 829 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2;
814 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; 830 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32;
831 bool too_frequent = false;
815 832
816 // Check if there is script repeatedly trying to print and ignore it if too 833 // 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 834 // 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 835 // 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 836 // 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. 837 // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds.
821 // This gives the user time to navigate from the page. 838 // This gives the user time to navigate from the page.
822 if (user_cancelled_scripted_print_count_ > 0) { 839 if (user_cancelled_scripted_print_count_ > 0) {
823 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; 840 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_;
824 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; 841 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint;
825 if (user_cancelled_scripted_print_count_ > 3) { 842 if (user_cancelled_scripted_print_count_ > 3) {
826 min_wait_seconds = std::min( 843 min_wait_seconds = std::min(
827 kMinSecondsToIgnoreJavascriptInitiatedPrint << 844 kMinSecondsToIgnoreJavascriptInitiatedPrint <<
828 (user_cancelled_scripted_print_count_ - 3), 845 (user_cancelled_scripted_print_count_ - 3),
829 kMaxSecondsToIgnoreJavascriptInitiatedPrint); 846 kMaxSecondsToIgnoreJavascriptInitiatedPrint);
830 } 847 }
831 if (diff.InSeconds() < min_wait_seconds) { 848 if (diff.InSeconds() < min_wait_seconds) {
832 WebString message(WebString::fromUTF8( 849 too_frequent = true;
833 "Ignoring too frequent calls to print()."));
834 frame->addMessageToConsole(WebConsoleMessage(
835 WebConsoleMessage::LevelWarning,
836 message));
837 return true;
838 } 850 }
839 } 851 }
840 return false; 852
853 if (!too_frequent && print_preview_context_.IsBusy())
854 too_frequent = true;
855
856 if (!too_frequent)
857 return false;
858
859 WebString message(WebString::fromUTF8(
860 "Ignoring too frequent calls to print()."));
861 frame->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelWarning,
862 message));
863 return true;
841 } 864 }
842 865
843 void PrintWebViewHelper::ResetScriptedPrintCount() { 866 void PrintWebViewHelper::ResetScriptedPrintCount() {
844 // Reset cancel counter on successful print. 867 // Reset cancel counter on successful print.
845 user_cancelled_scripted_print_count_ = 0; 868 user_cancelled_scripted_print_count_ = 0;
846 } 869 }
847 870
848 void PrintWebViewHelper::IncrementScriptedPrintCount() { 871 void PrintWebViewHelper::IncrementScriptedPrintCount() {
849 ++user_cancelled_scripted_print_count_; 872 ++user_cancelled_scripted_print_count_;
850 last_cancelled_script_print_ = base::Time::Now(); 873 last_cancelled_script_print_ = base::Time::Now();
851 } 874 }
852 875
853 void PrintWebViewHelper::DisplayPrintJobError() { 876 void PrintWebViewHelper::DisplayPrintJobError() {
854 WebView* web_view = print_web_view_; 877 WebView* web_view = print_web_view_;
855 if (!web_view) 878 if (!web_view)
856 web_view = render_view()->webview(); 879 web_view = render_view()->webview();
857 880
858 render_view()->runModalAlertDialog( 881 render_view()->runModalAlertDialog(
859 web_view->mainFrame(), 882 web_view->mainFrame(),
860 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); 883 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT));
861 } 884 }
862 885
863 void PrintWebViewHelper::RequestPrintPreview() { 886 void PrintWebViewHelper::RequestPrintPreview() {
864 old_print_pages_params_.reset(); 887 old_print_pages_params_.reset();
865 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); 888 Send(new PrintHostMsg_RequestPrintPreview(routing_id()));
866 } 889 }
867 890
868 bool PrintWebViewHelper::PreviewPageRendered(int page_number) { 891 void PrintWebViewHelper::PreviewPageRendered(int page_number) {
869 bool cancel = false; 892 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 } 893 }
894
895 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
896 : frame_(NULL),
897 total_page_count_(0),
898 actual_page_count_(0),
899 current_page_number_(0),
900 state_(UNINITIALIZED) {
901 }
902
903 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame(
904 WebKit::WebFrame* web_frame) {
905 DCHECK(web_frame);
906 if (IsReadyToRender())
907 return;
908 state_ = INITIALIZED;
909 frame_ = web_frame;
910 node_.reset();
911 }
912
913 void PrintWebViewHelper::PrintPreviewContext::InitWithNode(
914 const WebKit::WebNode& web_node) {
915 DCHECK(!web_node.isNull());
916 if (IsReadyToRender())
917 return;
918 state_ = INITIALIZED;
919 frame_ = web_node.document().frame();
920 node_.reset(new WebNode(web_node));
921 }
922
923 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() {
924 DCHECK(IsReadyToRender());
925 ResetRenderingState();
926 }
927
928 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
929 const PrintMsg_Print_Params& printParams,
930 const std::vector<int>& pages) {
931 DCHECK(IsReadyToRender());
932 state_ = RENDERING;
933
934 print_params_.reset(new PrintMsg_Print_Params(printParams));
935
936 metafile_.reset(new printing::PreviewMetafile);
937 if (!metafile_->Init())
938 return false;
939
940 // Need to make sure old object gets destroyed first.
941 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(printParams, frame(),
942 node()));
943 total_page_count_ = prep_frame_view_->GetExpectedPageCount();
944 if (total_page_count_ == 0)
945 return false;
946
947 current_page_number_ = 0;
948 if (pages.empty()) {
949 actual_page_count_ = total_page_count_;
950 rendered_pages_ = std::vector<bool>(total_page_count_, false);
951 } else {
952 actual_page_count_ = pages.size();
953 rendered_pages_ = std::vector<bool>(total_page_count_, true);
954 for (int i = 0; i < actual_page_count_; ++i) {
955 int page_number = pages[i];
956 if (page_number < 0 || page_number >= total_page_count_)
957 return false;
958 rendered_pages_[page_number] = false;
959 }
960 }
961
962 document_render_time_ = base::TimeDelta();
963 begin_time_ = base::TimeTicks::Now();
964
965 return true;
966 }
967
968 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage(
969 const base::TimeDelta& page_time) {
970 DCHECK_EQ(RENDERING, state_);
971 document_render_time_ += page_time;
972 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time);
973 }
974
975 void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() {
976 DCHECK_EQ(RENDERING, state_);
977 state_ = DONE;
978
979 base::TimeTicks begin_time = base::TimeTicks::Now();
980
981 prep_frame_view_->FinishPrinting();
982 metafile_->FinishDocument();
983
984 if (actual_page_count_ <= 0) {
985 NOTREACHED();
986 return;
987 }
988
989 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime",
990 document_render_time_);
991 base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) +
992 document_render_time_;
993 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime",
994 total_time);
995 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage",
996 total_time / actual_page_count_);
997 }
998
999 void PrintWebViewHelper::PrintPreviewContext::Finished() {
1000 DCHECK_EQ(DONE, state_);
1001 ResetRenderingState();
1002 }
1003
1004 void PrintWebViewHelper::PrintPreviewContext::Abort() {
1005 state_ = UNINITIALIZED;
1006 ResetRenderingState();
1007 frame_ = NULL;
1008 node_.reset();
1009 }
1010
1011 void PrintWebViewHelper::PrintPreviewContext::Cancel() {
1012 DCHECK(IsReadyToRender());
1013 state_ = DONE;
1014 ResetRenderingState();
1015 }
1016
1017 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
1018 DCHECK_EQ(RENDERING, state_);
1019 while (current_page_number_ < total_page_count_ &&
1020 rendered_pages_[current_page_number_]) {
1021 ++current_page_number_;
1022 }
1023 if (current_page_number_ == total_page_count_)
1024 return -1;
1025 rendered_pages_[current_page_number_] = true;
1026 return current_page_number_++;
1027 }
1028
1029 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
1030 return state_ != UNINITIALIZED;
1031 }
1032
1033 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const {
1034 return state_ == INITIALIZED || state_ == RENDERING;
1035 }
1036
1037 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
1038 if (node())
1039 return false;
1040 std::string mime(frame()->dataSource()->response().mimeType().utf8());
1041 return mime != "application/pdf";
1042 }
1043
1044 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
1045 return frame_;
1046 }
1047
1048 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const {
1049 return node_.get();
1050 }
1051
1052 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const {
1053 return total_page_count_;
1054 }
1055
1056 printing::Metafile* PrintWebViewHelper::PrintPreviewContext::metafile() const {
1057 return metafile_.get();
1058 }
1059
1060 const PrintMsg_Print_Params&
1061 PrintWebViewHelper::PrintPreviewContext::print_params() const {
1062 return *print_params_;
1063 }
1064
1065 const gfx::Size&
1066 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
1067 return prep_frame_view_->GetPrintCanvasSize();
1068 }
1069
1070 void PrintWebViewHelper::PrintPreviewContext::ResetRenderingState() {
kmadhusu 2011/07/15 19:25:47 How about ClearPrintPreviewContext()? We are not c
Lei Zhang 2011/07/15 20:23:35 Changed to ClearContext().
1071 prep_frame_view_.reset();
1072 metafile_.reset();
1073 rendered_pages_.clear();
1074 }
OLDNEW
« no previous file with comments | « chrome/renderer/print_web_view_helper.h ('k') | chrome/renderer/print_web_view_helper_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698