| 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..4151818e1e18d1acc083803c2d740a85f00816d5 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,24 @@ 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; this causes prep_frame_view to flush anything pending
|
| + // into the metafile. Then we can get the final size and copy it into a
|
| + // shared segment.
|
| + 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 +231,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 {
|
|
|