Chromium Code Reviews| 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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 147 web_view_->resize(prev_view_size_); | 147 web_view_->resize(prev_view_size_); |
| 148 if (WebFrame* web_frame = web_view_->mainFrame()) | 148 if (WebFrame* web_frame = web_view_->mainFrame()) |
| 149 web_frame->setScrollOffset(prev_scroll_offset_); | 149 web_frame->setScrollOffset(prev_scroll_offset_); |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 | 152 |
| 153 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) | 153 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) |
| 154 : RenderViewObserver(render_view), | 154 : RenderViewObserver(render_view), |
| 155 RenderViewObserverTracker<PrintWebViewHelper>(render_view), | 155 RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
| 156 print_web_view_(NULL), | 156 print_web_view_(NULL), |
| 157 script_initiated_preview_frame_(NULL), | |
| 158 context_menu_preview_node_(NULL), | |
| 159 user_cancelled_scripted_print_count_(0), | 157 user_cancelled_scripted_print_count_(0), |
| 160 notify_browser_of_print_failure_(true), | 158 notify_browser_of_print_failure_(true) { |
| 161 preview_page_count_(0) { | |
| 162 is_preview_ = switches::IsPrintPreviewEnabled(); | 159 is_preview_ = switches::IsPrintPreviewEnabled(); |
| 163 } | 160 } |
| 164 | 161 |
| 165 PrintWebViewHelper::~PrintWebViewHelper() {} | 162 PrintWebViewHelper::~PrintWebViewHelper() {} |
| 166 | 163 |
| 167 // Prints |frame| which called window.print(). | 164 // Prints |frame| which called window.print(). |
| 168 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { | 165 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { |
| 169 DCHECK(frame); | 166 DCHECK(frame); |
| 170 | 167 |
| 171 // Allow Prerendering to cancel this print request if necessary. | 168 // Allow Prerendering to cancel this print request if necessary. |
| 172 if (prerender::PrerenderHelper::IsPrerendering(render_view())) { | 169 if (prerender::PrerenderHelper::IsPrerendering(render_view())) { |
| 173 Send(new ViewHostMsg_CancelPrerenderForPrinting(routing_id())); | 170 Send(new ViewHostMsg_CancelPrerenderForPrinting(routing_id())); |
| 174 return; | 171 return; |
| 175 } | 172 } |
| 176 | 173 |
| 177 if (IsScriptInitiatedPrintTooFrequent(frame)) | 174 if (IsScriptInitiatedPrintTooFrequent(frame)) |
| 178 return; | 175 return; |
| 179 IncrementScriptedPrintCount(); | 176 IncrementScriptedPrintCount(); |
| 180 | 177 |
| 181 if (is_preview_) { | 178 if (is_preview_) { |
| 182 script_initiated_preview_frame_ = frame; | 179 print_preview_context_.InitWithFrame(frame); |
| 183 context_menu_preview_node_.reset(); | |
| 184 RequestPrintPreview(); | 180 RequestPrintPreview(); |
| 185 } else { | 181 } else { |
| 186 Print(frame, NULL); | 182 Print(frame, NULL); |
| 187 } | 183 } |
| 188 } | 184 } |
| 189 | 185 |
| 190 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { | 186 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { |
| 191 bool handled = true; | 187 bool handled = true; |
| 192 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) | 188 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) |
| 193 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) | 189 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) |
| 194 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, | 190 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, |
| 195 OnInitiatePrintPreview) | 191 OnInitiatePrintPreview) |
| 196 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, | 192 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, |
| 197 OnPrintNodeUnderContextMenu) | 193 OnPrintNodeUnderContextMenu) |
| 198 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) | 194 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) |
| 199 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, | 195 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, |
| 200 OnPrintForPrintPreview) | 196 OnPrintForPrintPreview) |
| 201 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) | 197 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
| 202 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, | 198 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, |
| 203 ResetScriptedPrintCount) | 199 ResetScriptedPrintCount) |
| 200 IPC_MESSAGE_HANDLER(PrintMsg_ContinuePreview, | |
| 201 OnContinuePreview) | |
|
kmadhusu
2011/07/15 01:22:46
nit: This argument will fit in the previous line.
Lei Zhang
2011/07/15 01:48:02
Done.
| |
| 202 IPC_MESSAGE_HANDLER(PrintMsg_CancelPreview, | |
| 203 OnCancelPreview) | |
|
kmadhusu
2011/07/15 01:22:46
same here
Lei Zhang
2011/07/15 01:48:02
Done.
| |
| 204 IPC_MESSAGE_HANDLER(PrintMsg_AbortPreview, | |
| 205 OnAbortPreview) | |
|
kmadhusu
2011/07/15 01:22:46
same here
Lei Zhang
2011/07/15 01:48:02
Done.
| |
| 204 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, | 206 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, |
| 205 DisplayPrintJobError) | 207 DisplayPrintJobError) |
| 206 IPC_MESSAGE_UNHANDLED(handled = false) | 208 IPC_MESSAGE_UNHANDLED(handled = false) |
| 207 IPC_END_MESSAGE_MAP() | 209 IPC_END_MESSAGE_MAP() |
| 208 return handled; | 210 return handled; |
| 209 } | 211 } |
| 210 | 212 |
| 211 void PrintWebViewHelper::OnPrintForPrintPreview( | 213 void PrintWebViewHelper::OnPrintForPrintPreview( |
| 212 const DictionaryValue& job_settings) { | 214 const DictionaryValue& job_settings) { |
| 213 DCHECK(is_preview_); | 215 DCHECK(is_preview_); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 261 } | 263 } |
| 262 | 264 |
| 263 void PrintWebViewHelper::OnPrintPages() { | 265 void PrintWebViewHelper::OnPrintPages() { |
| 264 WebFrame* frame; | 266 WebFrame* frame; |
| 265 if (GetPrintFrame(&frame)) | 267 if (GetPrintFrame(&frame)) |
| 266 Print(frame, NULL); | 268 Print(frame, NULL); |
| 267 } | 269 } |
| 268 | 270 |
| 269 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { | 271 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { |
| 270 DCHECK(is_preview_); | 272 DCHECK(is_preview_); |
| 271 DCHECK(!context_menu_preview_node_.get() || !script_initiated_preview_frame_); | 273 print_preview_context_.OnPrintPreview(); |
| 272 | 274 |
| 273 if (script_initiated_preview_frame_) { | 275 if (!InitPrintSettings(print_preview_context_.frame(), |
| 274 // Script initiated print preview. | 276 print_preview_context_.node())) { |
| 275 PrintPreview(script_initiated_preview_frame_, NULL, settings); | 277 NOTREACHED(); |
| 276 } else if (context_menu_preview_node_.get()) { | 278 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 } | 279 } |
| 280 | |
| 281 if (!UpdatePrintSettings(settings)) { | |
| 282 DidFinishPrinting(FAIL_PREVIEW); | |
| 283 return; | |
| 284 } | |
| 285 | |
| 286 if (print_pages_params_->params.preview_request_id != 0 && | |
| 287 old_print_pages_params_.get() && | |
| 288 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, | |
| 289 *print_pages_params_)) { | |
| 290 PrintHostMsg_DidPreviewDocument_Params preview_params; | |
| 291 preview_params.reuse_existing_data = true; | |
| 292 preview_params.data_size = 0; | |
| 293 preview_params.document_cookie = | |
| 294 print_pages_params_->params.document_cookie; | |
| 295 preview_params.expected_pages_count = print_preview_context_.page_count(); | |
| 296 preview_params.modifiable = print_preview_context_.IsModifiable(); | |
| 297 preview_params.preview_request_id = | |
| 298 print_pages_params_->params.preview_request_id; | |
| 299 | |
| 300 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); | |
| 301 return; | |
| 302 } | |
| 303 | |
| 304 // PDF printer device supports alpha blending. | |
| 305 print_pages_params_->params.supports_alpha_blend = true; | |
| 306 if (!CreatePreviewDocument()) | |
| 307 DidFinishPrinting(FAIL_PREVIEW); | |
| 308 } | |
| 309 | |
| 310 bool PrintWebViewHelper::CreatePreviewDocument() { | |
| 311 PrintMsg_Print_Params printParams = print_pages_params_->params; | |
| 312 UpdatePrintableSizeInPrintParameters(print_preview_context_.frame(), | |
| 313 print_preview_context_.node(), | |
| 314 &printParams); | |
| 315 | |
| 316 const std::vector<int>& pages = print_pages_params_->pages; | |
| 317 if (!print_preview_context_.CreatePreviewDocument(printParams, pages)) | |
| 318 return false; | |
| 319 int page_count = print_preview_context_.page_count(); | |
| 320 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), page_count)); | |
| 321 PreviewPageRendered(-1); | |
| 322 return true; | |
| 323 } | |
| 324 | |
| 325 void PrintWebViewHelper::OnContinuePreview() { | |
| 326 // Spurious message. We already finished/cancelled/aborted the print preview. | |
| 327 if (!print_preview_context_.IsBusy()) | |
| 328 return; | |
| 329 | |
| 330 int page_number = -1; | |
| 331 if (!print_preview_context_.GetNextPage(&page_number)) { | |
| 332 // Continue generating the print preview. | |
| 333 RenderPreviewPage(page_number); | |
| 334 return; | |
| 335 } | |
| 336 | |
| 337 // Finished generating preview. Finalize the document. | |
| 338 if (!FinalizePreviewDocument()) | |
| 339 DidFinishPrinting(FAIL_PREVIEW); | |
| 340 } | |
| 341 | |
| 342 void PrintWebViewHelper::OnCancelPreview() { | |
| 343 DidFinishPrinting(CANCEL_PREVIEW); | |
| 344 return; | |
| 345 } | |
| 346 | |
| 347 void PrintWebViewHelper::OnAbortPreview() { | |
| 348 DidFinishPrinting(ABORT_PREVIEW); | |
| 349 return; | |
| 350 } | |
| 351 | |
| 352 bool PrintWebViewHelper::FinalizePreviewDocument() { | |
| 353 print_preview_context_.FinalizePreviewDocument(); | |
| 354 | |
| 355 // Get the size of the resulting metafile. | |
| 356 printing::Metafile* metafile = print_preview_context_.metafile(); | |
| 357 uint32 buf_size = metafile->GetDataSize(); | |
| 358 DCHECK_GT(buf_size, 0u); | |
|
kmadhusu
2011/07/15 01:22:46
http://codereview.chromium.org/7365003/diff/9001/c
Lei Zhang
2011/07/15 01:48:02
That was a copy and paste from the Windows EMF pri
| |
| 359 | |
| 360 PrintHostMsg_DidPreviewDocument_Params preview_params; | |
| 361 preview_params.reuse_existing_data = false; | |
| 362 preview_params.data_size = buf_size; | |
| 363 preview_params.document_cookie = print_pages_params_->params.document_cookie; | |
| 364 preview_params.expected_pages_count = print_preview_context_.page_count(); | |
| 365 preview_params.modifiable = print_preview_context_.IsModifiable(); | |
| 366 preview_params.preview_request_id = | |
| 367 print_pages_params_->params.preview_request_id; | |
| 368 | |
| 369 // Ask the browser to create the shared memory for us. | |
| 370 if (!CopyMetafileDataToSharedMem(metafile, | |
| 371 &(preview_params.metafile_data_handle))) { | |
| 372 return false; | |
| 373 } | |
| 374 #if defined(OS_WIN) | |
| 375 Send(new PrintHostMsg_DuplicateSection(routing_id(), | |
| 376 preview_params.metafile_data_handle, | |
| 377 &preview_params.metafile_data_handle)); | |
| 378 #endif | |
| 379 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); | |
| 380 return true; | |
| 286 } | 381 } |
| 287 | 382 |
| 288 void PrintWebViewHelper::OnPrintingDone(bool success) { | 383 void PrintWebViewHelper::OnPrintingDone(bool success) { |
| 289 notify_browser_of_print_failure_ = false; | 384 notify_browser_of_print_failure_ = false; |
| 290 DidFinishPrinting(success ? OK : FAIL_PRINT); | 385 DidFinishPrinting(success ? OK : FAIL_PRINT); |
| 291 } | 386 } |
| 292 | 387 |
| 293 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { | 388 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { |
| 294 const WebNode& context_menu_node = render_view()->context_menu_node(); | 389 const WebNode& context_menu_node = render_view()->context_menu_node(); |
| 295 if (context_menu_node.isNull()) { | 390 if (context_menu_node.isNull()) { |
| 296 NOTREACHED(); | 391 NOTREACHED(); |
| 297 return; | 392 return; |
| 298 } | 393 } |
| 299 | 394 |
| 300 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets | 395 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets |
| 301 // its |context_menu_node_|. | 396 // its |context_menu_node_|. |
| 302 if (is_preview_) { | 397 if (is_preview_) { |
| 303 context_menu_preview_node_.reset(new WebNode(context_menu_node)); | 398 print_preview_context_.InitWithNode(context_menu_node); |
| 304 script_initiated_preview_frame_ = NULL; | |
| 305 RequestPrintPreview(); | 399 RequestPrintPreview(); |
| 306 } else { | 400 } else { |
| 307 WebNode duplicate_node(context_menu_node); | 401 WebNode duplicate_node(context_menu_node); |
| 308 Print(duplicate_node.document().frame(), &duplicate_node); | 402 Print(duplicate_node.document().frame(), &duplicate_node); |
| 309 } | 403 } |
| 310 } | 404 } |
| 311 | 405 |
| 312 void PrintWebViewHelper::OnInitiatePrintPreview() { | 406 void PrintWebViewHelper::OnInitiatePrintPreview() { |
| 313 DCHECK(is_preview_); | 407 DCHECK(is_preview_); |
| 314 script_initiated_preview_frame_ = NULL; | 408 WebFrame* frame; |
| 315 context_menu_preview_node_.reset(); | 409 if (GetPrintFrame(&frame)) |
|
kmadhusu
2011/07/15 01:22:46
Handle the else case.
Lei Zhang
2011/07/15 01:48:02
The else case is to do nothing. I changed this to
| |
| 410 print_preview_context_.InitWithFrame(frame); | |
| 316 RequestPrintPreview(); | 411 RequestPrintPreview(); |
| 317 } | 412 } |
| 318 | 413 |
| 319 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { | 414 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { |
| 320 // If still not finished with earlier print request simply ignore. | 415 // If still not finished with earlier print request simply ignore. |
| 321 if (print_web_view_) | 416 if (print_web_view_) |
| 322 return; | 417 return; |
| 323 | 418 |
| 324 // Initialize print settings. | 419 // Initialize print settings. |
| 325 if (!InitPrintSettings(frame, node)) | 420 if (!InitPrintSettings(frame, node)) |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 350 DidFinishPrinting(OK); // Release resources and fail silently. | 445 DidFinishPrinting(OK); // Release resources and fail silently. |
| 351 return; | 446 return; |
| 352 } | 447 } |
| 353 | 448 |
| 354 // Render Pages for printing. | 449 // Render Pages for printing. |
| 355 if (!RenderPagesForPrint(frame, node)) | 450 if (!RenderPagesForPrint(frame, node)) |
| 356 DidFinishPrinting(FAIL_PRINT); | 451 DidFinishPrinting(FAIL_PRINT); |
| 357 ResetScriptedPrintCount(); | 452 ResetScriptedPrintCount(); |
| 358 } | 453 } |
| 359 | 454 |
| 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) { | 455 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { |
| 399 bool store_print_pages_params = true; | 456 bool store_print_pages_params = true; |
| 400 if (result == FAIL_PRINT) { | 457 if (result == FAIL_PRINT) { |
| 401 DisplayPrintJobError(); | 458 DisplayPrintJobError(); |
| 402 | 459 |
| 403 if (notify_browser_of_print_failure_) { | 460 if (notify_browser_of_print_failure_) { |
| 404 int cookie = print_pages_params_->params.document_cookie; | 461 int cookie = print_pages_params_->params.document_cookie; |
| 405 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); | 462 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); |
| 406 } | 463 } |
| 407 } else if (result == FAIL_PREVIEW) { | 464 } else if (result == FAIL_PREVIEW) { |
| 465 DCHECK(is_preview_); | |
| 466 store_print_pages_params = false; | |
| 408 int cookie = print_pages_params_->params.document_cookie; | 467 int cookie = print_pages_params_->params.document_cookie; |
| 468 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); | |
| 469 print_preview_context_.Abort(); | |
| 470 } else if (result == CANCEL_PREVIEW) { | |
| 471 DCHECK(is_preview_); | |
| 409 store_print_pages_params = false; | 472 store_print_pages_params = false; |
| 410 if (notify_browser_of_print_failure_) { | 473 print_preview_context_.Cancel(); |
| 411 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); | 474 } else if (result == ABORT_PREVIEW) { |
| 412 } else { | 475 DCHECK(is_preview_); |
| 413 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); | 476 store_print_pages_params = false; |
| 414 } | 477 print_preview_context_.Abort(); |
| 478 } else if (result == OK && is_preview_) { | |
| 479 print_preview_context_.Finished(); | |
| 415 } | 480 } |
| 416 | 481 |
| 417 if (print_web_view_) { | 482 if (print_web_view_) { |
| 418 print_web_view_->close(); | 483 print_web_view_->close(); |
| 419 print_web_view_ = NULL; | 484 print_web_view_ = NULL; |
| 420 } | 485 } |
| 421 | 486 |
| 422 if (store_print_pages_params) { | 487 if (store_print_pages_params) { |
| 423 old_print_pages_params_.reset(print_pages_params_.release()); | 488 old_print_pages_params_.reset(print_pages_params_.release()); |
| 424 } else { | 489 } else { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 568 *margin_right_in_points = | 633 *margin_right_in_points = |
| 569 ConvertPixelsToPointDouble(margin_right_in_pixels); | 634 ConvertPixelsToPointDouble(margin_right_in_pixels); |
| 570 if (margin_bottom_in_points) | 635 if (margin_bottom_in_points) |
| 571 *margin_bottom_in_points = | 636 *margin_bottom_in_points = |
| 572 ConvertPixelsToPointDouble(margin_bottom_in_pixels); | 637 ConvertPixelsToPointDouble(margin_bottom_in_pixels); |
| 573 if (margin_left_in_points) | 638 if (margin_left_in_points) |
| 574 *margin_left_in_points = | 639 *margin_left_in_points = |
| 575 ConvertPixelsToPointDouble(margin_left_in_pixels); | 640 ConvertPixelsToPointDouble(margin_left_in_pixels); |
| 576 } | 641 } |
| 577 | 642 |
| 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( | 643 void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters( |
| 589 WebFrame* frame, | 644 WebFrame* frame, |
| 590 WebNode* node, | 645 WebNode* node, |
| 591 PrintMsg_Print_Params* params) { | 646 PrintMsg_Print_Params* params) { |
| 592 double content_width_in_points; | 647 double content_width_in_points; |
| 593 double content_height_in_points; | 648 double content_height_in_points; |
| 594 double margin_top_in_points; | 649 double margin_top_in_points; |
| 595 double margin_right_in_points; | 650 double margin_right_in_points; |
| 596 double margin_bottom_in_points; | 651 double margin_bottom_in_points; |
| 597 double margin_left_in_points; | 652 double margin_left_in_points; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 618 static_cast<int>(ConvertUnitDouble( | 673 static_cast<int>(ConvertUnitDouble( |
| 619 page_height_in_points, printing::kPointsPerInch, dpi))); | 674 page_height_in_points, printing::kPointsPerInch, dpi))); |
| 620 | 675 |
| 621 params->margin_top = static_cast<int>(ConvertUnitDouble( | 676 params->margin_top = static_cast<int>(ConvertUnitDouble( |
| 622 margin_top_in_points, printing::kPointsPerInch, dpi)); | 677 margin_top_in_points, printing::kPointsPerInch, dpi)); |
| 623 params->margin_left = static_cast<int>(ConvertUnitDouble( | 678 params->margin_left = static_cast<int>(ConvertUnitDouble( |
| 624 margin_left_in_points, printing::kPointsPerInch, dpi)); | 679 margin_left_in_points, printing::kPointsPerInch, dpi)); |
| 625 } | 680 } |
| 626 | 681 |
| 627 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, | 682 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, |
| 628 WebKit::WebNode* node) { | 683 WebKit::WebNode* node) { |
|
kmadhusu
2011/07/15 01:22:46
Add DCHECK(frame) here.
Lei Zhang
2011/07/15 01:48:02
Done.
| |
| 629 PrintMsg_PrintPages_Params settings; | 684 PrintMsg_PrintPages_Params settings; |
| 630 | 685 |
| 631 // TODO(abodenha@chromium.org) It doesn't make sense to do this if our | 686 // TODO(abodenha@chromium.org) It doesn't make sense to do this if our |
| 632 // "default" is a cloud based printer. Split InitPrintSettings up | 687 // "default" is a cloud based printer. Split InitPrintSettings up |
| 633 // so that we can avoid the overhead of unneeded calls into the native | 688 // so that we can avoid the overhead of unneeded calls into the native |
| 634 // print system. | 689 // print system. |
| 635 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), | 690 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), |
| 636 &settings.params)); | 691 &settings.params)); |
| 637 // Check if the printer returned any settings, if the settings is empty, we | 692 // 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 | 693 // 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) { | 799 WebKit::WebNode* node) { |
| 745 PrintMsg_PrintPages_Params print_settings = *print_pages_params_; | 800 PrintMsg_PrintPages_Params print_settings = *print_pages_params_; |
| 746 if (print_settings.params.selection_only) { | 801 if (print_settings.params.selection_only) { |
| 747 return CopyAndPrint(frame); | 802 return CopyAndPrint(frame); |
| 748 } else { | 803 } else { |
| 749 // TODO: Always copy before printing. | 804 // TODO: Always copy before printing. |
| 750 return PrintPages(print_settings, frame, node); | 805 return PrintPages(print_settings, frame, node); |
| 751 } | 806 } |
| 752 } | 807 } |
| 753 | 808 |
| 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) | 809 #if defined(OS_POSIX) |
| 791 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( | 810 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( |
| 792 printing::Metafile* metafile, | 811 printing::Metafile* metafile, |
| 793 base::SharedMemoryHandle* shared_mem_handle) { | 812 base::SharedMemoryHandle* shared_mem_handle) { |
| 794 uint32 buf_size = metafile->GetDataSize(); | 813 uint32 buf_size = metafile->GetDataSize(); |
| 795 base::SharedMemoryHandle mem_handle; | 814 base::SharedMemoryHandle mem_handle; |
| 796 Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, &mem_handle)); | 815 Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, &mem_handle)); |
| 797 if (base::SharedMemory::IsHandleValid(mem_handle)) { | 816 if (base::SharedMemory::IsHandleValid(mem_handle)) { |
| 798 base::SharedMemory shared_buf(mem_handle, false); | 817 base::SharedMemory shared_buf(mem_handle, false); |
| 799 if (shared_buf.Map(buf_size)) { | 818 if (shared_buf.Map(buf_size)) { |
| 800 metafile->GetData(shared_buf.memory(), buf_size); | 819 metafile->GetData(shared_buf.memory(), buf_size); |
| 801 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), | 820 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), |
| 802 shared_mem_handle); | 821 shared_mem_handle); |
| 803 return true; | 822 return true; |
| 804 } | 823 } |
| 805 } | 824 } |
| 806 NOTREACHED(); | 825 NOTREACHED(); |
| 807 return false; | 826 return false; |
| 808 } | 827 } |
| 809 #endif // defined(OS_POSIX) | 828 #endif // defined(OS_POSIX) |
| 810 | 829 |
| 811 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( | 830 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( |
| 812 WebKit::WebFrame* frame) { | 831 WebKit::WebFrame* frame) { |
| 813 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; | 832 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; |
| 814 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; | 833 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; |
| 834 bool too_frequent = false; | |
|
kmadhusu
2011/07/15 01:22:46
Declare this variable after the comments
Lei Zhang
2011/07/15 01:48:02
I don't think it helps with readability.
| |
| 815 | 835 |
| 816 // Check if there is script repeatedly trying to print and ignore it if too | 836 // 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 | 837 // 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 | 838 // 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 | 839 // 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. | 840 // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds. |
| 821 // This gives the user time to navigate from the page. | 841 // This gives the user time to navigate from the page. |
| 822 if (user_cancelled_scripted_print_count_ > 0) { | 842 if (user_cancelled_scripted_print_count_ > 0) { |
| 823 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; | 843 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; |
| 824 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; | 844 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; |
| 825 if (user_cancelled_scripted_print_count_ > 3) { | 845 if (user_cancelled_scripted_print_count_ > 3) { |
| 826 min_wait_seconds = std::min( | 846 min_wait_seconds = std::min( |
| 827 kMinSecondsToIgnoreJavascriptInitiatedPrint << | 847 kMinSecondsToIgnoreJavascriptInitiatedPrint << |
| 828 (user_cancelled_scripted_print_count_ - 3), | 848 (user_cancelled_scripted_print_count_ - 3), |
| 829 kMaxSecondsToIgnoreJavascriptInitiatedPrint); | 849 kMaxSecondsToIgnoreJavascriptInitiatedPrint); |
| 830 } | 850 } |
| 831 if (diff.InSeconds() < min_wait_seconds) { | 851 if (diff.InSeconds() < min_wait_seconds) { |
| 832 WebString message(WebString::fromUTF8( | 852 too_frequent = true; |
| 833 "Ignoring too frequent calls to print().")); | |
| 834 frame->addMessageToConsole(WebConsoleMessage( | |
| 835 WebConsoleMessage::LevelWarning, | |
| 836 message)); | |
| 837 return true; | |
| 838 } | 853 } |
| 839 } | 854 } |
| 840 return false; | 855 |
| 856 if (!too_frequent && print_preview_context_.IsBusy()) | |
| 857 too_frequent = true; | |
| 858 | |
| 859 if (!too_frequent) | |
| 860 return false; | |
| 861 | |
| 862 WebString message(WebString::fromUTF8( | |
| 863 "Ignoring too frequent calls to print().")); | |
| 864 frame->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelWarning, | |
| 865 message)); | |
| 866 return true; | |
| 841 } | 867 } |
| 842 | 868 |
| 843 void PrintWebViewHelper::ResetScriptedPrintCount() { | 869 void PrintWebViewHelper::ResetScriptedPrintCount() { |
| 844 // Reset cancel counter on successful print. | 870 // Reset cancel counter on successful print. |
| 845 user_cancelled_scripted_print_count_ = 0; | 871 user_cancelled_scripted_print_count_ = 0; |
| 846 } | 872 } |
| 847 | 873 |
| 848 void PrintWebViewHelper::IncrementScriptedPrintCount() { | 874 void PrintWebViewHelper::IncrementScriptedPrintCount() { |
| 849 ++user_cancelled_scripted_print_count_; | 875 ++user_cancelled_scripted_print_count_; |
| 850 last_cancelled_script_print_ = base::Time::Now(); | 876 last_cancelled_script_print_ = base::Time::Now(); |
| 851 } | 877 } |
| 852 | 878 |
| 853 void PrintWebViewHelper::DisplayPrintJobError() { | 879 void PrintWebViewHelper::DisplayPrintJobError() { |
| 854 WebView* web_view = print_web_view_; | 880 WebView* web_view = print_web_view_; |
| 855 if (!web_view) | 881 if (!web_view) |
| 856 web_view = render_view()->webview(); | 882 web_view = render_view()->webview(); |
| 857 | 883 |
| 858 render_view()->runModalAlertDialog( | 884 render_view()->runModalAlertDialog( |
| 859 web_view->mainFrame(), | 885 web_view->mainFrame(), |
| 860 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); | 886 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); |
| 861 } | 887 } |
| 862 | 888 |
| 863 void PrintWebViewHelper::RequestPrintPreview() { | 889 void PrintWebViewHelper::RequestPrintPreview() { |
| 864 old_print_pages_params_.reset(); | 890 old_print_pages_params_.reset(); |
| 865 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); | 891 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); |
| 866 } | 892 } |
| 867 | 893 |
| 868 bool PrintWebViewHelper::PreviewPageRendered(int page_number) { | 894 void PrintWebViewHelper::PreviewPageRendered(int page_number) { |
| 869 bool cancel = false; | 895 int cookie = print_pages_params_->params.document_cookie; |
| 870 Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number, &cancel)); | 896 Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number, cookie)); |
| 871 if (cancel) | |
| 872 notify_browser_of_print_failure_ = false; | |
| 873 return !cancel; | |
| 874 } | 897 } |
| 898 | |
| 899 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() | |
| 900 : frame_(NULL), | |
| 901 page_count_(0), | |
| 902 actual_page_count_(0), | |
| 903 current_page_(0), | |
| 904 state_(UNINITIALIZED) { | |
| 905 } | |
| 906 | |
| 907 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( | |
| 908 WebKit::WebFrame* web_frame) { | |
| 909 DCHECK(web_frame); | |
| 910 if (IsInitialized()) | |
| 911 return; | |
| 912 state_ = INITIALIZED; | |
| 913 frame_ = web_frame; | |
| 914 node_.reset(); | |
| 915 } | |
| 916 | |
| 917 void PrintWebViewHelper::PrintPreviewContext::InitWithNode( | |
| 918 const WebKit::WebNode& web_node) { | |
| 919 DCHECK(!web_node.isNull()); | |
| 920 if (IsInitialized()) | |
| 921 return; | |
| 922 state_ = INITIALIZED; | |
| 923 frame_ = web_node.document().frame(); | |
| 924 node_.reset(new WebNode(web_node)); | |
| 925 } | |
| 926 | |
| 927 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() { | |
| 928 DCHECK(IsInitialized()); | |
| 929 Reset(); | |
| 930 } | |
| 931 | |
| 932 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( | |
| 933 const PrintMsg_Print_Params& printParams, | |
| 934 const std::vector<int>& pages) { | |
| 935 DCHECK(IsInitialized()); | |
|
kmadhusu
2011/07/15 01:22:46
If (!IsInitialized())
return false;
is better t
Lei Zhang
2011/07/15 01:48:02
The DCHECK should never fail. If it fails in a rel
| |
| 936 state_ = PRINTING; | |
| 937 | |
| 938 print_params_.reset(new PrintMsg_Print_Params(printParams)); | |
| 939 | |
| 940 metafile_.reset(new printing::PreviewMetafile); | |
| 941 if (!metafile_->Init()) | |
| 942 return false; | |
| 943 | |
| 944 // Need to make sure old object gets destroyed first. | |
| 945 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(printParams, | |
| 946 frame(), | |
|
kmadhusu
2011/07/15 01:22:46
nit: frame() can fit in the previous line.
Lei Zhang
2011/07/15 01:48:02
Done.
| |
| 947 node(), | |
| 948 frame()->view())); | |
| 949 page_count_ = prep_frame_view_->GetExpectedPageCount(); | |
| 950 if (page_count_ == 0) | |
| 951 return false; | |
| 952 | |
| 953 current_page_ = 0; | |
| 954 if (pages.empty()) { | |
|
kmadhusu
2011/07/15 01:22:46
How about:
actual_page_count = pages.empty()? pag
Lei Zhang
2011/07/15 01:48:02
Your logic is wrong.
kmadhusu
2011/07/15 19:25:46
oops.. I meant if (actual_page_count_ == page_coun
| |
| 955 actual_page_count_ = page_count_; | |
| 956 rendered_pages_ = std::vector<bool>(page_count_, false); | |
| 957 } else { | |
| 958 actual_page_count_ = pages.size(); | |
| 959 rendered_pages_ = std::vector<bool>(page_count_, true); | |
| 960 for (size_t i = 0; i < pages.size(); ++i) { | |
|
kmadhusu
2011/07/15 01:22:46
"i < actual_page_count_"
Lei Zhang
2011/07/15 01:48:02
Done.
| |
| 961 int page_number = pages[i]; | |
| 962 if (page_number < 0 || page_number >= page_count_) | |
| 963 return false; | |
| 964 rendered_pages_[page_number] = false; | |
| 965 } | |
| 966 } | |
| 967 | |
| 968 document_render_time_ = base::TimeDelta(); | |
| 969 begin_time_ = base::TimeTicks::Now(); | |
| 970 | |
| 971 return true; | |
| 972 } | |
| 973 | |
| 974 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( | |
| 975 const base::TimeDelta& page_time) { | |
| 976 DCHECK_EQ(PRINTING, state_); | |
| 977 document_render_time_ += page_time; | |
| 978 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); | |
| 979 } | |
| 980 | |
| 981 void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { | |
| 982 DCHECK_EQ(PRINTING, state_); | |
| 983 state_ = DONE; | |
| 984 | |
| 985 base::TimeTicks begin_time = base::TimeTicks::Now(); | |
| 986 | |
| 987 prep_frame_view_->FinishPrinting(); | |
|
kmadhusu
2011/07/15 01:22:46
Please retain the previous comment.
http://codere
Lei Zhang
2011/07/15 01:48:02
We have the comment on Windows only, but not Linux
| |
| 988 metafile_->FinishDocument(); | |
|
kmadhusu
2011/07/15 01:22:46
if (!metafile->FinishDocument)
NOTREACHED();
Lei Zhang
2011/07/15 01:48:02
Again, we don't have it on Mac/Linux.
kmadhusu
2011/07/15 19:25:46
At least on linux, we should have handled this cas
| |
| 989 | |
| 990 if (actual_page_count_ <= 0) { | |
| 991 NOTREACHED(); | |
| 992 return; | |
| 993 } | |
| 994 | |
| 995 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", | |
| 996 document_render_time_); | |
| 997 base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) + | |
| 998 document_render_time_; | |
|
kmadhusu
2011/07/15 01:22:46
nit: Fix indentation.
Lei Zhang
2011/07/15 01:48:02
Done.
| |
| 999 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", | |
| 1000 total_time); | |
| 1001 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", | |
| 1002 total_time / actual_page_count_); | |
| 1003 } | |
| 1004 | |
| 1005 void PrintWebViewHelper::PrintPreviewContext::Finished() { | |
| 1006 DCHECK_EQ(DONE, state_); | |
| 1007 Reset(); | |
| 1008 } | |
| 1009 | |
| 1010 void PrintWebViewHelper::PrintPreviewContext::Abort() { | |
| 1011 state_ = UNINITIALIZED; | |
| 1012 Reset(); | |
| 1013 frame_ = NULL; | |
| 1014 node_.reset(); | |
| 1015 } | |
| 1016 | |
| 1017 void PrintWebViewHelper::PrintPreviewContext::Cancel() { | |
| 1018 DCHECK(IsInitialized()); | |
| 1019 state_ = DONE; | |
| 1020 Reset(); | |
| 1021 } | |
| 1022 | |
| 1023 bool PrintWebViewHelper::PrintPreviewContext::GetNextPage( | |
| 1024 int* page_number) { | |
| 1025 DCHECK_EQ(PRINTING, state_); | |
| 1026 while (current_page_ < page_count_ && rendered_pages_[current_page_]) | |
| 1027 ++current_page_; | |
| 1028 if (current_page_ == page_count_) | |
| 1029 return true; | |
| 1030 rendered_pages_[current_page_] = true; | |
| 1031 *page_number = current_page_++; | |
| 1032 return false; | |
| 1033 } | |
| 1034 | |
| 1035 bool PrintWebViewHelper::PrintPreviewContext::IsInitialized() const { | |
|
kmadhusu
2011/07/15 01:22:46
I was expecting "return state_ == INITIALIZED;" as
Lei Zhang
2011/07/15 01:48:02
Changed to "IsReadyToRender()"
| |
| 1036 return state_ != UNINITIALIZED; | |
| 1037 } | |
| 1038 | |
| 1039 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const { | |
|
kmadhusu
2011/07/15 01:22:46
This function needs a better name.
state PRINTIN
Lei Zhang
2011/07/15 01:48:02
I can't think of a better name. "Busy" is relative
| |
| 1040 return state_ == INITIALIZED || state_ == PRINTING; | |
| 1041 } | |
| 1042 | |
| 1043 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { | |
| 1044 if (node()) | |
| 1045 return false; | |
| 1046 std::string mime(frame()->dataSource()->response().mimeType().utf8()); | |
| 1047 if (mime == "application/pdf") | |
|
kmadhusu
2011/07/15 01:22:46
Instead of lines 1047-1049, use
return mime != "
Lei Zhang
2011/07/15 01:48:02
Done.
| |
| 1048 return false; | |
| 1049 return true; | |
| 1050 } | |
| 1051 | |
| 1052 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { | |
| 1053 return frame_; | |
| 1054 } | |
| 1055 | |
| 1056 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const { | |
| 1057 return node_.get(); | |
| 1058 } | |
| 1059 | |
| 1060 int PrintWebViewHelper::PrintPreviewContext::page_count() const { | |
| 1061 return page_count_; | |
| 1062 } | |
| 1063 | |
| 1064 printing::Metafile* PrintWebViewHelper::PrintPreviewContext::metafile() const { | |
| 1065 return metafile_.get(); | |
| 1066 } | |
| 1067 | |
| 1068 const PrintMsg_Print_Params& | |
| 1069 PrintWebViewHelper::PrintPreviewContext::print_params() const { | |
| 1070 return *print_params_; | |
| 1071 } | |
| 1072 | |
| 1073 const gfx::Size& | |
| 1074 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { | |
| 1075 return prep_frame_view_->GetPrintCanvasSize(); | |
| 1076 } | |
| 1077 | |
| 1078 void PrintWebViewHelper::PrintPreviewContext::Reset() { | |
| 1079 prep_frame_view_.reset(); | |
| 1080 metafile_.reset(); | |
| 1081 rendered_pages_.clear(); | |
| 1082 } | |
| OLD | NEW |