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 "chrome_frame/test/test_with_web_server.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_version_info.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/memory_mapped_file.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/kill.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/helper.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/installer/util/install_util.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/installer/util/product.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/html_utils.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/test/chrome_frame_test_utils.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/test/mock_ie_event_sink_actions.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/test/mock_ie_event_sink_test.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/test/test_scrubber.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome_frame/utils.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_util.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/socket/stream_listen_socket.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chrome_frame_test::kChromeFrameLongNavigationTimeout;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chrome_frame_test::kChromeFrameVeryLongNavigationTimeout;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrCaseEq;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kDocRoot[] = L"chrome_frame\\test\\data";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper method for creating the appropriate HTTP response headers.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateHttpHeaders(CFInvocation invocation,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool add_no_cache_header,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& content_type) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::ostringstream ss;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ss << "HTTP/1.1 200 OK\r\n"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     << "Connection: close\r\n"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     << "Content-Type: " << content_type << "\r\n";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (invocation.type() == CFInvocation::HTTP_HEADER)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ss << "X-UA-Compatible: chrome=1\r\n";
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (add_no_cache_header) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ss << "Cache-Control: no-cache\r\n";
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ss << "Expires: Tue, 15 Nov 1994 08:12:31 GMT\r\n";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ss.str();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string GetMockHttpHeaders(const base::FilePath& mock_http_headers_path) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers;
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ReadFileToString(mock_http_headers_path, &headers);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return headers;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeFrameTestEnvironment: public testing::Environment {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ChromeFrameTestEnvironment() {}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedChromeFrameRegistrar::RegisterDefaults();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)::testing::Environment* const chrome_frame_env =
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::AddGlobalTestEnvironment(new ChromeFrameTestEnvironment);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeFrameTestWithWebServer::test_file_path_;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeFrameTestWithWebServer::results_dir_;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeFrameTestWithWebServer::CFInstall_path_;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeFrameTestWithWebServer::CFInstance_path_;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::ScopedTempDir ChromeFrameTestWithWebServer::temp_dir_;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeFrameTestWithWebServer::chrome_user_data_dir_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome_frame_test::TimedMsgLoop* ChromeFrameTestWithWebServer::loop_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeFrameTestWithWebServer::local_address_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testing::StrictMock<MockWebServerListener>*
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeFrameTestWithWebServer::listener_mock_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testing::StrictMock<MockWebServer>* ChromeFrameTestWithWebServer::server_mock_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeFrameTestWithWebServer::ChromeFrameTestWithWebServer() {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::SetUpTestCase() {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath chrome_frame_source_path;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &chrome_frame_source_path);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_frame_source_path = chrome_frame_source_path.Append(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("chrome_frame"));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_file_path_ = chrome_frame_source_path
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Append(FILE_PATH_LITERAL("test"))
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Append(FILE_PATH_LITERAL("data"));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results_dir_ = chrome_frame_test::GetTestDataFolder().AppendASCII("dump");
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy the CFInstance.js and CFInstall.js files from src\chrome_frame to
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // src\chrome_frame\test\data.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath CFInstance_src_path;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath CFInstall_src_path;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CFInstance_src_path = chrome_frame_source_path.AppendASCII("CFInstance.js");
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CFInstance_path_ = test_file_path_.AppendASCII("CFInstance.js");
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::CopyFile(CFInstance_src_path, CFInstance_path_));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CFInstall_src_path = chrome_frame_source_path.AppendASCII("CFInstall.js");
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CFInstall_path_ = test_file_path_.AppendASCII("CFInstall.js");
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::CopyFile(CFInstall_src_path, CFInstall_path_));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop_ = new chrome_frame_test::TimedMsgLoop();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop_->set_snapshot_on_timeout(true);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  local_address_ = chrome_frame_test::GetLocalIPv4Address();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener_mock_ = new testing::StrictMock<MockWebServerListener>();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_mock_ = new testing::StrictMock<MockWebServer>(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1337, ASCIIToWide(local_address_),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_frame_test::GetTestDataFolder());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_mock_->set_listener(listener_mock_);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::TearDownTestCase() {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete server_mock_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_mock_ = NULL;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete listener_mock_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener_mock_ = NULL;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  local_address_.clear();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete loop_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop_ = NULL;
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DeleteFile(CFInstall_path_, false);
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DeleteFile(CFInstance_path_, false);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (temp_dir_.IsValid())
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(temp_dir_.Delete());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath&
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeFrameTestWithWebServer::GetChromeUserDataDirectory() {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!temp_dir_.IsValid()) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_user_data_dir_ = temp_dir_.path().AppendASCII("User Data");
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return chrome_user_data_dir_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::SetUp() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that we are not accidentally enabling gcf protocol.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigBool(kAllowUnsafeURLs, false);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_mock().ClearResults();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_mock().ExpectAndServeAnyRequests(CFInvocation(CFInvocation::NONE));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_mock().set_expected_result("OK");
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::TearDown() {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloseBrowser();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop().RunUntilIdle();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing::Mock::VerifyAndClear(listener_mock_);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing::Mock::VerifyAndClear(server_mock_);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeFrameTestWithWebServer::LaunchBrowser(BrowserKind browser,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const wchar_t* page) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring url = page;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should resolve the URL only if it is a relative url.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL parsed_url(WideToUTF8(page));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!parsed_url.has_scheme()) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url = server_mock().Resolve(page);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_ = browser;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser == IE) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_handle_.Set(chrome_frame_test::LaunchIE(url));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (browser == CHROME) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& user_data_dir = GetChromeUserDataDirectory();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_frame_test::OverrideDataDirectoryForThisTest(user_data_dir.value());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_handle_.Set(chrome_frame_test::LaunchChrome(url, user_data_dir));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_handle_.IsValid();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::CloseBrowser() {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser_handle_.IsValid())
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int attempts = 0;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_ == IE) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attempts = chrome_frame_test::CloseAllIEWindows();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attempts = chrome_frame_test::CloseVisibleWindowsOnAllThreads(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                               browser_handle_);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attempts > 0) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD wait = ::WaitForSingleObject(browser_handle_, 20000);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wait == WAIT_OBJECT_0) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_handle_.Close();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "WaitForSingleObject returned " << wait;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "No attempts to close browser windows";
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_handle_.IsValid()) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD exit_code = 0;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!::GetExitCodeProcess(browser_handle_, &exit_code) ||
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        exit_code == STILL_ACTIVE) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << L"Forcefully killing browser process. Exit:" << exit_code;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::KillProcess(browser_handle_, 0, true);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_handle_.Close();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeFrameTestWithWebServer::BringBrowserToTop() {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return simulate_input::EnsureProcessInForeground(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProcessId(browser_handle_));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeFrameTestWithWebServer::WaitForTestToComplete(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta duration) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop().RunFor(duration);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !loop().WasTimedOut();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeFrameTestWithWebServer::WaitForOnLoad(int milliseconds) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kPostedResultSubstring[] = L"/writefile/";
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::SimpleBrowserTestExpectedResult(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserKind browser, const wchar_t* page, const char* result) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (browser == IE && chrome_frame_test::GetInstalledIEVersion() >= IE_9) {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(INFO) << "Temporarily disabling IE9 web server tests. "
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 "See http://crbug.com/143699";
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tries = 0;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectAndHandlePostedResult();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retry tests that timeout once; see http://crbug.com/96449.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: Failed ASSERTs cause this function to exit immediately.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't take a snapshot on the first try.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loop().set_snapshot_on_timeout(tries != 0);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(LaunchBrowser(browser, page));
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WaitForTestToComplete(TestTimeouts::action_max_timeout())) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The test exited without timing out.  Confirm that the expected response
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // was posted and return.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(result, server_mock().posted_result());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(std::string(), server_mock().posted_result())
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Test timed out yet provided a result.";
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(0, tries++) << "Failing test due to two timeouts.";
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Close the browser and try a second time.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CloseBrowser();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Retrying test once since it timed out.";
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (true);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop().set_snapshot_on_timeout(true);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::SimpleBrowserTest(BrowserKind browser,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* page) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTestExpectedResult(browser, page, "OK");
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::ExpectAndHandlePostedResult() {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(listener_mock(), OnExpectedResponse())
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(QUIT_LOOP_SOON(loop(),
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::TimeDelta::FromMilliseconds(100)));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_mock().ExpectAndHandlePostedResult(CFInvocation(CFInvocation::NONE),
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            kPostedResultSubstring);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameTestWithWebServer::VersionTest(BrowserKind browser,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* page) {
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath plugin_path;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_MODULE, &plugin_path);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_path = plugin_path.Append(kChromeFrameDllName);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static FileVersionInfo* version_info =
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FileVersionInfo::CreateFileVersionInfo(plugin_path);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring version;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (version_info)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    version = version_info->product_version();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we can't find the Chrome Frame DLL in the src tree, we turn to
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the directory where chrome is installed.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!version_info) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserDistribution* dist = BrowserDistribution::GetDistribution();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Version ver_system;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::GetChromeVersion(dist, true, &ver_system);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Version ver_user;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InstallUtil::GetChromeVersion(dist, false, &ver_system);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(ver_system.IsValid() || ver_user.IsValid());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool system_install = ver_system.IsValid();
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath cf_dll_path(installer::GetChromeInstallPath(system_install, dist));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cf_dll_path = cf_dll_path.Append(UTF8ToWide(
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ver_system.IsValid() ? ver_system.GetString() : ver_user.GetString()));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cf_dll_path = cf_dll_path.Append(kChromeFrameDllName);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    version_info = FileVersionInfo::CreateFileVersionInfo(cf_dll_path);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (version_info)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      version = version_info->product_version();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_mock().set_expected_result(WideToUTF8(version));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(version_info);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(version.empty());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTestExpectedResult(browser, page, WideToASCII(version).c_str());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockWebServer methods
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockWebServer::ExpectAndServeRequest(CFInvocation invocation,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const std::wstring& url) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectAndServeRequestWithCardinality(invocation, url, testing::Exactly(1));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockWebServer::ExpectAndServeRequestWithCardinality(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CFInvocation invocation, const std::wstring& url,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Cardinality cardinality) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, Get(_, chrome_frame_test::UrlPathEq(url), _))
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(cardinality)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(SendResponse(this, invocation));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockWebServer::ExpectAndServeRequestAllowCache(CFInvocation invocation,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    const std::wstring &url) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, Get(_, chrome_frame_test::UrlPathEq(url), _))
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SendResponse(this, invocation));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockWebServer::ExpectAndServeRequestAnyNumberTimes(
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CFInvocation invocation, const std::wstring& path_prefix) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, Get(_, testing::StartsWith(path_prefix), _))
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(SendResponse(this, invocation));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockWebServer::ExpectAndHandlePostedResult(
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CFInvocation invocation, const std::wstring& post_suffix) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, Post(_, testing::HasSubstr(post_suffix), _))
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(HandlePostedResponseHelper(this, invocation));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockWebServer::HandlePostedResponse(
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_server::ConfigurableConnection* connection,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const test_server::Request& request) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  posted_result_ = request.content();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (listener_ && posted_result_ == expected_result_)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listener_->OnExpectedResponse();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection->Send("HTTP/1.1 200 OK\r\n", "");
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockWebServer::SendResponseHelper(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_server::ConfigurableConnection* connection,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::wstring& request_uri,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const test_server::Request& request,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CFInvocation invocation,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool add_no_cache_header) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kEchoHeader[] = L"/echoheader?";
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request_uri.find(kEchoHeader) != std::wstring::npos) {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring header = request_uri.substr(
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wcslen(kEchoHeader),
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_uri.length() - wcslen(kEchoHeader));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string header_value = http_utils::GetHttpHeaderFromHeaderList(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WideToUTF8(header), request.headers());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connection->Send(header_value, "");
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert |request_uri| to a path.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring path = request_uri;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t query_index = request_uri.find(L"?");
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (query_index != std::string::npos) {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.erase(query_index);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_path = root_dir_;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (path.size())
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_path = file_path.Append(path.substr(1));  // remove first '/'
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string headers, body;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content_type;
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (base::PathExists(file_path) &&
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      !base::DirectoryExists(file_path)) {
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath mock_http_headers(file_path.value() + L".mock-http-headers");
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (base::PathExists(mock_http_headers)) {
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      headers = GetMockHttpHeaders(mock_http_headers);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type = http_utils::GetHttpHeaderFromHeaderList("Content-type",
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                             headers);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(net::GetMimeTypeFromFile(file_path, &content_type));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Going to send file (" << WideToUTF8(file_path.value())
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << ") with content type (" << content_type << ")";
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      headers = CreateHttpHeaders(invocation, add_no_cache_header,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  content_type);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(headers.empty());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(base::ReadFileToString(file_path, &body))
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Could not read file (" << WideToUTF8(file_path.value()) << ")";
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (invocation.type() == CFInvocation::META_TAG &&
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StartsWithASCII(content_type, "text/html", false)) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(chrome_frame_test::AddCFMetaTag(&body)) << "Could not add "
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "meta tag to HTML file.";
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "Going to send 404 for non-existent file ("
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            << WideToUTF8(file_path.value()) << ")";
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers = "HTTP/1.1 404 Not Found";
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    body = "";
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection->Send(headers, body);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kPostMessageBasicPage[] = L"postmessage_basic_host.html";
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_PostMessageBasic) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kPostMessageBasicPage);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabIE_MIMEFilterBasic) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t kMIMEFilterBasicPage[] =
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"chrome_frame_mime_filter_test.html";
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this test fails for IE8 then it is possible that prebinding is enabled.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A known workaround is to disable it until CF properly handles it.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HKCU\Software\Microsoft\Internet Explorer\Main
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Value name: EnablePreBinding (REG_DWORD)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Value: 0
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kMIMEFilterBasicPage);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Times out: http://crbug.com/163728
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_WidgetModeIE_Resize) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, L"chrome_frame_resize.html");
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kNavigateURLAbsolutePage[] =
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"navigateurl_absolute_host.html";
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_NavigateURLAbsolute) {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kNavigateURLAbsolutePage);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kNavigateURLRelativePage[] =
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"navigateurl_relative_host.html";
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, crbug.com/160497.
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer,
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       DISABLED_WidgetModeIE_NavigateURLRelative) {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kNavigateURLRelativePage);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kNavigateSimpleObjectFocus[] = L"simple_object_focus.html";
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_ObjectFocus) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kNavigateSimpleObjectFocus);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kiframeBasicPage[] = L"iframe_basic_host.html";
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, crbug.com/160497.
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_WidgetModeIE_iframeBasic) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kiframeBasicPage);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kSrcPropertyTestPage[] = L"src_property_host.html";
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_SrcProperty) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kSrcPropertyTestPage);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFInstanceBasicTestPage[] = L"CFInstance_basic_host.html";
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceBasic) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFInstanceBasicTestPage);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFISingletonPage[] = L"CFInstance_singleton_host.html";
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceSingleton) {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFISingletonPage);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIDelayPage[] = L"CFInstance_delay_host.html";
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceDelay) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIDelayPage);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIFallbackPage[] = L"CFInstance_fallback_host.html";
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceFallback) {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIFallbackPage);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFINoSrcPage[] = L"CFInstance_no_src_host.html";
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, crbug.com/160497.
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_WidgetModeIE_CFInstanceNoSrc) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFINoSrcPage);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIIfrOnLoadPage[] = L"CFInstance_iframe_onload_host.html";
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// disabled since it's unlikely that we care about this case
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       DISABLED_WidgetModeIE_CFInstanceIfrOnLoad) {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIIfrOnLoadPage);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIZeroSizePage[] = L"CFInstance_zero_size_host.html";
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceZeroSize) {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIZeroSizePage);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIIfrPostPage[] = L"CFInstance_iframe_post_host.html";
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceIfrPost) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIIfrPostPage);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeChrome_CFInstanceIfrPost) {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(CHROME, kCFIIfrPostPage);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIPostPage[] = L"CFInstance_post_host.html";
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstancePost) {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (chrome_frame_test::GetInstalledIEVersion() == IE_9) {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "Not running test on Vista/Windows 7 with IE9";
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIPostPage);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test randomly fails on the ChromeFrame builder.
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeChrome_CFInstancePost) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(CHROME, kCFIPostPage);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIRPCPage[] = L"CFInstance_rpc_host.html";
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceRPC) {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (chrome_frame_test::GetInstalledIEVersion() == IE_9) {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "Not running test on Vista/Windows 7 with IE9";
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIRPCPage);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeChrome_CFInstanceRPC) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(CHROME, kCFIRPCPage);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIRPCInternalPage[] =
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"CFInstance_rpc_internal_host.html";
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceRPCInternal) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (chrome_frame_test::GetInstalledIEVersion() == IE_9) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "Not running test on Vista/Windows 7 with IE9";
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIRPCInternalPage);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeChrome_CFInstanceRPCInternal) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(CHROME, kCFIRPCInternalPage);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFIDefaultCtorPage[] =
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"CFInstance_default_ctor_host.html";
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_CFInstanceDefaultCtor) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFIDefaultCtorPage);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFInstallBasicTestPage[] = L"CFInstall_basic.html";
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabIE_CFInstallBasic) {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFInstallBasicTestPage);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFInstallPlaceTestPage[] = L"CFInstall_place.html";
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabIE_CFInstallPlace) {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFInstallPlaceTestPage);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFInstallOverlayTestPage[] = L"CFInstall_overlay.html";
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabIE_CFInstallOverlay) {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFInstallOverlayTestPage);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFInstallDismissTestPage[] = L"CFInstall_dismiss.html";
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabIE_CFInstallDismiss) {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFInstallDismissTestPage);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kInitializeHiddenPage[] = L"initialize_hidden.html";
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Times out: http://crbug.com/163728
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_WidgetModeIE_InitializeHidden) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kInitializeHiddenPage);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kFullTabHttpHeaderPage[] = L"chrome_frame_http_header.html";
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_CFHttpHeaderBasic) {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kFullTabHttpHeaderPage);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kFullTabHttpHeaderPageIFrame[] =
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"chrome_frame_http_header_host.html";
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_CFHttpHeaderIFrame) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kFullTabHttpHeaderPageIFrame);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kFullTabHttpHeaderPageFrameset[] =
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"chrome_frame_http_header_frameset.html";
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_CFHttpHeaderFrameSet) {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kFullTabHttpHeaderPageFrameset);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kVersionPage[] = L"version.html";
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, crbug.com/160497.
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_WidgetModeIE_Version) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VersionTest(IE, kVersionPage);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kEventListenerPage[] = L"event_listener.html";
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_EventListener) {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kEventListenerPage);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kPrivilegedApisPage[] = L"privileged_apis_host.html";
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_PrivilegedApis) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kPrivilegedApisPage);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kMetaTagPage[] = L"meta_tag.html";
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, crbug.com/160497.
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_FullTabModeIE_MetaTag) {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kMetaTagPage);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Times out: http://crbug.com/163728
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kCFProtocolPage[] = L"cf_protocol.html";
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_FullTabModeIE_CFProtocol) {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily enable  gcf: protocol for this test.
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigBool(kAllowUnsafeURLs, true);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kCFProtocolPage);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigBool(kAllowUnsafeURLs, false);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kPersistentCookieTest[] =
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"persistent_cookie_test_page.html";
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_PersistentCookieTest) {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kPersistentCookieTest);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kNavigateOutPage[] = L"navigate_out.html";
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_NavigateOut) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kNavigateOutPage);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kReferrerMainTest[] = L"referrer_main.html";
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_ReferrerTest) {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kReferrerMainTest);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Times out: http://crbug.com/163728
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kSubFrameTestPage[] = L"full_tab_sub_frame_main.html";
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_FullTabModeIE_SubFrame) {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kSubFrameTestPage);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kSubIFrameTestPage[] = L"full_tab_sub_iframe_main.html";
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_SubIFrame) {
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kSubIFrameTestPage);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kXMLHttpRequestTestUrl[] =
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"xmlhttprequest_test.html";
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, crbug.com/160497.
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_FullTabModeIE_XHRTest) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kXMLHttpRequestTestUrl);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kInstallFlowTestUrl[] =
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"install_flow_test.html";
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_InstallFlowTest) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedChromeFrameRegistrar::UnregisterAtPath(
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetChromeFrameBuildPath().value(),
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome_frame_test::GetTestBedType());
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(LaunchBrowser(IE, kInstallFlowTestUrl));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loop().RunFor(kChromeFrameLongNavigationTimeout);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedChromeFrameRegistrar::RegisterAtPath(
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetChromeFrameBuildPath().value(),
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome_frame_test::GetTestBedType());
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectAndHandlePostedResult();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loop().RunFor(kChromeFrameLongNavigationTimeout);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_frame_test::CloseAllIEWindows();
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ("OK", server_mock().posted_result());
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kMultipleCFInstancesTestUrl[] =
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"multiple_cf_instances_main.html";
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, WidgetModeIE_MultipleCFInstances) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kMultipleCFInstancesTestUrl);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kXHRHeaderTestUrl[] =
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"xmlhttprequest_header_test.html";
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Marking as flaky since it occasionally times out. crbug.com/127395.
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_FullTabModeIE_XHRHeaderTest) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kXHRHeaderTestUrl);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kDeleteCookieTest[] =
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"fulltab_delete_cookie_test.html";
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_DeleteCookieTest) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kDeleteCookieTest);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kAnchorUrlNavigate[] =
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"fulltab_anchor_url_navigate.html#chrome_frame";
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_AnchorUrlNavigateTest) {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kAnchorUrlNavigate);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test whether POST-ing a form from an mshtml page to a CF page will cause
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the request to get reissued.  It should not.
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://code.google.com/p/chromium/issues/detail?id=143699
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_FullTabModeIE_TestPostReissue) {
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The order of pages in this array is assumed to be mshtml, cf, script.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* kPages[] = {
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"full_tab_post_mshtml.html",
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"full_tab_post_target_cf.html",
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"chrome_frame_tester_helpers.js",
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleWebServerTest server(local_address_, 46664);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server.PopulateStaticFileListT<test_server::FileResponse>(kPages,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(kPages), GetCFTestFilePath());
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LaunchBrowser(IE, server.FormatHttpPath(kPages[0]).c_str()));
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop().RunFor(kChromeFrameLongNavigationTimeout);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const test_server::Request* request = NULL;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server.FindRequest("/quit?OK", &request);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(request != NULL);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("OK", request->arguments());
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request->arguments().compare("OK") == 0) {
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check how many requests we got for the cf page.  Also expect it to be
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a POST.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int requests = server.GetRequestCountForPage(kPages[1], "POST");
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, requests);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test whether following a link from an mshtml page to a CF page will cause
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multiple network requests.  It should not.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, crbug.com/160497.
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_FullTabModeIE_TestMultipleGet) {
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The order of pages in this array is assumed to be mshtml, cf, script.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* kPages[] = {
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"full_tab_get_mshtml.html",
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"full_tab_get_target_cf.html",
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"chrome_frame_tester_helpers.js",
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleWebServerTest server(local_address_, 46664);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server.PopulateStaticFileListT<test_server::FileResponse>(kPages,
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(kPages), GetCFTestFilePath());
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LaunchBrowser(IE, server.FormatHttpPath(kPages[0]).c_str()));
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop().RunFor(kChromeFrameVeryLongNavigationTimeout);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const test_server::Request* request = NULL;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server.FindRequest("/quit?OK", &request);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(request != NULL);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("OK", request->arguments());
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request->arguments().compare("OK") == 0) {
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check how many requests we got for the cf page and check that it was
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a GET.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int requests = server.GetRequestCountForPage(kPages[1], "GET");
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, requests);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kSetCookieTest[] =
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"fulltab_set_cookie_test.html";
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_SetCookieTest) {
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kSetCookieTest);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kXHRConditionalHeaderTestUrl[] =
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"xmlhttprequest_conditional_header_test.html";
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_XHRConditionalHeaderTest) {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kXHRConditionalHeaderTestUrl);
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kWindowCloseTestUrl[] =
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"window_close.html";
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_WindowClose) {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleBrowserTest(IE, kWindowCloseTestUrl);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetHeaderValue(const std::string& headers,
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const char* header_name) {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpUtil::HeadersIterator it(headers.begin(), headers.end(),
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    "\r\n");
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (it.GetNext()) {
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (lstrcmpiA(it.name().c_str(), header_name) == 0) {
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return it.values();
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "";
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specialized implementation of test_server::FileResponse that supports
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// adding the request's User-Agent header to the returned document.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The class also supports $request_id$ which will be replaced with an
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// id that's incremented each time the response is sent over a socket.
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UaTemplateFileResponse : public test_server::FileResponse {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef test_server::FileResponse SuperClass;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UaTemplateFileResponse(const char* request_path,
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const base::FilePath& file_path)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : test_server::FileResponse(request_path, file_path), request_id_(0) {
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Matches(const test_server::Request& r) const {
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ret = SuperClass::Matches(r);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ua_ = GetHeaderValue(r.headers(), "User-Agent");
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t ContentLength() const {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char kRequestIdTemplate[] = "$request_id$";
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char kUserAgentTemplate[] = "$UA$";
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t length = SuperClass::ContentLength();
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(length);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_.assign(reinterpret_cast<const char*>(file_->data()),
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    file_->length());
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t i = content_.find(kUserAgentTemplate);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i != std::string::npos)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_.replace(i, arraysize(kUserAgentTemplate) - 1, ua_);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i = content_.find(kRequestIdTemplate);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i != std::string::npos) {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_.replace(i, arraysize(kRequestIdTemplate) - 1,
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::StringPrintf("%i", request_id_));
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return content_.length();
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void WriteContents(net::StreamListenSocket* socket) const {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(content_.length());
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket->Send(content_.c_str(), content_.length(), false);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_id_++;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable std::string ua_;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable std::string content_;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable int request_id_;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test simulates a URL that on first request returns a document
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that should be rendered in mshtml, then pops up a sign-in page that
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after signing in, refreshes the original page that should then return
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a page that needs to be rendered in GCF.
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test currently fails because GCF does not add the chromeframe header
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to requests that mshtml initiates via IInternetSession::CreateBinding.
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, DISABLED_FullTabModeIE_RefreshMshtmlTest) {
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* kPages[] = {
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"mshtml_refresh_test.html",
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"mshtml_refresh_test_popup.html",
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleWebServerTest server(local_address_, 46664);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server.PopulateStaticFileListT<UaTemplateFileResponse>(kPages,
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(kPages), GetCFTestFilePath());
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LaunchBrowser(IE, server.FormatHttpPath(kPages[0]).c_str()));
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop().RunFor(kChromeFrameLongNavigationTimeout);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_server::SimpleWebServer* ws = server.web_server();
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const test_server::ConnectionList& connections = ws->connections();
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_server::ConnectionList::const_iterator it = connections.begin();
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int requests_for_first_page = 0;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; it != connections.end(); ++it) {
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_server::Connection* c = (*it);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const test_server::Request& r = c->request();
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!r.path().empty() &&
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASCIIToWide(r.path().substr(1)).compare(kPages[0]) == 0) {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      requests_for_first_page++;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string ua(GetHeaderValue(r.headers(), "User-Agent"));
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(std::string::npos, ua.find("chromeframe"));
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(requests_for_first_page, 1);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See bug 36694 for details.  http://crbug.com/36694
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_TestDownloadFromForm) {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_frame_test::MockWindowObserver win_observer_mock;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  win_observer_mock.WatchWindow("File Download", "");
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  win_observer_mock.WatchWindow("View Downloads*", "");
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The content of our HTML test page.  This will be returned whenever
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we reply to a GET request.
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kHtml[] =
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<html><head>\n"
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<title>ChromeFrame Form Download Test</title>\n"
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // To see how this test runs with only IE (no CF in the picture), comment
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // out this meta tag.  The outcome of the test should be identical.
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<meta http-equiv=\"X-UA-Compatible\" content=\"chrome=1\" />\n"
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</head>\n"
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<script language=\"javascript\">\n"
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "function SubmitForm() {\n"
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  var form = document.forms['myform'];\n"
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  form.action = document.location;\n"
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  form.submit();\n"
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return true;\n"
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n"
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</script>\n"
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<body onload=\"SubmitForm();\">\n"
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<form method=\"post\" action=\"foo.html\" id=\"myform\">\n"
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <input type=\"hidden\" name=\"Field1\" value=\"myvalue\" />\n"
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <input type=\"button\" name=\"btn\" value=\"Test Download\" "
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "onclick=\"return SubmitForm();\" id=\"Button1\"/>\n"
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</form></body></html>\n";
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The content of our HTML test page.  This will be returned whenever
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we reply to a POST request.
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kText[] =
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "This is a text file (in case you were wondering).";
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This http response class will return an HTML document that contains
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a form whenever it receives a GET request.  Whenever it gets a POST
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request, it will respond with a text file that needs to be downloaded
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (content-disposition is "attachment").
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class CustomResponse : public test_server::ResponseForPath {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit CustomResponse(const char* path)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : test_server::ResponseForPath(path), is_post_(false),
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        post_requests_(0), get_requests_(0) {
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetContentType(std::string* content_type) const {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(!is_post_);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual size_t ContentLength() const {
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(!is_post_);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sizeof(kHtml) - 1;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetCustomHeaders(std::string* headers) const {
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!is_post_)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *headers = base::StringPrintf(
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "HTTP/1.1 200 OK\r\n"
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Content-Disposition: attachment;filename=\"test.txt\"\r\n"
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Content-Type: application/text\r\n"
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Connection: close\r\n"
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Content-Length: %i\r\n\r\n", sizeof(kText) - 1);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool Matches(const test_server::Request& r) const {
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool match = __super::Matches(r);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (match) {
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_post_ = LowerCaseEqualsASCII(r.method().c_str(), "post");
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return match;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void WriteContents(net::StreamListenSocket* socket) const {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (is_post_) {
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        socket->Send(kText, sizeof(kText) - 1, false);
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        socket->Send(kHtml, sizeof(kHtml) - 1, false);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void IncrementAccessCounter() {
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __super::IncrementAccessCounter();
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (is_post_) {
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        post_requests_++;
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        get_requests_++;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t get_request_count() const {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return get_requests_;
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t post_request_count() const {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return get_requests_;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mutable bool is_post_;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t post_requests_;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t get_requests_;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(win_observer_mock, OnWindowOpen(_))
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AtMost(1))
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(chrome_frame_test::DoCloseWindow());
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(win_observer_mock, OnWindowClose(_))
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AtMost(1))
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(QUIT_LOOP(loop()));
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimpleWebServerTest server(local_address_, 46664);
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CustomResponse* response = new CustomResponse("/form.html");
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server.web_server()->AddResponse(response);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring url(server.FormatHttpPath(L"form.html"));
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LaunchBrowser(IE, url.c_str()));
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop().RunFor(kChromeFrameLongNavigationTimeout);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, response->get_request_count());
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, response->post_request_count());
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test loads a large page and ensures that the full page contents are
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// actually loaded via a self-validating HTML page. This is done due to a bug
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// whereby the middle of the response stream would sometimes be truncated when
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// loading a CF document. See http://crbug.com/178421 for details.
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromeFrameTestWithWebServer, FullTabModeIE_LargePageLoad) {
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const wchar_t kLargePageLoadPage[] =
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      L"chrome_frame_large_page.html";
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimpleBrowserTest(IE, kLargePageLoadPage);
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1101