summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/chrome.gyp2
-rw-r--r--chrome/renderer/mock_printer.cc57
-rw-r--r--chrome/renderer/mock_printer.h56
-rw-r--r--chrome/renderer/mock_printer_driver_win.cc125
-rw-r--r--chrome/renderer/mock_printer_driver_win.h25
-rw-r--r--chrome/renderer/render_view.cc16
-rw-r--r--chrome/renderer/render_view.h1
-rw-r--r--chrome/renderer/render_view_unittest.cc50
8 files changed, 89 insertions, 243 deletions
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index e78c383..e76e2f3 100644
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -3221,8 +3221,6 @@
'renderer/mock_keyboard_driver_win.h',
'renderer/mock_printer.cc',
'renderer/mock_printer.h',
- 'renderer/mock_printer_driver_win.cc',
- 'renderer/mock_printer_driver_win.h',
'renderer/mock_render_process.h',
'renderer/mock_render_thread.cc',
'renderer/mock_render_thread.h',
diff --git a/chrome/renderer/mock_printer.cc b/chrome/renderer/mock_printer.cc
index 2454a0c..4462ce7 100644
--- a/chrome/renderer/mock_printer.cc
+++ b/chrome/renderer/mock_printer.cc
@@ -5,9 +5,7 @@
#include "chrome/renderer/mock_printer.h"
#include "base/file_util.h"
-#include "base/gfx/png_encoder.h"
#include "base/logging.h"
-#include "base/md5.h"
#include "base/shared_memory.h"
#include "chrome/common/ipc_message_utils.h"
#include "chrome/common/render_messages.h"
@@ -116,8 +114,12 @@ void MockPrinter::PrintPage(const ViewHostMsg_DidPrintPage_Params& params) {
base::SharedMemory emf_data(params.metafile_data_handle, true,
GetCurrentProcess());
emf_data.Map(params.data_size);
- MockPrinterPage* page_data = driver_.LoadSource(emf_data.memory(),
- params.data_size);
+ printing::NativeMetafile metafile;
+ metafile.CreateFromData(emf_data.memory(), params.data_size);
+ printing::Image image(metafile);
+ MockPrinterPage* page_data = new MockPrinterPage(emf_data.memory(),
+ params.data_size,
+ image);
if (!page_data) {
printer_status_ = PRINTER_ERROR;
return;
@@ -140,6 +142,13 @@ int MockPrinter::GetPrintedPages() const {
return page_number_;
}
+const MockPrinterPage* MockPrinter::GetPrintedPage(size_t pageno) const {
+ if (pages_.size() > pageno)
+ return pages_[pageno];
+ else
+ return NULL;
+}
+
int MockPrinter::GetWidth(size_t page) const {
if (printer_status_ != PRINTER_READY || page >= pages_.size())
return -1;
@@ -152,27 +161,10 @@ int MockPrinter::GetHeight(size_t page) const {
return pages_[page]->height();
}
-bool MockPrinter::GetSourceChecksum(size_t page, std::string* checksum) const {
- if (printer_status_ != PRINTER_READY || page >= pages_.size())
- return false;
- return GetChecksum(pages_[page]->source_data(), pages_[page]->source_size(),
- checksum);
-}
-
bool MockPrinter::GetBitmapChecksum(size_t page, std::string* checksum) const {
if (printer_status_ != PRINTER_READY || page >= pages_.size())
return false;
- return GetChecksum(pages_[page]->bitmap_data(), pages_[page]->bitmap_size(),
- checksum);
-}
-
-bool MockPrinter::GetBitmap(size_t page,
- const void** data,
- size_t* size) const {
- if (printer_status_ != PRINTER_READY || page >= pages_.size())
- return false;
- *data = pages_[page]->bitmap_data();
- *size = pages_[page]->bitmap_size();
+ *checksum = pages_[page]->image().checksum();
return true;
}
@@ -191,17 +183,8 @@ bool MockPrinter::SaveBitmap(size_t page,
const std::wstring& filename) const {
if (printer_status_ != PRINTER_READY || page >= pages_.size())
return false;
- int width = pages_[page]->width();
- int height = pages_[page]->height();
- int row_byte_width = width * 4;
- const uint8* bitmap_data = pages_[page]->bitmap_data();
- std::vector<unsigned char> compressed;
- PNGEncoder::Encode(bitmap_data,
- PNGEncoder::FORMAT_BGRA, width, height,
- row_byte_width, true, &compressed);
- file_util::WriteFile(filename,
- reinterpret_cast<char*>(&*compressed.begin()),
- compressed.size());
+
+ pages_[page]->image().SaveToPng(filename);
return true;
}
@@ -209,11 +192,3 @@ int MockPrinter::CreateDocumentCookie() {
return ++current_document_cookie_;
}
-bool MockPrinter::GetChecksum(const void* data,
- size_t size,
- std::string* checksum) const {
- MD5Digest digest;
- MD5Sum(data, size, &digest);
- checksum->assign(HexEncode(&digest, sizeof(digest)));
- return true;
-}
diff --git a/chrome/renderer/mock_printer.h b/chrome/renderer/mock_printer.h
index 16577cb..ba3f0de 100644
--- a/chrome/renderer/mock_printer.h
+++ b/chrome/renderer/mock_printer.h
@@ -11,10 +11,7 @@
#include "base/basictypes.h"
#include "base/ref_counted.h"
#include "base/scoped_ptr.h"
-
-#if defined(OS_WIN)
-#include "chrome/renderer/mock_printer_driver_win.h"
-#endif
+#include "printing/image.h"
struct ViewMsg_Print_Params;
struct ViewMsg_PrintPages_Params;
@@ -26,49 +23,30 @@ struct ViewHostMsg_DidPrintPage_Params;
// a smart pointer of this object (i.e. scoped_refptr<>).
class MockPrinterPage : public base::RefCounted<MockPrinterPage> {
public:
- MockPrinterPage()
- : width_(0),
- height_(0),
- source_size_(0),
- bitmap_size_(0) {
- }
-
- MockPrinterPage(int width,
- int height,
- const void* source_data,
+ MockPrinterPage(const void* source_data,
size_t source_size,
- const void* bitmap_data,
- size_t bitmap_size)
- : width_(width),
- height_(height),
- source_size_(source_size),
- bitmap_size_(bitmap_size) {
- // Create copies of the source data and the bitmap data.
+ const printing::Image& image)
+ : source_size_(source_size),
+ image_(image) {
+ // Create copies of the source data
source_data_.reset(new uint8[source_size]);
if (source_data_.get())
memcpy(source_data_.get(), source_data, source_size);
- bitmap_data_.reset(new uint8[bitmap_size]);
- if (bitmap_data_.get())
- memcpy(bitmap_data_.get(), bitmap_data, bitmap_size);
}
~MockPrinterPage() {
}
- int width() { return width_; }
- int height() { return height_; }
- const uint8* source_data() { return source_data_.get(); }
- const size_t source_size() { return source_size_; }
- const uint8* bitmap_data() { return bitmap_data_.get(); }
- const size_t bitmap_size() { return bitmap_size_; }
+ int width() const { return image_.size().width(); }
+ int height() const { return image_.size().height(); }
+ const uint8* source_data() const { return source_data_.get(); }
+ const size_t source_size() const { return source_size_; }
+ const printing::Image& image() const { return image_; }
private:
- int width_;
- int height_;
size_t source_size_;
scoped_array<uint8> source_data_;
- size_t bitmap_size_;
- scoped_array<uint8> bitmap_data_;
+ printing::Image image_;
DISALLOW_COPY_AND_ASSIGN(MockPrinterPage);
};
@@ -108,9 +86,13 @@ class MockPrinter {
// Functions that retrieve the output pages.
Status GetPrinterStatus() const { return printer_status_; }
int GetPrintedPages() const;
+
+ // Get a pointer to the printed page, returns NULL if pageno has not been
+ // printed. The pointer is for read only view and should not be deleted.
+ const MockPrinterPage* GetPrintedPage(size_t pageno) const;
+
int GetWidth(size_t page) const;
int GetHeight(size_t page) const;
- bool GetSourceChecksum(size_t page, std::string* checksum) const;
bool GetBitmapChecksum(size_t page, std::string* checksum) const;
bool GetSource(size_t page, const void** data, size_t* size) const;
bool GetBitmap(size_t page, const void** data, size_t* size) const;
@@ -149,10 +131,6 @@ class MockPrinter {
int page_number_;
std::vector<scoped_refptr<MockPrinterPage> > pages_;
-#if defined(OS_WIN)
- MockPrinterDriverWin driver_;
-#endif
-
DISALLOW_COPY_AND_ASSIGN(MockPrinter);
};
diff --git a/chrome/renderer/mock_printer_driver_win.cc b/chrome/renderer/mock_printer_driver_win.cc
deleted file mode 100644
index 8fefd8e..0000000
--- a/chrome/renderer/mock_printer_driver_win.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2009 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.
-
-#include "chrome/renderer/mock_printer_driver_win.h"
-
-#include "base/gfx/gdi_util.h"
-#include "base/logging.h"
-#include "printing/emf_win.h"
-#include "chrome/renderer/mock_printer.h"
-#include "skia/ext/platform_device.h"
-
-namespace {
-
-// A simple class which temporarily overrides system settings.
-// The bitmap image rendered via the PlayEnhMetaFile() function depends on
-// some system settings.
-// As a workaround for such dependency, this class saves the system settings
-// and changes them. This class also restore the saved settings in its
-// destructor.
-class SystemSettingsOverride {
- public:
- SystemSettingsOverride() : font_smoothing_(0) {
- }
-
- ~SystemSettingsOverride() {
- SystemParametersInfo(SPI_SETFONTSMOOTHING, font_smoothing_, NULL, 0);
- }
-
- BOOL Init(BOOL font_smoothing) {
- if (!SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &font_smoothing_, 0))
- return FALSE;
- return SystemParametersInfo(SPI_SETFONTSMOOTHING, font_smoothing, NULL, 0);
- }
-
- private:
- BOOL font_smoothing_;
-};
-
-// A class which renders an EMF data and returns a raw bitmap data.
-// The bitmap data returned from Create() is deleted in the destructor of this
-// class. So, we need to create a copy of this bitmap data if it is used after
-// this object is deleted,
-class EmfRenderer {
- public:
- EmfRenderer() : dc_(NULL), bitmap_(NULL) {
- }
-
- ~EmfRenderer() {
- if (bitmap_) {
- DeleteObject(bitmap_);
- bitmap_ = NULL;
- }
- if (dc_) {
- DeleteDC(dc_);
- dc_ = NULL;
- }
- }
-
- const void* Create(int width, int height, const printing::Emf* emf) {
- CHECK(!dc_ && !bitmap_);
-
- BITMAPV4HEADER header;
- gfx::CreateBitmapV4Header(width, height, &header);
-
- dc_ = CreateCompatibleDC(NULL);
- if (!dc_)
- return NULL;
-
- void* bits;
- bitmap_ = CreateDIBSection(dc_, reinterpret_cast<BITMAPINFO*>(&header), 0,
- &bits, NULL, 0);
- if (!bitmap_ || !bits)
- return NULL;
-
- SelectObject(dc_, bitmap_);
-
- skia::PlatformDevice::InitializeDC(dc_);
- emf->Playback(dc_, NULL);
-
- return reinterpret_cast<uint8*>(bits);
- }
-
- private:
- HDC dc_;
- HBITMAP bitmap_;
-};
-
-} // namespace
-
-MockPrinterDriverWin::MockPrinterDriverWin() {
-}
-
-MockPrinterDriverWin::~MockPrinterDriverWin() {
-}
-
-MockPrinterPage* MockPrinterDriverWin::LoadSource(const void* source_data,
- size_t source_size) {
- // This code is mostly copied from the Image::LoadEMF() function in
- // "src/chrome/browser/printing/printing_layout_uitest.cc".
- printing::Emf emf;
- emf.CreateFromData(source_data, source_size);
- gfx::Rect rect(emf.GetBounds());
-
- // Create a temporary DC and bitmap to retrieve the renderered data.
- if (rect.width() <= 0 || rect.height() <= 0)
- return NULL;
-
- // Disable the font-smoothing feature of Windows.
- SystemSettingsOverride system_settings;
- system_settings.Init(FALSE);
-
- // Render the EMF data and create a bitmap.
- EmfRenderer renderer;
- const void* bitmap_data = renderer.Create(rect.width(), rect.height(), &emf);
- if (!bitmap_data)
- return NULL;
-
- // Create a new MockPrinterPage instance and return it.
- size_t row_byte_width = rect.width() * 4;
- size_t bitmap_size = row_byte_width * rect.height();
- return new MockPrinterPage(rect.width(), rect.height(),
- source_data, source_size,
- bitmap_data, bitmap_size);
-}
diff --git a/chrome/renderer/mock_printer_driver_win.h b/chrome/renderer/mock_printer_driver_win.h
deleted file mode 100644
index 117aa16..0000000
--- a/chrome/renderer/mock_printer_driver_win.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2009 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.
-
-#ifndef CHROME_RENDERER_MOCK_PRINTER_DRIVER_WIN_H_
-#define CHROME_RENDERER_MOCK_PRINTER_DRIVER_WIN_H_
-
-#include "base/basictypes.h"
-
-class MockPrinterPage;
-
-// Implements the platform-dependent part of a pseudo printer object.
-// This class renders a platform-dependent input and creates a MockPrinterPage
-// instance.
-class MockPrinterDriverWin {
- public:
- MockPrinterDriverWin();
- ~MockPrinterDriverWin();
-
- MockPrinterPage* LoadSource(const void* data, size_t size);
-
- DISALLOW_COPY_AND_ASSIGN(MockPrinterDriverWin);
-};
-
-#endif // CHROME_RENDERER_MOCK_PRINTER_DRIVER_WIN_H_
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 96cf524a..9967ca9 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -451,8 +451,14 @@ void RenderView::SendThumbnail() {
void RenderView::OnPrintPages() {
DCHECK(webview());
- if (webview())
- Print(webview()->GetMainFrame(), false);
+ if (webview()) {
+ // If the user has selected text in the currently focused frame we print
+ // only that frame (this makes print selection work for multiple frames).
+ if (webview()->GetFocusedFrame()->HasSelection())
+ Print(webview()->GetFocusedFrame(), false);
+ else
+ Print(webview()->GetMainFrame(), false);
+ }
}
void RenderView::OnPrintingDone(int document_cookie, bool success) {
@@ -2309,7 +2315,11 @@ void RenderView::SetInputMethodState(bool enabled) {
}
void RenderView::ScriptedPrint(WebFrame* frame) {
- Print(frame, true);
+ DCHECK(webview());
+ if (webview()) {
+ // Print the full page - not just the frame the javascript is running from.
+ Print(webview()->GetMainFrame(), true);
+ }
}
void RenderView::UserMetricsRecordAction(const std::wstring& action) {
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index c8afcd2..4310d47 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -390,6 +390,7 @@ class RenderView : public RenderWidget,
FRIEND_TEST(RenderViewTest, ImeComposition);
FRIEND_TEST(RenderViewTest, OnSetTextDirection);
FRIEND_TEST(RenderViewTest, OnPrintPages);
+ FRIEND_TEST(RenderViewTest, PrintWithIframe);
FRIEND_TEST(RenderViewTest, PrintLayoutTest);
FRIEND_TEST(RenderViewTest, OnHandleKeyboardEvent);
FRIEND_TEST(RenderViewTest, InsertCharacters);
diff --git a/chrome/renderer/render_view_unittest.cc b/chrome/renderer/render_view_unittest.cc
index 4b4ed60..135c78d 100644
--- a/chrome/renderer/render_view_unittest.cc
+++ b/chrome/renderer/render_view_unittest.cc
@@ -3,10 +3,13 @@
// found in the LICENSE file.
#include "base/file_util.h"
+#include "base/shared_memory.h"
#include "chrome/common/native_web_keyboard_event.h"
#include "chrome/common/render_messages.h"
#include "chrome/test/render_view_test.h"
#include "net/base/net_errors.h"
+#include "printing/image.h"
+#include "printing/native_metafile.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/api/public/WebURLError.h"
@@ -363,6 +366,45 @@ TEST_F(RenderViewTest, PrintWithJavascript) {
#endif
}
+TEST_F(RenderViewTest, PrintWithIframe) {
+#if defined(OS_WIN)
+ // Document that populates an iframe..
+ const char html[] =
+ "<html><body>Lorem Ipsum:"
+ "<iframe name=\"sub1\" id=\"sub1\"></iframe><script>"
+ " document.write(frames['sub1'].name);"
+ " frames['sub1'].document.write("
+ " '<p>Cras tempus ante eu felis semper luctus!</p>');"
+ "</script></body></html>";
+
+ LoadHTML(html);
+
+ // Find the frame and set it as the focused one. This should mean that that
+ // the printout should only contain the contents of that frame.
+ WebFrame* sub1_frame = view_->webview()->GetFrameWithName(L"sub1");
+ ASSERT_TRUE(sub1_frame);
+ view_->webview()->SetFocusedFrame(sub1_frame);
+ ASSERT_NE(view_->webview()->GetFocusedFrame(),
+ view_->webview()->GetMainFrame());
+
+ // Initiate printing.
+ view_->OnPrintPages();
+
+ // Verify output through MockPrinter.
+ const MockPrinter* printer(render_thread_.printer());
+ ASSERT_EQ(1, printer->GetPrintedPages());
+ const printing::Image& image1(printer->GetPrintedPage(0)->image());
+
+ // TODO(sverrir): Figure out a way to improve this test to actually print
+ // only the content of the iframe. Currently image1 will contain the full
+ // page.
+ EXPECT_NE(0, image1.size().width());
+ EXPECT_NE(0, image1.size().height());
+#else
+ NOTIMPLEMENTED();
+#endif
+}
+
// Tests if we can print a page and verify its results.
// This test prints HTML pages into a pseudo printer and check their outputs,
// i.e. a simplified version of the PrintingLayoutTextTest UI test.
@@ -431,14 +473,6 @@ TEST_F(RenderViewTest, PrintLayoutTest) {
if (kTestPages[i].checksum)
EXPECT_EQ(kTestPages[i].checksum, bitmap_actual);
- // Retrieve the bitmap data from the pseudo printer.
- // TODO(hbono): implement a function which retrieves an expected result
- // from a file and compares it with this bitmap data.
- const void* bitmap_data;
- size_t bitmap_size;
- EXPECT_TRUE(render_thread_.printer()->GetBitmap(0, &bitmap_data,
- &bitmap_size));
-
if (baseline) {
// Save the source data and the bitmap data into temporary files to
// create base-line results.