Skip to content

Commit

Permalink
Applying factory pattern (through NativeMetafileFactory class). It is…
Browse files Browse the repository at this point in the history
… used to retrieve different printing contexts (based on the platform and user preferences).

BUG=NONE
TEST=NONE

Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=76553

Reverted: http://src.chromium.org/viewvc/chrome?view=rev&revision=76555

Review URL: http://codereview.chromium.org/6544028

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@76581 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
dpapad@chromium.org committed Mar 2, 2011
1 parent f83773f commit 5ad7617
Show file tree
Hide file tree
Showing 30 changed files with 621 additions and 214 deletions.
3 changes: 2 additions & 1 deletion chrome/browser/printing/print_view_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "content/browser/tab_contents/navigation_entry.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "grit/generated_resources.h"
#include "printing/native_metafile_factory.h"
#include "printing/native_metafile.h"
#include "printing/printed_document.h"
#include "ui/base/l10n/l10n_util.h"
Expand Down Expand Up @@ -130,7 +131,7 @@ void PrintViewManager::OnDidPrintPage(
}
}

scoped_ptr<NativeMetafile> metafile(new NativeMetafile());
scoped_ptr<NativeMetafile> metafile(NativeMetafileFactory::CreateMetafile());
if (metafile_must_be_valid) {
if (!metafile->Init(shared_buf.memory(), params.data_size)) {
NOTREACHED() << "Invalid metafile header";
Expand Down
39 changes: 23 additions & 16 deletions chrome/common/common_param_traits_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,16 @@
#include "ipc/ipc_message_utils.h"
#include "net/base/host_port_pair.h"
#include "printing/backend/print_backend.h"
#include "printing/native_metafile.h"
#include "printing/page_range.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/rect.h"

#if defined(OS_WIN)
#include "printing/native_metafile_factory.h"
#include "printing/native_metafile.h"
#endif

// Tests that serialize/deserialize correctly understand each other
TEST(IPCMessageTest, Serialize) {
const char* serialize_cases[] = {
Expand Down Expand Up @@ -227,42 +231,45 @@ TEST(IPCMessageTest, PageRange) {
EXPECT_TRUE(input == output);
}

// Tests printing::NativeMetafile serialization.
// Tests printing::Emf serialization.
// TODO(sanjeevr): Make this test meaningful for non-Windows platforms. We
// need to initialize the metafile using alternate means on the other OSes.
#if defined(OS_WIN)
TEST(IPCMessageTest, Metafile) {
printing::NativeMetafile metafile;
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
RECT test_rect = {0, 0, 100, 100};
// Create a metsfile using the screen DC as a reference.
metafile.CreateDc(NULL, NULL);
metafile.CloseDc();
// Create a metafile using the screen DC as a reference.
metafile->CreateDc(NULL, NULL);
metafile->CloseDc();

IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
IPC::ParamTraits<printing::NativeMetafile>::Write(&msg, metafile);
IPC::ParamTraits<printing::NativeMetafile>::Write(&msg, *metafile);

printing::NativeMetafile output;
scoped_ptr<printing::NativeMetafile> output(
printing::NativeMetafileFactory::CreateMetafile());
void* iter = NULL;
EXPECT_TRUE(IPC::ParamTraits<printing::NativeMetafile>::Read(
&msg, &iter, &output));
&msg, &iter, output.get()));

EXPECT_EQ(metafile.GetDataSize(), output.GetDataSize());
EXPECT_EQ(metafile.GetBounds(), output.GetBounds());
EXPECT_EQ(::GetDeviceCaps(metafile.hdc(), LOGPIXELSX),
::GetDeviceCaps(output.hdc(), LOGPIXELSX));
EXPECT_EQ(metafile->GetDataSize(), output->GetDataSize());
EXPECT_EQ(metafile->GetBounds(), output->GetBounds());
EXPECT_EQ(::GetDeviceCaps(metafile->hdc(), LOGPIXELSX),
::GetDeviceCaps(output->hdc(), LOGPIXELSX));

// Also test the corrupt case.
IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL);
// Write some bogus metafile data.
const size_t bogus_data_size = metafile.GetDataSize() * 2;
const size_t bogus_data_size = metafile->GetDataSize() * 2;
scoped_array<char> bogus_data(new char[bogus_data_size]);
memset(bogus_data.get(), 'B', bogus_data_size);
bad_msg.WriteData(bogus_data.get(), bogus_data_size);
// Make sure we don't read out the metafile!
printing::NativeMetafile bad_output;
scoped_ptr<printing::NativeMetafile> bad_output(
printing::NativeMetafileFactory::CreateMetafile());
iter = NULL;
EXPECT_FALSE(IPC::ParamTraits<printing::NativeMetafile>::Read(
&bad_msg, &iter, &bad_output));
&bad_msg, &iter, bad_output.get()));
}
#endif // defined(OS_WIN)

Expand Down
22 changes: 14 additions & 8 deletions chrome/plugin/webplugin_delegate_stub.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

Expand All @@ -14,7 +14,6 @@
#include "chrome/plugin/plugin_channel.h"
#include "chrome/plugin/plugin_thread.h"
#include "chrome/plugin/webplugin_proxy.h"
#include "printing/native_metafile.h"
#include "third_party/npapi/bindings/npapi.h"
#include "third_party/npapi/bindings/npruntime.h"
#include "skia/ext/platform_device.h"
Expand All @@ -23,6 +22,12 @@
#include "webkit/plugins/npapi/webplugin_delegate_impl.h"
#include "webkit/glue/webcursor.h"

#if defined(OS_WIN)
#include "base/scoped_ptr.h"
#include "printing/native_metafile_factory.h"
#include "printing/native_metafile.h"
#endif // defined(OS_WIN)

#if defined(ENABLE_GPU)
#include "app/gfx/gl/gl_context.h"
#endif
Expand Down Expand Up @@ -281,26 +286,27 @@ void WebPluginDelegateStub::OnDidPaint() {
void WebPluginDelegateStub::OnPrint(base::SharedMemoryHandle* shared_memory,
uint32* size) {
#if defined(OS_WIN)
printing::NativeMetafile metafile;
if (!metafile.CreateDc(NULL, NULL)) {
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
if (!metafile->CreateDc(NULL, NULL)) {
NOTREACHED();
return;
}
HDC hdc = metafile.hdc();
HDC hdc = metafile->hdc();
skia::PlatformDevice::InitializeDC(hdc);
delegate_->Print(hdc);
if (!metafile.CloseDc()) {
if (!metafile->CloseDc()) {
NOTREACHED();
return;
}

*size = metafile.GetDataSize();
*size = metafile->GetDataSize();
DCHECK(*size);
base::SharedMemory shared_buf;
CreateSharedBuffer(*size, &shared_buf, shared_memory);

// Retrieve a copy of the data.
bool success = metafile.GetData(shared_buf.memory(), *size);
bool success = metafile->GetData(shared_buf.memory(), *size);
DCHECK(success);
#else
// TODO(port): plugin printing.
Expand Down
9 changes: 6 additions & 3 deletions chrome/renderer/mock_printer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#include "chrome/common/render_messages.h"
#include "chrome/common/render_messages_params.h"
#include "ipc/ipc_message_utils.h"
#include "printing/native_metafile_factory.h"
#include "printing/native_metafile.h"
#include "printing/units.h"
#include "testing/gtest/include/gtest/gtest.h"

Expand Down Expand Up @@ -131,9 +133,10 @@ void MockPrinter::PrintPage(const ViewHostMsg_DidPrintPage_Params& params) {
base::SharedMemory metafile_data(params.metafile_data_handle, true);
#endif
metafile_data.Map(params.data_size);
printing::NativeMetafile metafile;
metafile.Init(metafile_data.memory(), params.data_size);
printing::Image image(metafile);
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
metafile->Init(metafile_data.memory(), params.data_size);
printing::Image image(*metafile);
MockPrinterPage* page_data = new MockPrinterPage(metafile_data.memory(),
params.data_size,
image);
Expand Down
22 changes: 13 additions & 9 deletions chrome/renderer/print_web_view_helper_linux.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@

#include "base/file_descriptor_posix.h"
#include "base/logging.h"
#include "base/scoped_ptr.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/render_messages_params.h"
#include "printing/native_metafile_factory.h"
#include "printing/native_metafile.h"
#include "skia/ext/vector_canvas.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
Expand All @@ -23,22 +25,23 @@ void PrintWebViewHelper::CreatePreviewDocument(
const ViewMsg_PrintPages_Params& params, WebFrame* frame) {
// We only can use PDF in the renderer because Cairo needs to create a
// temporary file for a PostScript surface.
printing::NativeMetafile metafile;
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
int page_count = 0;

if (!RenderPages(params, frame, false, &page_count, &metafile))
if (!RenderPages(params, frame, false, &page_count, metafile.get()))
return;

// Get the size of the resulting metafile.
uint32 buf_size = metafile.GetDataSize();
uint32 buf_size = metafile->GetDataSize();
DCHECK_GT(buf_size, 0u);

ViewHostMsg_DidPreviewDocument_Params preview_params;
preview_params.document_cookie = params.params.document_cookie;
preview_params.expected_pages_count = page_count;
preview_params.data_size = buf_size;

if (!CopyMetafileDataToSharedMem(&metafile,
if (!CopyMetafileDataToSharedMem(metafile.get(),
&(preview_params.metafile_data_handle))) {
preview_params.expected_pages_count = 0;
preview_params.data_size = 0;
Expand All @@ -51,7 +54,8 @@ void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params,
WebNode* node) {
// We only can use PDF in the renderer because Cairo needs to create a
// temporary file for a PostScript surface.
printing::NativeMetafile metafile;
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
int page_count = 0;
bool send_expected_page_count =
#if defined(OS_CHROMEOS)
Expand All @@ -61,12 +65,12 @@ void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params,
#endif // defined(OS_CHROMEOS)

if (!RenderPages(params, frame, send_expected_page_count, &page_count,
&metafile)) {
metafile.get())) {
return;
}

// Get the size of the resulting metafile.
uint32 buf_size = metafile.GetDataSize();
uint32 buf_size = metafile->GetDataSize();
DCHECK_GT(buf_size, 0u);

#if defined(OS_CHROMEOS)
Expand All @@ -78,7 +82,7 @@ void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params,
&sequence_number))) {
return;
}
if (!metafile.SaveTo(fd))
if (!metafile->SaveTo(fd))
return;

// Tell the browser we've finished writing the file.
Expand All @@ -105,7 +109,7 @@ void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params,
NOTREACHED() << "Map failed";
return;
}
metafile.GetData(shared_buf.memory(), buf_size);
metafile->GetData(shared_buf.memory(), buf_size);
printed_page_params.data_size = buf_size;
shared_buf.GiveToProcess(base::GetCurrentProcessHandle(),
&(printed_page_params.metafile_data_handle));
Expand Down
31 changes: 18 additions & 13 deletions chrome/renderer/print_web_view_helper_mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,21 @@
#import <AppKit/AppKit.h>

#include "base/logging.h"
#include "base/scoped_ptr.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/render_messages_params.h"
#include "printing/native_metafile_factory.h"
#include "printing/native_metafile.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"

using WebKit::WebFrame;

void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params,
const gfx::Size& canvas_size,
WebFrame* frame) {
printing::NativeMetafile metafile;
if (!metafile.Init())
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
if (!metafile->Init())
return;

float scale_factor = frame->getPrintPageShrink(params.page_number);
Expand All @@ -26,11 +30,11 @@
// Render page for printing.
gfx::Point origin(0.0f, 0.0f);
RenderPage(params.params.printable_size, origin, scale_factor, page_number,
frame, &metafile);
metafile.Close();
frame, metafile.get());
metafile->Close();

ViewHostMsg_DidPrintPage_Params page_params;
page_params.data_size = metafile.GetDataSize();
page_params.data_size = metafile->GetDataSize();
page_params.page_number = page_number;
page_params.document_cookie = params.params.document_cookie;
page_params.actual_shrink = scale_factor;
Expand All @@ -41,7 +45,7 @@
params.params.printable_size.height());

// Ask the browser to create the shared memory for us.
if (!CopyMetafileDataToSharedMem(&metafile,
if (!CopyMetafileDataToSharedMem(metafile.get(),
&(page_params.metafile_data_handle))) {
page_params.data_size = 0;
}
Expand All @@ -61,34 +65,35 @@ PrepareFrameAndViewForPrint prep_frame_view(printParams,
if (!page_count)
return;

printing::NativeMetafile metafile;
if (!metafile.Init())
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
if (!metafile->Init())
return;

float scale_factor = frame->getPrintPageShrink(0);
gfx::Point origin(printParams.margin_left, printParams.margin_top);
if (params.pages.empty()) {
for (int i = 0; i < page_count; ++i) {
RenderPage(printParams.page_size, origin, scale_factor, i, frame,
&metafile);
metafile.get());
}
} else {
for (size_t i = 0; i < params.pages.size(); ++i) {
if (params.pages[i] >= page_count)
break;
RenderPage(printParams.page_size, origin, scale_factor,
static_cast<int>(params.pages[i]), frame, &metafile);
static_cast<int>(params.pages[i]), frame, metafile.get());
}
}
metafile.Close();
metafile->Close();

ViewHostMsg_DidPreviewDocument_Params preview_params;
preview_params.data_size = metafile.GetDataSize();
preview_params.data_size = metafile->GetDataSize();
preview_params.document_cookie = params.params.document_cookie;
preview_params.expected_pages_count = page_count;

// Ask the browser to create the shared memory for us.
if (!CopyMetafileDataToSharedMem(&metafile,
if (!CopyMetafileDataToSharedMem(metafile.get(),
&(preview_params.metafile_data_handle))) {
preview_params.data_size = 0;
preview_params.expected_pages_count = 0;
Expand Down
10 changes: 7 additions & 3 deletions chrome/renderer/print_web_view_helper_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include "base/process_util.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/render_messages_params.h"
#include "printing/native_metafile_factory.h"
#include "printing/native_metafile.h"
#include "printing/units.h"
#include "skia/ext/vector_canvas.h"
#include "skia/ext/vector_platform_device.h"
Expand Down Expand Up @@ -67,7 +69,8 @@ void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params,
WebFrame* frame) {
// Generate a memory-based metafile. It will use the current screen's DPI.
// Each metafile contains a single page.
scoped_ptr<printing::NativeMetafile> metafile(new printing::NativeMetafile);
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
metafile->CreateDc(NULL, NULL);
DCHECK(metafile->hdc());
skia::PlatformDevice::InitializeDC(metafile->hdc());
Expand Down Expand Up @@ -133,7 +136,8 @@ void PrintWebViewHelper::CreatePreviewDocument(
// PDF backend" work is completed for windows, make changes to replace this
// EMF with PDF metafile.
// http://code.google.com/p/chromium/issues/detail?id=62889
scoped_ptr<printing::NativeMetafile> metafile(new printing::NativeMetafile);
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::CreateMetafile());
metafile->CreateDc(NULL, NULL);
DCHECK(metafile->hdc());
skia::PlatformDevice::InitializeDC(metafile->hdc());
Expand Down Expand Up @@ -258,7 +262,7 @@ void PrintWebViewHelper::RenderPage(
NOTREACHED();

scoped_ptr<printing::NativeMetafile> metafile2(
new printing::NativeMetafile);
printing::NativeMetafileFactory::CreateMetafile());
// Page used alpha blend, but printer doesn't support it. Rewrite the
// metafile and flatten out the transparency.
HDC bitmap_dc = CreateCompatibleDC(GetDC(NULL));
Expand Down
Loading

0 comments on commit 5ad7617

Please sign in to comment.