172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/file_path.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/string_util.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/test/test_file_util.h"
103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/simple_thread.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/utf_string_conversions.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/tab_proxy.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui/ui_test.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "printing/image.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "printing/printing_test.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing printing::Image;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kGenerateSwitch[] = "print-layout-generate";
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst FilePath::CharType kDocRoot[] = FILE_PATH_LITERAL("chrome/test/data");
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrintingLayoutTest : public PrintingTest<UITest> {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrintingLayoutTest() {
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    emf_path_ = browser_directory_.AppendASCII("metafile_dumps");
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    launch_arguments_.AppendSwitchPath("debug-print", emf_path_);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    show_window_ = true;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Make sure there is no left overs.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CleanupDumpDirectory();
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UITest::SetUp();
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UITest::TearDown();
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    file_util::Delete(emf_path_, true);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PrintNowTab() {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<TabProxy> tab_proxy(GetActiveTab());
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(tab_proxy.get());
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(tab_proxy->PrintNow());
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Finds the dump for the last print job and compares it to the data named
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |verification_name|. Compares the saved printed job pixels with the test
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // data pixels and returns the percentage of different pixels; 0 for success,
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // [0, 100] for failure.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  double CompareWithResult(const std::wstring& verification_name) {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath test_result(ScanFiles(verification_name));
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (test_result.value().empty()) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // 100% different, the print job buffer is not there.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return 100.;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::wstring verification_file(test_data_directory_.value());
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    file_util::AppendToPath(&verification_file, L"printing");
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    file_util::AppendToPath(&verification_file, verification_name);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath emf(verification_file + L".emf");
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath png(verification_file + L".png");
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Looks for Cleartype override.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (file_util::PathExists(
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FilePath::FromWStringHack(verification_file + L"_cleartype.png")) &&
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        IsClearTypeEnabled()) {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      png = FilePath(verification_file + L"_cleartype.png");
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (GenerateFiles()) {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Copy the .emf and generate an .png.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      file_util::CopyFile(test_result, emf);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Image emf_content(emf);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      emf_content.SaveToPng(png);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Saving is always fine.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return 0;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // File compare between test and result.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Image emf_content(emf);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Image test_content(test_result);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Image png_content(png);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      double diff_emf = emf_content.PercentageDifferent(test_content);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_EQ(0., diff_emf) << verification_name <<
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          L" original size:" << emf_content.size() <<
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          L" result size:" << test_content.size();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (diff_emf) {
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        // Backup the result emf file.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        file_util::CopyFile(test_result, FilePath(
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              verification_file + L"_failed.emf"));
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // This verification is only to know that the EMF rendering stays
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // immutable.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      double diff_png = emf_content.PercentageDifferent(png_content);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_EQ(0., diff_png) << verification_name <<
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          L" original size:" << emf_content.size() <<
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          L" result size:" << test_content.size();
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (diff_png) {
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        // Backup the rendered emf file to detect the rendering difference.
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        emf_content.SaveToPng(FilePath(verification_file + L"_rendering.png"));
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return std::max(diff_png, diff_emf);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Makes sure the directory exists and is empty.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CleanupDumpDirectory() {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(file_util::DieFileDie(emf_path(), true));
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(file_util::CreateDirectory(emf_path()));
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns if Clear Type is currently enabled.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool IsClearTypeEnabled() {
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    BOOL ct_enabled = 0;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (SystemParametersInfo(SPI_GETCLEARTYPE, 0, &ct_enabled, 0) && ct_enabled)
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UINT smoothing = 0;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &smoothing, 0) &&
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        smoothing == FE_FONTSMOOTHINGCLEARTYPE)
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verifies that there is one .emf and one .prn file in the dump directory.
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the path of the .emf file and deletes the .prn file.
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring ScanFiles(const std::wstring& verification_name) {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Try to 10 seconds.
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::wstring emf_file;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::wstring prn_file;
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool found_emf = false;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool found_prn = false;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0; i < 100; ++i) {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      file_util::FileEnumerator enumerator(emf_path(), false,
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          file_util::FileEnumerator::FILES);
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      emf_file.clear();
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      prn_file.clear();
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      found_emf = false;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      found_prn = false;
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      FilePath file;
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      while (!(file = enumerator.Next()).empty()) {
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        std::wstring ext = file.Extension();
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (base::strcasecmp(WideToUTF8(ext).c_str(), ".emf") == 0) {
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          EXPECT_FALSE(found_emf) << "Found a leftover .EMF file: \"" <<
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              emf_file << "\" and \"" << file.value() <<
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              "\" when looking for \"" << verification_name << "\"";
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          found_emf = true;
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          emf_file = file.value();
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          continue;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (base::strcasecmp(WideToUTF8(ext).c_str(), ".prn") == 0) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          EXPECT_FALSE(found_prn) << "Found a leftover .PRN file: \"" <<
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              prn_file << "\" and \"" << file.value() <<
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              "\" when looking for \"" << verification_name << "\"";
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          prn_file = file.value();
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          found_prn = true;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          file_util::Delete(file, false);
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          continue;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        EXPECT_TRUE(false);
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (found_emf && found_prn)
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
1703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      base::PlatformThread::Sleep(100);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(found_emf) << ".PRN file is: " << prn_file;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(found_prn) << ".EMF file is: " << emf_file;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return emf_file;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool GenerateFiles() {
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return CommandLine::ForCurrentProcess()->HasSwitch(kGenerateSwitch);
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath& emf_path() const { return emf_path_; }
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath emf_path_;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(PrintingLayoutTest);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that don't need UI access.
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrintingLayoutTestHidden : public PrintingLayoutTest {
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrintingLayoutTestHidden() {
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    show_window_ = false;
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrintingLayoutTextTest : public PrintingLayoutTest {
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef PrintingLayoutTest Parent;
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns if the test is disabled.
20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // http://crbug.com/64869 Until the issue is fixed, disable the test if
20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // ClearType is enabled.
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool IsTestCaseDisabled() {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return Parent::IsTestCaseDisabled() || IsClearTypeEnabled();
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Finds the first dialog window owned by owner_process.
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHWND FindDialogWindow(DWORD owner_process) {
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HWND dialog_window(NULL);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (;;) {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    dialog_window = FindWindowEx(NULL,
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 dialog_window,
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 MAKEINTATOM(32770),
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 NULL);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dialog_window)
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The dialog must be owned by our target process.
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DWORD process_id = 0;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GetWindowThreadProcessId(dialog_window, &process_id);
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (process_id == owner_process)
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return dialog_window;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tries to close a dialog window.
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool CloseDialogWindow(HWND dialog_window) {
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LRESULT res = SendMessage(dialog_window, DM_GETDEFID, 0, 0);
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!res)
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(DC_HASDEFID, HIWORD(res));
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WORD print_button_id = LOWORD(res);
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  res = SendMessage(
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      dialog_window,
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WM_COMMAND,
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      print_button_id,
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      reinterpret_cast<LPARAM>(GetDlgItem(dialog_window, print_button_id)));
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return res == 0;
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Dismiss the first dialog box owned by owner_process by "executing" the
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// default button.
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DismissTheWindow : public base::DelegateSimpleThread::Delegate {
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit DismissTheWindow(DWORD owner_process)
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : owner_process_(owner_process) {
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Run() {
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    HWND dialog_window;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (;;) {
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // First enumerate the windows.
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      dialog_window = FindDialogWindow(owner_process_);
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Try to close it.
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (dialog_window) {
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if (CloseDialogWindow(dialog_window)) {
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          break;
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
2623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      base::PlatformThread::Sleep(10);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Now verify that it indeed closed itself.
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    while (IsWindow(dialog_window)) {
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CloseDialogWindow(dialog_window);
2683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      base::PlatformThread::Sleep(10);
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DWORD owner_process() { return owner_process_; }
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DWORD owner_process_;
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Fails, see http://crbug.com/7721.
28121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(PrintingLayoutTextTest, DISABLED_Complex) {
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (IsTestCaseDisabled())
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DismissTheWindow dismisser(base::GetProcId(process()));
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::DelegateSimpleThread close_printdlg_thread(&dismisser,
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                   "close_printdlg_thread");
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Print a document, check its output.
2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NavigateToURL(test_server.GetURL("files/printing/test1.html"));
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  close_printdlg_thread.Start();
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrintNowTab();
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  close_printdlg_thread.Join();
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0., CompareWithResult(L"test1"));
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct TestPool {
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* source;
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const wchar_t* result;
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst TestPool kTestPool[] = {
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ImagesB&W
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "files/printing/test2.html", L"test2",
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ImagesTransparent
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "files/printing/test3.html", L"test3",
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ImageColor
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "files/printing/test4.html", L"test4",
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// http://crbug.com/7721
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(PrintingLayoutTestHidden, DISABLED_ManyTimes) {
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (IsTestCaseDisabled())
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DismissTheWindow dismisser(base::GetProcId(process()));
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_GT(arraysize(kTestPool), 0u);
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = 0; i < arraysize(kTestPool); ++i) {
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (i)
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CleanupDumpDirectory();
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const TestPool& test = kTestPool[i % arraysize(kTestPool)];
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NavigateToURL(test_server.GetURL(test.source));
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::DelegateSimpleThread close_printdlg_thread1(&dismisser,
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                      "close_printdlg_thread");
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process()));
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread1.Start();
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PrintNowTab();
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread1.Join();
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(0., CompareWithResult(test.result)) << test.result;
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CleanupDumpDirectory();
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::DelegateSimpleThread close_printdlg_thread2(&dismisser,
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                      "close_printdlg_thread");
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process()));
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread2.Start();
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PrintNowTab();
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread2.Join();
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(0., CompareWithResult(test.result)) << test.result;
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CleanupDumpDirectory();
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::DelegateSimpleThread close_printdlg_thread3(&dismisser,
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                      "close_printdlg_thread");
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process()));
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread3.Start();
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PrintNowTab();
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread3.Join();
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(0., CompareWithResult(test.result)) << test.result;
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CleanupDumpDirectory();
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::DelegateSimpleThread close_printdlg_thread4(&dismisser,
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                      "close_printdlg_thread");
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(NULL, FindDialogWindow(dismisser.owner_process()));
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread4.Start();
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PrintNowTab();
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread4.Join();
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(0., CompareWithResult(test.result)) << test.result;
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Prints a popup and immediately closes it. Disabled because it crashes.
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(PrintingLayoutTest, DISABLED_Delayed) {
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (IsTestCaseDisabled())
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<TabProxy> tab_proxy(GetActiveTab());
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(tab_proxy.get());
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool is_timeout = true;
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GURL url = test_server.GetURL("files/printing/popup_delayed_print.htm");
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS,
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              tab_proxy->NavigateToURL(url));
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DismissTheWindow dismisser(base::GetProcId(process()));
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::DelegateSimpleThread close_printdlg_thread(&dismisser,
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                     "close_printdlg_thread");
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread.Start();
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread.Join();
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Force a navigation elsewhere to verify that it's fine with it.
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    url = test_server.GetURL("files/printing/test1.html");
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS,
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              tab_proxy->NavigateToURL(url));
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloseBrowserAndServer();
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0., CompareWithResult(L"popup_delayed_print"))
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      << L"popup_delayed_print";
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Prints a popup and immediately closes it. http://crbug.com/7721
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(PrintingLayoutTest, DISABLED_IFrame) {
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (IsTestCaseDisabled())
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<TabProxy> tab_proxy(GetActiveTab());
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(tab_proxy.get());
4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GURL url = test_server.GetURL("files/printing/iframe.htm");
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS,
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              tab_proxy->NavigateToURL(url));
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DismissTheWindow dismisser(base::GetProcId(process()));
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::DelegateSimpleThread close_printdlg_thread(&dismisser,
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                     "close_printdlg_thread");
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread.Start();
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    close_printdlg_thread.Join();
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Force a navigation elsewhere to verify that it's fine with it.
4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    url = test_server.GetURL("files/printing/test1.html");
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS,
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              tab_proxy->NavigateToURL(url));
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloseBrowserAndServer();
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0., CompareWithResult(L"iframe")) << L"iframe";
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
427