summaryrefslogtreecommitdiffstats
path: root/chrome_frame/test/header_test.cc
diff options
context:
space:
mode:
authorerikwright@chromium.org <erikwright@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-25 14:14:39 +0000
committererikwright@chromium.org <erikwright@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-25 14:14:39 +0000
commitb57f0323eac5ecbbffd826abd92620901b55fd3a (patch)
treed907bb347a9aa2668213f27eee3eb257dbba41b3 /chrome_frame/test/header_test.cc
parent543bcda1772cdd04e39fc8d912f61155ff570b9f (diff)
downloadchromium_src-b57f0323eac5ecbbffd826abd92620901b55fd3a.zip
chromium_src-b57f0323eac5ecbbffd826abd92620901b55fd3a.tar.gz
chromium_src-b57f0323eac5ecbbffd826abd92620901b55fd3a.tar.bz2
Enable developers to conditionally activate Chrome Frame, depending on the version of the host IE browser.
BUG=52601 TEST=[chrome_frame_unittests / UtilTests.XUaCompatibleDirectiveTest], [chrome_frame_tests / HeaderTest.*] Review URL: http://codereview.chromium.org/3978001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@63728 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/test/header_test.cc')
-rw-r--r--chrome_frame/test/header_test.cc184
1 files changed, 184 insertions, 0 deletions
diff --git a/chrome_frame/test/header_test.cc b/chrome_frame/test/header_test.cc
new file mode 100644
index 0000000..1aedbd9
--- /dev/null
+++ b/chrome_frame/test/header_test.cc
@@ -0,0 +1,184 @@
+// Copyright (c) 2010 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";
+ 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_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