Index: chrome/renderer/print_web_view_helper_browsertest.cc |
=================================================================== |
--- chrome/renderer/print_web_view_helper_browsertest.cc (revision 0) |
+++ chrome/renderer/print_web_view_helper_browsertest.cc (revision 0) |
@@ -0,0 +1,203 @@ |
+// 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. |
+ |
+#include "base/file_util.h" |
+#include "chrome/renderer/print_web_view_helper.h" |
+#include "chrome/test/render_view_test.h" |
+#include "printing/image.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
+ |
+using WebKit::WebFrame; |
+using WebKit::WebString; |
+using WebKit::WebView; |
+ |
+namespace { |
+ |
+const char kPrintWithJSHTML[] = |
+ "<body>Hello<script>window.print()</script>World</body>"; |
+ |
+} // namespace |
+ |
+// Tests that printing pages work and sending and receiving messages through |
+// that channel all works. |
+TEST_F(RenderViewTest, OnPrintPages) { |
+ // Lets simulate a print pages with Hello world. |
+ LoadHTML("<body><p>Hello World!</p></body>"); |
+ PrintWebViewHelper::Get(view_)->OnPrintPages(); |
+ |
+ VerifyPageCount(1); |
+ VerifyPagesPrinted(true); |
+} |
+ |
+// Duplicate of OnPrintPagesTest only using javascript to print. |
+TEST_F(RenderViewTest, PrintWithJavascript) { |
+ // HTML contains a call to window.print() |
+ LoadHTML(kPrintWithJSHTML); |
+ |
+ VerifyPageCount(1); |
+ VerifyPagesPrinted(true); |
+} |
+ |
+// Tests that the renderer blocks window.print() calls if they occur too |
+// frequently. |
+TEST_F(RenderViewTest, BlockScriptInitiatedPrinting) { |
+ // Pretend user will cancel printing. |
+ render_thread_.set_print_dialog_user_response(false); |
+ // Try to print with window.print() a few times. |
+ LoadHTML(kPrintWithJSHTML); |
+ LoadHTML(kPrintWithJSHTML); |
+ LoadHTML(kPrintWithJSHTML); |
+ VerifyPagesPrinted(false); |
+ |
+ // Pretend user will print. (but printing is blocked.) |
+ render_thread_.set_print_dialog_user_response(true); |
+ LoadHTML(kPrintWithJSHTML); |
+ VerifyPagesPrinted(false); |
+ |
+ // Unblock script initiated printing and verify printing works. |
+ PrintWebViewHelper::Get(view_)->ResetScriptedPrintCount(); |
+ render_thread_.printer()->ResetPrinter(); |
+ LoadHTML(kPrintWithJSHTML); |
+ VerifyPageCount(1); |
+ VerifyPagesPrinted(true); |
+} |
+ |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+// TODO(estade): I don't think this test is worth porting to Linux. We will have |
+// to rip out and replace most of the IPC code if we ever plan to improve |
+// printing, and the comment below by sverrir suggests that it doesn't do much |
+// for us anyway. |
+TEST_F(RenderViewTest, PrintWithIframe) { |
+ // 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()->findFrameByName(WebString::fromUTF8("sub1")); |
+ ASSERT_TRUE(sub1_frame); |
+ view_->webview()->setFocusedFrame(sub1_frame); |
+ ASSERT_NE(view_->webview()->focusedFrame(), |
+ view_->webview()->mainFrame()); |
+ |
+ // Initiate printing. |
+ PrintWebViewHelper::Get(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()); |
+} |
+#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. |
+namespace { |
+// Test cases used in this test. |
+struct TestPageData { |
+ const char* page; |
+ size_t printed_pages; |
+ int width; |
+ int height; |
+ const char* checksum; |
+ const wchar_t* file; |
+}; |
+ |
+const TestPageData kTestPages[] = { |
+ {"<html>" |
+ "<head>" |
+ "<meta" |
+ " http-equiv=\"Content-Type\"" |
+ " content=\"text/html; charset=utf-8\"/>" |
+ "<title>Test 1</title>" |
+ "</head>" |
+ "<body style=\"background-color: white;\">" |
+ "<p style=\"font-family: arial;\">Hello World!</p>" |
+ "</body>", |
+#if defined(OS_MACOSX) |
+ // Mac printing code compensates for the WebKit scale factor while generating |
+ // the metafile, so we expect smaller pages. |
+ 1, 540, 720, |
+#else |
+ 1, 675, 900, |
+#endif |
+ NULL, |
+ NULL, |
+ }, |
+}; |
+} // namespace |
+ |
+// TODO(estade): need to port MockPrinter to get this on Linux. This involves |
+// hooking up Cairo to read a pdf stream, or accessing the cairo surface in the |
+// metafile directly. |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+TEST_F(RenderViewTest, PrintLayoutTest) { |
+ bool baseline = false; |
+ |
+ EXPECT_TRUE(render_thread_.printer() != NULL); |
+ for (size_t i = 0; i < arraysize(kTestPages); ++i) { |
+ // Load an HTML page and print it. |
+ LoadHTML(kTestPages[i].page); |
+ PrintWebViewHelper::Get(view_)->OnPrintPages(); |
+ |
+ // MockRenderThread::Send() just calls MockRenderThread::OnMsgReceived(). |
+ // So, all IPC messages sent in the above RenderView::OnPrintPages() call |
+ // has been handled by the MockPrinter object, i.e. this printing job |
+ // has been already finished. |
+ // So, we can start checking the output pages of this printing job. |
+ // Retrieve the number of pages actually printed. |
+ size_t pages = render_thread_.printer()->GetPrintedPages(); |
+ EXPECT_EQ(kTestPages[i].printed_pages, pages); |
+ |
+ // Retrieve the width and height of the output page. |
+ int width = render_thread_.printer()->GetWidth(0); |
+ int height = render_thread_.printer()->GetHeight(0); |
+ |
+ // Check with margin for error. This has been failing with a one pixel |
+ // offset on our buildbot. |
+ const int kErrorMargin = 5; // 5% |
+ EXPECT_GT(kTestPages[i].width * (100 + kErrorMargin) / 100, width); |
+ EXPECT_LT(kTestPages[i].width * (100 - kErrorMargin) / 100, width); |
+ EXPECT_GT(kTestPages[i].height * (100 + kErrorMargin) / 100, height); |
+ EXPECT_LT(kTestPages[i].height* (100 - kErrorMargin) / 100, height); |
+ |
+ // Retrieve the checksum of the bitmap data from the pseudo printer and |
+ // compare it with the expected result. |
+ std::string bitmap_actual; |
+ EXPECT_TRUE(render_thread_.printer()->GetBitmapChecksum(0, &bitmap_actual)); |
+ if (kTestPages[i].checksum) |
+ EXPECT_EQ(kTestPages[i].checksum, bitmap_actual); |
+ |
+ if (baseline) { |
+ // Save the source data and the bitmap data into temporary files to |
+ // create base-line results. |
+ FilePath source_path; |
+ file_util::CreateTemporaryFile(&source_path); |
+ render_thread_.printer()->SaveSource(0, source_path); |
+ |
+ FilePath bitmap_path; |
+ file_util::CreateTemporaryFile(&bitmap_path); |
+ render_thread_.printer()->SaveBitmap(0, bitmap_path); |
+ } |
+ } |
+} |
+#endif |
Property changes on: chrome\renderer\print_web_view_helper_browsertest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |