Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1065)

Unified Diff: chrome/renderer/print_web_view_helper_browsertest.cc

Issue 6874038: Remove the last Chrome dependencies from renderer, and enforce no more includes through DEPS. I ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698