Chromium Code Reviews| Index: chrome/renderer/print_web_view_helper_win.cc |
| diff --git a/chrome/renderer/print_web_view_helper_win.cc b/chrome/renderer/print_web_view_helper_win.cc |
| index dda6b9681138d1bcd9cd8fa48109492484982915..22470606fd0b0e808a2227532679a2a2ecec3cff 100644 |
| --- a/chrome/renderer/print_web_view_helper_win.cc |
| +++ b/chrome/renderer/print_web_view_helper_win.cc |
| @@ -11,9 +11,11 @@ |
| #include "chrome/common/print_messages.h" |
| #include "printing/metafile.h" |
| #include "printing/metafile_impl.h" |
| +#include "printing/metafile_skia_wrapper.h" |
| #include "printing/units.h" |
| #include "skia/ext/vector_canvas.h" |
| #include "skia/ext/vector_platform_device_emf_win.h" |
| +#include "third_party/skia/include/core/SkRefCnt.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| #include "ui/gfx/gdi_util.h" |
| #include "ui/gfx/point.h" |
| @@ -154,18 +156,22 @@ bool PrintWebViewHelper::CreatePreviewDocument( |
| break; |
| float scale_factor = shrink; |
| RenderPage(print_params, &scale_factor, |
| - static_cast<int>(params.pages[i]), true, frame, &metafile); |
| + static_cast<int>(params.pages[i]), true, frame, &metafile); |
| } |
| } |
| + // Ensure that printing has finished before we start cleaning up and |
| + // allocating buffers. |
|
Lei Zhang
2011/05/24 00:24:16
please just make this comment a bit clearer.
vandebo (ex-Chrome)
2011/05/24 05:48:38
Done.
|
| + prep_frame_view.FinishPrinting(); |
| + |
| + if (!metafile->FinishDocument()) |
| + NOTREACHED(); |
| + |
| // Calculate the time taken to render the requested page for preview and add |
| // the net time in the histogram. |
| UMA_HISTOGRAM_TIMES("PrintPreview.RenderTime", |
| base::TimeTicks::Now() - begin_time); |
| - if (!metafile->FinishDocument()) |
| - NOTREACHED(); |
| - |
| // Get the size of the compiled metafile. |
| uint32 buf_size = metafile->GetDataSize(); |
| DCHECK_GT(buf_size, 128u); |
| @@ -223,9 +229,16 @@ void PrintWebViewHelper::RenderPage( |
| skia::PlatformDevice* device = (*metafile)->StartPageForVectorCanvas( |
| page_size, content_area, frame->getPrintPageShrink(page_number)); |
| DCHECK(device); |
| - skia::VectorCanvas canvas(device); |
| + // The printPage method may take a reference to the canvas we pass down, so it |
| + // can't be a stack object. |
| + SkRefPtr<skia::VectorCanvas> canvas = new skia::VectorCanvas(device); |
| + canvas->unref(); // SkRefPtr and new both took a reference. |
| + if (is_preview) { |
| + printing::MetafileSkiaWrapper::SetMetafileOnCanvas(canvas.get(), |
| + metafile->get()); |
| + } |
| - float webkit_scale_factor = frame->printPage(page_number, &canvas); |
| + float webkit_scale_factor = frame->printPage(page_number, canvas.get()); |
| if (*scale_factor <= 0 || webkit_scale_factor <= 0) { |
| NOTREACHED() << "Printing page " << page_number << " failed."; |
| } else { |