| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome_frame/test/mock_ie_event_sink_actions.h" |
| #include "chrome_frame/test/mock_ie_event_sink_test.h" |
| #include "base/rand_util.h" |
| |
| namespace chrome_frame_test { |
| |
| class TestData { |
| public: |
| TestData(const std::string& value, bool in_header, LoadedInRenderer expected) |
| : value_(value), |
| in_header_(in_header), |
| expected_(expected), |
| name_(base::IntToString(base::RandInt(0, 1000))) { |
| } |
| |
| LoadedInRenderer GetExpectedRenderer() const { |
| return expected_; |
| } |
| |
| std::wstring GetPath() const { |
| return ASCIIToWide("/" + name_); |
| } |
| |
| std::wstring GetUrl(MockWebServer* server_mock) const { |
| return server_mock->Resolve(ASCIIToWide(name_)); |
| } |
| |
| void ExpectOnServer(MockWebServer* server_mock) const { |
| EXPECT_CALL(*server_mock, Get(testing::_, GetPath(), testing::_)) |
| .Times(testing::AnyNumber()) |
| .WillRepeatedly(SendFast(GetHeaders(), GetHtml())); |
| } |
| |
| std::string GetHeaders() const { |
| std::ostringstream headers; |
| headers << "HTTP/1.1 200 OK\r\n" |
| << "Connection: close\r\n" |
| << "Content-Type: text/html\r\n" |
| << "Cache-Control: no-cache\r\n"; |
| if (in_header_) { |
| headers << "X-UA-COMPATIBLE: " << value_ << "\r\n"; |
| } |
| return headers.str(); |
| } |
| |
| std::string GetHtml() const { |
| std::ostringstream html; |
| html << "<html><head>"; |
| if (!in_header_) { |
| html << "<meta http-equiv=\"x-ua-compatible\" content=\"" << value_ |
| << "\" />"; |
| } |
| html << "</head><body>This is some text.</body></html>"; |
| return html.str(); |
| } |
| |
| private: |
| LoadedInRenderer expected_; |
| std::string name_; |
| std::string value_; |
| bool in_header_; |
| }; |
| |
| // Determines the major version of the installed IE |
| // Returns -1 in case of failure, 0 if the version is newer than currently known |
| int GetIEMajorVersion() { |
| switch (GetInstalledIEVersion()) { |
| case IE_6: |
| return 6; |
| case IE_7: |
| return 7; |
| case IE_8: |
| return 8; |
| case IE_9: |
| return 9; |
| case IE_10: |
| return 10; |
| case IE_INVALID: |
| case NON_IE: |
| case IE_UNSUPPORTED: |
| ADD_FAILURE() << "Failed to detect IE version."; |
| return -1; |
| default: |
| return 0; |
| } |
| } |
| |
| int LowVersion() { |
| int ie_version = GetIEMajorVersion(); |
| switch (ie_version) { |
| case -1: |
| case 0: |
| return 5; |
| default: |
| return ie_version - 1; |
| } |
| } |
| |
| int HighVersion() { |
| int ie_version = GetIEMajorVersion(); |
| switch (ie_version) { |
| case -1: |
| case 0: |
| return 1000; |
| default: |
| return ie_version + 1; |
| } |
| } |
| |
| int EqualVersion() { |
| int ie_version = GetIEMajorVersion(); |
| switch (ie_version) { |
| case -1: |
| case 0: |
| return 1000; |
| default: |
| return ie_version; |
| } |
| } |
| |
| std::string HeaderValue(int ie_version) { |
| if (ie_version == -1) { |
| return "IE=8; Chrome=1"; |
| } else { |
| return std::string("IE=8; Chrome=IE") + base::IntToString(ie_version); |
| } |
| } |
| |
| std::string CorruptHeaderValue(int ie_version) { |
| return HeaderValue(ie_version) + ".0"; |
| } |
| |
| std::string LongHeaderValue(int ie_version) { |
| std::string long_value = HeaderValue(ie_version) + "; " + |
| std::string(256, 'a') + "=bbb"; |
| DCHECK_GT(long_value.length(), 256u); |
| DCHECK_LT(long_value.length(), 512u); |
| return long_value; |
| } |
| |
| class HeaderTest |
| : public MockIEEventSinkTest, |
| public testing::TestWithParam<TestData> { |
| public: |
| HeaderTest() {} |
| }; |
| |
| INSTANTIATE_TEST_CASE_P(MetaTag, HeaderTest, testing::Values( |
| TestData(HeaderValue(LowVersion()), false, IN_IE), |
| TestData(HeaderValue(EqualVersion()), false, IN_CF), |
| TestData(HeaderValue(HighVersion()), false, IN_CF), |
| TestData(LongHeaderValue(LowVersion()), false, IN_IE), |
| TestData(LongHeaderValue(EqualVersion()), false, IN_CF), |
| TestData(LongHeaderValue(HighVersion()), false, IN_CF))); |
| INSTANTIATE_TEST_CASE_P(HttpHeader, HeaderTest, testing::Values( |
| TestData(HeaderValue(LowVersion()), true, IN_IE), |
| TestData(HeaderValue(EqualVersion()), true, IN_CF), |
| TestData(HeaderValue(HighVersion()), true, IN_CF), |
| TestData(LongHeaderValue(LowVersion()), true, IN_IE), |
| TestData(LongHeaderValue(EqualVersion()), true, IN_CF), |
| TestData(LongHeaderValue(HighVersion()), true, IN_CF))); |
| INSTANTIATE_TEST_CASE_P(CorruptValueHeader, HeaderTest, testing::Values( |
| TestData(CorruptHeaderValue(LowVersion()), true, IN_IE), |
| TestData(CorruptHeaderValue(EqualVersion()), true, IN_IE), |
| TestData(CorruptHeaderValue(HighVersion()), true, IN_IE), |
| TestData(CorruptHeaderValue(LowVersion()), false, IN_IE), |
| TestData(CorruptHeaderValue(EqualVersion()), false, IN_IE), |
| TestData(CorruptHeaderValue(HighVersion()), false, IN_IE))); |
| |
| TEST_P(HeaderTest, HandleXUaCompatibleHeader) { |
| std::wstring url = GetParam().GetUrl(&server_mock_); |
| LoadedInRenderer expected_renderer = GetParam().GetExpectedRenderer(); |
| |
| GetParam().ExpectOnServer(&server_mock_); |
| ie_mock_.ExpectNavigation(expected_renderer, url); |
| |
| EXPECT_CALL(ie_mock_, OnLoad(expected_renderer, testing::StrEq(url))) |
| .WillOnce(CloseBrowserMock(&ie_mock_)); |
| |
| LaunchIEAndNavigate(url); |
| } |
| |
| } // namespace chrome_frame_test |