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