15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/run_loop.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/print_messages.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/renderer/printing/mock_printer.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/printing/print_web_view_helper.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_test.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ipc/ipc_listener.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_job_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRange.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/image.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame;
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing blink::WebLocalFrame;
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace printing {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple web page.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHelloWorldHTML[] = "<body><p>Hello World!</p></body>";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// A simple webpage with a button to print itself with.
388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const char kPrintOnUserAction[] =
398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "<body>"
408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "  <button id=\"print\" onclick=\"window.print();\">Hello World!</button>"
418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "</body>";
428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if !defined(OS_CHROMEOS)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// HTML with 3 pages.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultipageHTML[] =
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "<html><head><style>"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ".break { page-break-after: always; }"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "</style></head>"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "<body>"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "<div class='break'>page1</div>"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "<div class='break'>page2</div>"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "<div>page3</div>"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "</body></html>";
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple web page with print page size css.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHTMLWithPageSizeCss[] =
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<html><head><style>"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "@media print {"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  @page {"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "     size: 4in 4in;"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  }"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</style></head>"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<body>Lorem Ipsum:"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</body></html>";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple web page with print page layout css.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHTMLWithLandscapePageCss[] =
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<html><head><style>"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "@media print {"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  @page {"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "     size: landscape;"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  }"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</style></head>"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<body>Lorem Ipsum:"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</body></html>";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A longer web page.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLongPageHTML[] =
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<body><img src=\"\" width=10 height=10000 /></body>";
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A web page to simulate the print preview page.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrintPreviewHTML[] =
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<body><p id=\"pdf-viewer\">Hello World!</p></body>";
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void CreatePrintSettingsDictionary(base::DictionaryValue* dict) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kSettingLandscape, false);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kSettingCollate, false);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetInteger(kSettingColor, GRAY);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kSettingPrintToPDF, true);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetInteger(kSettingDuplexMode, SIMPLEX);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetInteger(kSettingCopies, 1);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetString(kSettingDeviceName, "dummy");
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetInteger(kPreviewUIID, 4);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetInteger(kPreviewRequestID, 12345);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kIsFirstRequest, true);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kSettingPreviewModifiable, false);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kSettingHeaderFooterEnabled, false);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kSettingGenerateDraftData, true);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kSettingShouldPrintBackgrounds, false);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean(kSettingShouldPrintSelectionOnly, false);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class DidPreviewPageListener : public IPC::Listener {
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  explicit DidPreviewPageListener(base::RunLoop* run_loop)
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      : run_loop_(run_loop) {}
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (message.type() == PrintHostMsg_MetafileReadyForPrinting::ID ||
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        message.type() == PrintHostMsg_PrintPreviewFailed::ID ||
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        message.type() == PrintHostMsg_PrintPreviewCancelled::ID)
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      run_loop_->Quit();
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return false;
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::RunLoop* const run_loop_;
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DidPreviewPageListener);
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintWebViewHelperTestBase : public ChromeRenderViewTest {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintWebViewHelperTestBase() {}
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PrintWebViewHelperTestBase() {}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrintWithJavaScript() {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExecuteJavaScript("window.print();");
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProcessPendingMessages();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The renderer should be done calculating the number of rendered pages
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // according to the specified settings defined in the mock render thread.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the page count is correct.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyPageCount(int count) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The DidGetPrintedPagesCount message isn't sent on ChromeOS. Right now we
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // always print all pages, and there are checks to that effect built into
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the print code.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message* page_cnt_msg =
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_thread_->sink().GetUniqueMessageMatching(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PrintHostMsg_DidGetPrintedPagesCount::ID);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(page_cnt_msg);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintHostMsg_DidGetPrintedPagesCount::Param post_page_count_param;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintHostMsg_DidGetPrintedPagesCount::Read(page_cnt_msg,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               &post_page_count_param);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(count, post_page_count_param.b);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The renderer should be done calculating the number of rendered pages
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // according to the specified settings defined in the mock render thread.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify the page count is correct.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyPreviewPageCount(int count) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const IPC::Message* page_cnt_msg =
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_thread_->sink().GetUniqueMessageMatching(
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PrintHostMsg_DidGetPreviewPageCount::ID);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(page_cnt_msg);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintHostMsg_DidGetPreviewPageCount::Param post_page_count_param;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintHostMsg_DidGetPreviewPageCount::Read(page_cnt_msg,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              &post_page_count_param);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(count, post_page_count_param.a.page_count);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verifies whether the pages printed or not.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyPagesPrinted(bool printed) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool did_print_msg = (render_thread_->sink().GetUniqueMessageMatching(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrintHostMsg_TempFileForPrintingWritten::ID) != NULL);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(printed, did_print_msg);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message* print_msg =
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_thread_->sink().GetUniqueMessageMatching(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PrintHostMsg_DidPrintPage::ID);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool did_print_msg = (NULL != print_msg);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(printed, did_print_msg);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (printed) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrintHostMsg_DidPrintPage::Param post_did_print_page_param;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrintHostMsg_DidPrintPage::Read(print_msg, &post_did_print_page_param);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(0, post_did_print_page_param.a.page_number);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnPrintPages() {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintWebViewHelper::Get(view_)->OnPrintPages();
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProcessPendingMessages();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnPrintPreview(const base::DictionaryValue& dict) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintWebViewHelper* print_web_view_helper = PrintWebViewHelper::Get(view_);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_web_view_helper->OnInitiatePrintPreview(false);
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::RunLoop run_loop;
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DidPreviewPageListener filter(&run_loop);
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    render_thread_->sink().AddFilter(&filter);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print_web_view_helper->OnPrintPreview(dict);
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    run_loop.Run();
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    render_thread_->sink().RemoveFilter(&filter);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnPrintForPrintPreview(const base::DictionaryValue& dict) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintWebViewHelper::Get(view_)->OnPrintForPrintPreview(dict);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProcessPendingMessages();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelperTestBase);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintWebViewHelperTest : public PrintWebViewHelperTestBase {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintWebViewHelperTest() {}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrintWebViewHelperTest() {}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewTest::SetUp();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelperTest);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that printing pages work and sending and receiving messages through
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that channel all works.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperTest, OnPrintPages) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHelloWorldHTML);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnPrintPages();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPageCount(1);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(true);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Duplicate of OnPrintPagesTest only using javascript to print.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperTest, PrintWithJavascript) {
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPageCount(1);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(true);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the renderer blocks window.print() calls if they occur too
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// frequently.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperTest, BlockScriptInitiatedPrinting) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend user will cancel printing.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->set_print_dialog_user_response(false);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to print with window.print() a few times.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend user will print. (but printing is blocked.)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->set_print_dialog_user_response(true);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unblock script initiated printing and verify printing works.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintWebViewHelper::Get(view_)->ResetScriptedPrintCount();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->ResetPrinter();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPageCount(1);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(true);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the renderer always allows window.print() calls if they are user
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initiated.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperTest, AllowUserOriginatedPrinting) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend user will cancel printing.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->set_print_dialog_user_response(false);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to print with window.print() a few times.
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend user will print. (but printing is blocked.)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->set_print_dialog_user_response(true);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try again as if user initiated, without resetting the print count.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->ResetPrinter();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kPrintOnUserAction);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size new_size(200, 100);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Resize(new_size, gfx::Rect(), false);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = GetElementBounds("print");
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bounds.IsEmpty());
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent mouse_event;
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.type = blink::WebInputEvent::MouseDown;
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.button = blink::WebMouseEvent::ButtonLeft;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = bounds.CenterPoint().x();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = bounds.CenterPoint().y();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendWebMouseEvent(mouse_event);
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.type = blink::WebInputEvent::MouseUp;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendWebMouseEvent(mouse_event);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessPendingMessages();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPageCount(1);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(true);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperTest, BlockScriptInitiatedPrintingFromPopup) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintWebViewHelper* print_web_view_helper = PrintWebViewHelper::Get(view_);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_web_view_helper->SetScriptedPrintBlocked(true);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_web_view_helper->SetScriptedPrintBlocked(false);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPageCount(1);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(true);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if (defined(OS_WIN) && !WIN_PDF_METAFILE_FOR_PRINTING) || defined(OS_MACOSX)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(estade): I don't think this test is worth porting to Linux. We will have
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to rip out and replace most of the IPC code if we ever plan to improve
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// printing, and the comment below by sverrir suggests that it doesn't do much
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for us anyway.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperTest, PrintWithIframe) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Document that populates an iframe.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char html[] =
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<html><body>Lorem Ipsum:"
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<iframe name=\"sub1\" id=\"sub1\"></iframe><script>"
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  document.write(frames['sub1'].name);"
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  frames['sub1'].document.write("
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      '<p>Cras tempus ante eu felis semper luctus!</p>');"
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</script></body></html>";
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(html);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the frame and set it as the focused one.  This should mean that that
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the printout should only contain the contents of that frame.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebFrame* sub1_frame =
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view_->GetWebView()->findFrameByName(WebString::fromUTF8("sub1"));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(sub1_frame);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->GetWebView()->setFocusedFrame(sub1_frame);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(view_->GetWebView()->focusedFrame(),
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            view_->GetWebView()->mainFrame());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiate printing.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnPrintPages();
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyPagesPrinted(true);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify output through MockPrinter.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MockPrinter* printer(chrome_render_thread_->printer());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, printer->GetPrintedPages());
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Image& image1(printer->GetPrintedPage(0)->image());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sverrir): Figure out a way to improve this test to actually print
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only the content of the iframe.  Currently image1 will contain the full
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, image1.size().width());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, image1.size().height());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests if we can print a page and verify its results.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test prints HTML pages into a pseudo printer and check their outputs,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// i.e. a simplified version of the PrintingLayoutTextTest UI test.
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test cases used in this test.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestPageData {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* page;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t printed_pages;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int height;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* checksum;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* file;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const TestPageData kTestPages[] = {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {"<html>"
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<head>"
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<meta"
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "  http-equiv=\"Content-Type\""
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "  content=\"text/html; charset=utf-8\"/>"
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<title>Test 1</title>"
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "</head>"
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<body style=\"background-color: white;\">"
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "<p style=\"font-family: arial;\">Hello World!</p>"
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "</body>",
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mac printing code compensates for the WebKit scale factor while generating
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the metafile, so we expect smaller pages.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  1, 600, 780,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  1, 675, 900,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NULL,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NULL,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(estade): need to port MockPrinter to get this on Linux. This involves
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// hooking up Cairo to read a pdf stream, or accessing the cairo surface in the
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// metafile directly.
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Same for printing via PDF on Windows.
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if (defined(OS_WIN) && !WIN_PDF_METAFILE_FOR_PRINTING) || defined(OS_MACOSX)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperTest, PrintLayoutTest) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool baseline = false;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_render_thread_->printer() != NULL);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kTestPages); ++i) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Load an HTML page and print it.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadHTML(kTestPages[i].page);
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnPrintPages();
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyPagesPrinted(true);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // MockRenderThread::Send() just calls MockRenderThread::OnReceived().
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // So, all IPC messages sent in the above RenderView::OnPrintPages() call
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // has been handled by the MockPrinter object, i.e. this printing job
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // has been already finished.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // So, we can start checking the output pages of this printing job.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Retrieve the number of pages actually printed.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t pages = chrome_render_thread_->printer()->GetPrintedPages();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestPages[i].printed_pages, pages);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Retrieve the width and height of the output page.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int width = chrome_render_thread_->printer()->GetWidth(0);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int height = chrome_render_thread_->printer()->GetHeight(0);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check with margin for error.  This has been failing with a one pixel
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // offset on our buildbot.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int kErrorMargin = 5;  // 5%
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GT(kTestPages[i].width * (100 + kErrorMargin) / 100, width);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(kTestPages[i].width * (100 - kErrorMargin) / 100, width);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GT(kTestPages[i].height * (100 + kErrorMargin) / 100, height);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(kTestPages[i].height* (100 - kErrorMargin) / 100, height);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Retrieve the checksum of the bitmap data from the pseudo printer and
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // compare it with the expected result.
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string bitmap_actual;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome_render_thread_->printer()->GetBitmapChecksum(0, &bitmap_actual));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (kTestPages[i].checksum)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(kTestPages[i].checksum, bitmap_actual);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (baseline) {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Save the source data and the bitmap data into temporary files to
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // create base-line results.
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath source_path;
451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::CreateTemporaryFile(&source_path);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_render_thread_->printer()->SaveSource(0, source_path);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath bitmap_path;
455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::CreateTemporaryFile(&bitmap_path);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_render_thread_->printer()->SaveBitmap(0, bitmap_path);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These print preview tests do not work on Chrome OS yet.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintWebViewHelperPreviewTest : public PrintWebViewHelperTestBase {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintWebViewHelperPreviewTest() {}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrintWebViewHelperPreviewTest() {}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Append the print preview switch before creating the PrintWebViewHelper.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kRendererPrintPreview);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewTest::SetUp();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyPrintPreviewCancelled(bool did_cancel) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool print_preview_cancelled =
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (render_thread_->sink().GetUniqueMessageMatching(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PrintHostMsg_PrintPreviewCancelled::ID) != NULL);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(did_cancel, print_preview_cancelled);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyPrintPreviewFailed(bool did_fail) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool print_preview_failed =
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (render_thread_->sink().GetUniqueMessageMatching(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PrintHostMsg_PrintPreviewFailed::ID) != NULL);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(did_fail, print_preview_failed);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyPrintPreviewGenerated(bool generated_preview) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message* preview_msg =
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_thread_->sink().GetUniqueMessageMatching(
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PrintHostMsg_MetafileReadyForPrinting::ID);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool did_get_preview_msg = (NULL != preview_msg);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(generated_preview, did_get_preview_msg);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (did_get_preview_msg) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrintHostMsg_MetafileReadyForPrinting::Param preview_param;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrintHostMsg_MetafileReadyForPrinting::Read(preview_msg, &preview_param);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(0, preview_param.a.document_cookie);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(0, preview_param.a.expected_pages_count);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(0U, preview_param.a.data_size);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyPrintFailed(bool did_fail) {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool print_failed = (render_thread_->sink().GetUniqueMessageMatching(
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrintHostMsg_PrintingFailed::ID) != NULL);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(did_fail, print_failed);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyPrintPreviewInvalidPrinterSettings(bool settings_invalid) {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool print_preview_invalid_printer_settings =
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (render_thread_->sink().GetUniqueMessageMatching(
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PrintHostMsg_PrintPreviewInvalidPrinterSettings::ID) != NULL);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(settings_invalid, print_preview_invalid_printer_settings);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_number| is 0-based.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyDidPreviewPage(bool generate_draft_pages, int page_number) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool msg_found = false;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t msg_count = render_thread_->sink().message_count();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < msg_count; ++i) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (msg->type() == PrintHostMsg_DidPreviewPage::ID) {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrintHostMsg_DidPreviewPage::Param page_param;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrintHostMsg_DidPreviewPage::Read(msg, &page_param);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (page_param.a.page_number == page_number) {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          msg_found = true;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (generate_draft_pages)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EXPECT_NE(0U, page_param.a.data_size);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EXPECT_EQ(0U, page_param.a.data_size);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(generate_draft_pages, msg_found);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyDefaultPageLayout(int content_width, int content_height,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int margin_top, int margin_bottom,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int margin_left, int margin_right,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool page_has_print_css) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message* default_page_layout_msg =
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_thread_->sink().GetUniqueMessageMatching(
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PrintHostMsg_DidGetDefaultPageLayout::ID);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool did_get_default_page_layout_msg = (NULL != default_page_layout_msg);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (did_get_default_page_layout_msg) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrintHostMsg_DidGetDefaultPageLayout::Param param;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrintHostMsg_DidGetDefaultPageLayout::Read(default_page_layout_msg,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &param);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(content_width, param.a.content_width);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(content_height, param.a.content_height);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(margin_top, param.a.margin_top);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(margin_right, param.a.margin_right);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(margin_left, param.a.margin_left);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(margin_bottom, param.a.margin_bottom);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(page_has_print_css, param.c);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelperPreviewTest);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that print preview work and sending and receiving messages through
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that channel all works.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, OnPrintPreview) {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHelloWorldHTML);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
5737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyDefaultPageLayout(540, 720, 36, 36, 36, 36, false);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(true);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, PrintPreviewHTMLWithPageMarginsCss) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A simple web page with print margins css.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kHTMLWithPageMarginsCss[] =
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<html><head><style>"
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "@media print {"
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  @page {"
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "     margin: 3in 1in 2in 0.3in;"
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}"
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</style></head>"
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<body>Lorem Ipsum:"
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</body></html>";
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHTMLWithPageMarginsCss);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
6007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingPrintToPDF, false);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyDefaultPageLayout(519, 432, 216, 144, 21, 72, false);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(true);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to verify that print preview ignores print media css when non-default
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// margin is selected.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, NonDefaultMarginsSelectedIgnorePrintCss) {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHTMLWithPageSizeCss);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingPrintToPDF, false);
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger(kSettingMarginsType, NO_MARGINS);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyDefaultPageLayout(612, 792, 0, 0, 0, 0, true);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(true);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to verify that print preview honor print media size css when
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PRINT_TO_PDF is selected and doesn't fit to printer default paper size.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, PrintToPDFSelectedHonorPrintCss) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHTMLWithPageSizeCss);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
6407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingPrintToPDF, true);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger(kSettingMarginsType,
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  PRINTABLE_AREA_MARGINS);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since PRINT_TO_PDF is selected, pdf page size is equal to print media page
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // size.
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyDefaultPageLayout(252, 252, 18, 18, 18, 18, true);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to verify that print preview honor print margin css when PRINT_TO_PDF
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is selected and doesn't fit to printer default paper size.
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, PrintToPDFSelectedHonorPageMarginsCss) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A simple web page with print margins css.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kHTMLWithPageCss[] =
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<html><head><style>"
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "@media print {"
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  @page {"
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "     margin: 3in 1in 2in 0.3in;"
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "     size: 14in 14in;"
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}"
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</style></head>"
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<body>Lorem Ipsum:"
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</body></html>";
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHTMLWithPageCss);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
6737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingPrintToPDF, true);
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since PRINT_TO_PDF is selected, pdf page size is equal to print media page
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // size.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyDefaultPageLayout(915, 648, 216, 144, 21, 72, true);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to verify that print preview workflow center the html page contents to
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fit the page size.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, PrintPreviewCenterToFitPage) {
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHTMLWithPageSizeCss);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingPrintToPDF, false);
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VerifyDefaultPageLayout(216, 216, 288, 288, 198, 198, true);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(true);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to verify that print preview workflow scale the html page contents to
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fit the page size.
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, PrintPreviewShrinkToFitPage) {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A simple web page with print margins css.
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kHTMLWithPageCss[] =
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<html><head><style>"
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "@media print {"
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  @page {"
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "     size: 15in 17in;"
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}"
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</style></head>"
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<body>Lorem Ipsum:"
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</body></html>";
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHTMLWithPageCss);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
7237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingPrintToPDF, false);
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
7304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VerifyDefaultPageLayout(571, 652, 69, 71, 20, 21, true);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to verify that print preview workflow honor the orientation settings
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specified in css.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, PrintPreviewHonorsOrientationCss) {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHTMLWithLandscapePageCss);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
7417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingPrintToPDF, false);
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger(kSettingMarginsType, NO_MARGINS);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyDefaultPageLayout(792, 612, 0, 0, 0, 0, true);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to verify that print preview workflow honors the orientation settings
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specified in css when PRINT_TO_PDF is selected.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, PrintToPDFSelectedHonorOrientationCss) {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHTMLWithLandscapePageCss);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
7597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingPrintToPDF, true);
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger(kSettingMarginsType, CUSTOM_MARGINS);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyDefaultPageLayout(748, 568, 21, 23, 21, 23, true);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to verify that complete metafile is generated for a subset of pages
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// without creating draft pages.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, OnPrintPreviewForSelectedPages) {
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadHTML(kMultipageHTML);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
7777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a page range and update the dictionary to generate only the complete
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // metafile with the selected pages. Page numbers used in the dictionary
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are 1-based.
7837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* page_range = new base::DictionaryValue();
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  page_range->SetInteger(kSettingPageRangeFrom, 2);
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  page_range->SetInteger(kSettingPageRangeTo, 3);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::ListValue* page_range_array = new base::ListValue();
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_range_array->Append(page_range);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.Set(kSettingPageRange, page_range_array);
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingGenerateDraftData, false);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyDidPreviewPage(false, 0);
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyDidPreviewPage(false, 1);
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyDidPreviewPage(false, 2);
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyPreviewPageCount(3);
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyPrintPreviewCancelled(false);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyPrintPreviewFailed(false);
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyPrintPreviewGenerated(true);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyPagesPrinted(false);
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test to verify that preview generated only for one page.
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, OnPrintPreviewForSelectedText) {
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadHTML(kMultipageHTML);
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetMainFrame()->selectRange(
809f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebRange::fromDocumentRange(GetMainFrame(), 1, 3));
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fill in some dummy values.
8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean(kSettingShouldPrintSelectionOnly, true);
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnPrintPreview(dict);
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyPreviewPageCount(1);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(true);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that print preview fails and receiving error messages through
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that channel all works.
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, OnPrintPreviewFail) {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kHelloWorldHTML);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An empty dictionary should fail.
8317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue empty_dict;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(empty_dict);
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(false);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(true);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(false);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that cancelling print preview works.
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, OnPrintPreviewCancel) {
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kLongPageHTML);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kCancelPage = 3;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->set_print_preview_cancel_page_number(kCancelPage);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
8487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kCancelPage,
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            chrome_render_thread_->print_preview_pages_remaining());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewCancelled(true);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(false);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that printing from print preview works and sending and receiving
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// messages through that channel all works.
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, OnPrintForPrintPreview) {
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kPrintPreviewHTML);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintForPrintPreview(dict);
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintFailed(false);
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(true);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that printing from print preview fails and receiving error messages
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// through that channel all works.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest, OnPrintForPrintPreviewFail) {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kPrintPreviewHTML);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An empty dictionary should fail.
8807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue empty_dict;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintForPrintPreview(empty_dict);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that when default printer has invalid printer settings, print preview
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// receives error message.
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest,
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       OnPrintPreviewUsingInvalidPrinterSettings) {
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kPrintPreviewHTML);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set mock printer to provide invalid settings.
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->UseInvalidSettings();
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
8967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have received invalid printer settings from |printer_|.
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewInvalidPrinterSettings(true);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It should receive the invalid printer settings message only.
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(false);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that when the selected printer has invalid page settings, print preview
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// receives error message.
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest,
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       OnPrintPreviewUsingInvalidPageSize) {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kPrintPreviewHTML);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->UseInvalidPageSize();
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewInvalidPrinterSettings(true);
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It should receive the invalid printer settings message only.
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(false);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that when the selected printer has invalid content settings, print
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preview receives error message.
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest,
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       OnPrintPreviewUsingInvalidContentSize) {
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kPrintPreviewHTML);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->UseInvalidContentSize();
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintPreview(dict);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewInvalidPrinterSettings(true);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, chrome_render_thread_->print_preview_pages_remaining());
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It should receive the invalid printer settings message only.
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewFailed(false);
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintPreviewGenerated(false);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperPreviewTest,
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       OnPrintForPrintPreviewUsingInvalidPrinterSettings) {
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kPrintPreviewHTML);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set mock printer to provide invalid settings.
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->UseInvalidSettings();
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fill in some dummy values.
9577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue dict;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreatePrintSettingsDictionary(&dict);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnPrintForPrintPreview(dict);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPrintFailed(true);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintWebViewHelperKioskTest : public PrintWebViewHelperTestBase {
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintWebViewHelperKioskTest() {}
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrintWebViewHelperKioskTest() {}
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Append the throttling disable switch before creating the
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // PrintWebViewHelper.
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kDisableScriptedPrintThrottling);
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewTest::SetUp();
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelperKioskTest);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the switch overrides the throttling that blocks window.print()
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calls if they occur too frequently. Compare with
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrintWebViewHelperTest.BlockScriptInitiatedPrinting above.
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PrintWebViewHelperKioskTest, DontBlockScriptInitiatedPrinting) {
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend user will cancel printing.
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->set_print_dialog_user_response(false);
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to print with window.print() a few times.
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->ResetPrinter();
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->ResetPrinter();
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->printer()->ResetPrinter();
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(false);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend user will print, should not be throttled.
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_render_thread_->set_print_dialog_user_response(true);
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintWithJavaScript();
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPagesPrinted(true);
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace printing
1007