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"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
1158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_file_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/simple_thread.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_view_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/image.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printing_test.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using printing::Image;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGenerateSwitch[] = "print-layout-generate";
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintingLayoutTest : public PrintingTest<InProcessBrowserTest>,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public content::NotificationObserver {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintingLayoutTest() {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath browser_directory;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_APP, &browser_directory);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    emf_path_ = browser_directory.AppendASCII("metafile_dumps");
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure there is no left overs.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CleanupDumpDirectory();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUp();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::TearDown();
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::DeleteFile(emf_path_, true);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchPath(switches::kDebugPrint, emf_path_);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintNowTab() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_EVENT,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* web_contents =
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printing::PrintViewManager::FromWebContents(web_contents)->PrintNow();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.RemoveAll();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(chrome::NOTIFICATION_PRINT_JOB_EVENT, type);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (content::Details<printing::JobEventDetails>(details)->type()) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::JOB_DONE: {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Succeeded.
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::MessageLoop::current()->PostTask(
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            FROM_HERE, base::MessageLoop::QuitClosure());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::USER_INIT_CANCELED:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::FAILED: {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Failed.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASSERT_TRUE(false);
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::MessageLoop::current()->PostTask(
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            FROM_HERE, base::MessageLoop::QuitClosure());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::NEW_DOC:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::USER_INIT_DONE:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::DEFAULT_INIT_DONE:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::NEW_PAGE:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::PAGE_DONE:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::DOC_DONE:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case printing::JobEventDetails::ALL_PAGES_REQUESTED: {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Don't care.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finds the dump for the last print job and compares it to the data named
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |verification_name|. Compares the saved printed job pixels with the test
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data pixels and returns the percentage of different pixels; 0 for success,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // [0, 100] for failure.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double CompareWithResult(const std::wstring& verification_name) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath test_result(ScanFiles(verification_name));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (test_result.value().empty()) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // 100% different, the print job buffer is not there.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 100.;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath base_path(ui_test_utils::GetTestFilePath(
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath().AppendASCII("printing"), base::FilePath()));
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath emf(base_path.Append(verification_name + L".emf"));
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath png(base_path.Append(verification_name + L".png"));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath cleartype(
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base_path.Append(verification_name + L"_cleartype.png"));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Looks for Cleartype override.
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (base::PathExists(cleartype) && IsClearTypeEnabled())
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png = cleartype;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GenerateFiles()) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Copy the .emf and generate an .png.
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::CopyFile(test_result, emf);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Image emf_content(emf);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      emf_content.SaveToPng(png);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Saving is always fine.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // File compare between test and result.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Image emf_content(emf);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Image test_content(test_result);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Image png_content(png);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double diff_emf = emf_content.PercentageDifferent(test_content);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(0., diff_emf) << base::WideToUTF8(verification_name) <<
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          " original size:" << emf_content.size().ToString() <<
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          " result size:" << test_content.size().ToString();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (diff_emf) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Backup the result emf file.
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath failed(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base_path.Append(verification_name + L"_failed.emf"));
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::CopyFile(test_result, failed);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This verification is only to know that the EMF rendering stays
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // immutable.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double diff_png = emf_content.PercentageDifferent(png_content);
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(0., diff_png) << base::WideToUTF8(verification_name) <<
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          " original size:" << emf_content.size().ToString() <<
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          " result size:" << test_content.size().ToString();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (diff_png) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Backup the rendered emf file to detect the rendering difference.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath rendering(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_path.Append(verification_name + L"_rendering.png"));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        emf_content.SaveToPng(rendering);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return std::max(diff_png, diff_emf);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes sure the directory exists and is empty.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CleanupDumpDirectory() {
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(base::DieFileDie(emf_path_, true));
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateDirectory(emf_path_));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns if Clear Type is currently enabled.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsClearTypeEnabled() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL ct_enabled = 0;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SystemParametersInfo(SPI_GETCLEARTYPE, 0, &ct_enabled, 0) && ct_enabled)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UINT smoothing = 0;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &smoothing, 0) &&
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        smoothing == FE_FONTSMOOTHINGCLEARTYPE)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verifies that there is one .emf and one .prn file in the dump directory.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the path of the .emf file and deletes the .prn file.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring ScanFiles(const std::wstring& verification_name) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Try to 10 seconds.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring emf_file;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring prn_file;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool found_emf = false;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool found_prn = false;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < 100; ++i) {
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FileEnumerator enumerator(emf_path_, false,
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      base::FileEnumerator::FILES);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      emf_file.clear();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prn_file.clear();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_emf = false;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_prn = false;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath file;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (!(file = enumerator.Next()).empty()) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::wstring ext = file.Extension();
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (base::strcasecmp(base::WideToUTF8(ext).c_str(), ".emf") == 0) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_FALSE(found_emf) << "Found a leftover .EMF file: \"" <<
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              emf_file << "\" and \"" << file.value() <<
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "\" when looking for \"" << verification_name << "\"";
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          found_emf = true;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          emf_file = file.value();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          continue;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (base::strcasecmp(base::WideToUTF8(ext).c_str(), ".prn") == 0) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_FALSE(found_prn) << "Found a leftover .PRN file: \"" <<
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prn_file << "\" and \"" << file.value() <<
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "\" when looking for \"" << verification_name << "\"";
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prn_file = file.value();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          found_prn = true;
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          base::DeleteFile(file, false);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          continue;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_TRUE(false);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (found_emf && found_prn)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(found_emf) << ".PRN file is: " << prn_file;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(found_prn) << ".EMF file is: " << emf_file;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return emf_file;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GenerateFiles() {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CommandLine::ForCurrentProcess()->HasSwitch(kGenerateSwitch);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath emf_path_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrintingLayoutTest);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintingLayoutTextTest : public PrintingLayoutTest {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef PrintingLayoutTest Parent;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns if the test is disabled.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/64869 Until the issue is fixed, disable the test if
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ClearType is enabled.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsTestCaseDisabled() {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Parent::IsTestCaseDisabled() || IsClearTypeEnabled();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Finds the first dialog window owned by owner_process.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HWND FindDialogWindow(DWORD owner_process) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND dialog_window(NULL);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (;;) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dialog_window = FindWindowEx(NULL,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 dialog_window,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 MAKEINTATOM(32770),
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 NULL);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!dialog_window)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The dialog must be owned by our target process.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD process_id = 0;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetWindowThreadProcessId(dialog_window, &process_id);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (process_id == owner_process)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dialog_window;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tries to close a dialog window.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CloseDialogWindow(HWND dialog_window) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT res = SendMessage(dialog_window, DM_GETDEFID, 0, 0);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!res)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DC_HASDEFID, HIWORD(res));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WORD print_button_id = LOWORD(res);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  res = SendMessage(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dialog_window,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WM_COMMAND,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print_button_id,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<LPARAM>(GetDlgItem(dialog_window, print_button_id)));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res == 0;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dismiss the first dialog box owned by owner_process by "executing" the
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default button.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DismissTheWindow : public base::DelegateSimpleThread::Delegate {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DismissTheWindow()
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : owner_process_(base::Process::Current().pid()) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Run() {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HWND dialog_window;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (;;) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // First enumerate the windows.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dialog_window = FindDialogWindow(owner_process_);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Try to close it.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (dialog_window) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (CloseDialogWindow(dialog_window)) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now verify that it indeed closed itself.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IsWindow(dialog_window)) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CloseDialogWindow(dialog_window);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD owner_process() { return owner_process_; }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD owner_process_;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails, see http://crbug.com/7721.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrintingLayoutTextTest, DISABLED_Complex) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsTestCaseDisabled())
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DismissTheWindow dismisser;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DelegateSimpleThread close_printdlg_thread(&dismisser,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   "close_printdlg_thread");
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print a document, check its output.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), test_server()->GetURL("files/printing/test1.html"));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close_printdlg_thread.Start();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNowTab();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close_printdlg_thread.Join();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0., CompareWithResult(L"test1"));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestPool {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* source;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* result;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const TestPool kTestPool[] = {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ImagesB&W
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "files/printing/test2.html", L"test2",
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ImagesTransparent
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "files/printing/test3.html", L"test3",
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ImageColor
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "files/printing/test4.html", L"test4",
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/7721
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrintingLayoutTest, DISABLED_ManyTimes) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsTestCaseDisabled())
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DismissTheWindow dismisser;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(arraysize(kTestPool), 0u);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(kTestPool); ++i) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CleanupDumpDirectory();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestPool& test = kTestPool[i % arraysize(kTestPool)];
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), test_server()->GetURL(test.source));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DelegateSimpleThread close_printdlg_thread1(&dismisser,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      "close_printdlg_thread");
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process()));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread1.Start();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintNowTab();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread1.Join();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0., CompareWithResult(test.result)) << test.result;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CleanupDumpDirectory();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DelegateSimpleThread close_printdlg_thread2(&dismisser,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      "close_printdlg_thread");
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process()));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread2.Start();
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintNowTab();
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread2.Join();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0., CompareWithResult(test.result)) << test.result;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CleanupDumpDirectory();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DelegateSimpleThread close_printdlg_thread3(&dismisser,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      "close_printdlg_thread");
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process()));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread3.Start();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintNowTab();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread3.Join();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0., CompareWithResult(test.result)) << test.result;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CleanupDumpDirectory();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DelegateSimpleThread close_printdlg_thread4(&dismisser,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      "close_printdlg_thread");
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process()));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread4.Start();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintNowTab();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread4.Join();
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0., CompareWithResult(test.result)) << test.result;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prints a popup and immediately closes it. Disabled because it crashes.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrintingLayoutTest, DISABLED_Delayed) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsTestCaseDisabled())
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_timeout = true;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = test_server()->GetURL("files/printing/popup_delayed_print.htm");
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DismissTheWindow dismisser;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DelegateSimpleThread close_printdlg_thread(&dismisser,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     "close_printdlg_thread");
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread.Start();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread.Join();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Force a navigation elsewhere to verify that it's fine with it.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url = test_server()->GetURL("files/printing/test1.html");
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(browser());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0., CompareWithResult(L"popup_delayed_print"))
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << L"popup_delayed_print";
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prints a popup and immediately closes it. http://crbug.com/7721
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrintingLayoutTest, DISABLED_IFrame) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsTestCaseDisabled())
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = test_server()->GetURL("files/printing/iframe.htm");
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DismissTheWindow dismisser;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DelegateSimpleThread close_printdlg_thread(&dismisser,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     "close_printdlg_thread");
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread.Start();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_printdlg_thread.Join();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Force a navigation elsewhere to verify that it's fine with it.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url = test_server()->GetURL("files/printing/test1.html");
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(browser());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0., CompareWithResult(L"iframe")) << L"iframe";
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
470