OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } | |
OLD | NEW |