diff options
-rw-r--r-- | chrome/browser/errorpage_browsertest.cc | 183 | ||||
-rw-r--r-- | chrome/browser/errorpage_uitest.cc | 192 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 2 | ||||
-rw-r--r-- | chrome/test/base/ui_test_utils.cc | 28 | ||||
-rw-r--r-- | chrome/test/base/ui_test_utils.h | 2 |
5 files changed, 207 insertions, 200 deletions
diff --git a/chrome/browser/errorpage_browsertest.cc b/chrome/browser/errorpage_browsertest.cc new file mode 100644 index 0000000..4badd95 --- /dev/null +++ b/chrome/browser/errorpage_browsertest.cc @@ -0,0 +1,183 @@ +// Copyright (c) 2011 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 "base/utf_string_conversions.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "chrome/test/test_navigation_observer.h" +#include "content/browser/net/url_request_failed_dns_job.h" +#include "content/browser/net/url_request_mock_http_job.h" + +class ErrorPageTest : public InProcessBrowserTest { + public: + enum HistoryNavigationDirection { + HISTORY_NAVIGATE_BACK, + HISTORY_NAVIGATE_FORWARD, + }; + + // Navigates the active tab to a mock url created for the file at |file_path|. + void NavigateToFileURL(const FilePath::StringType& file_path) { + ui_test_utils::NavigateToURL( + browser(), + URLRequestMockHTTPJob::GetMockUrl(FilePath(file_path))); + } + + // Navigates to the given URL and waits for |num_navigations| to occur, and + // the title to change to |expected_title|. + void NavigateToURLAndWaitForTitle(const GURL& url, + const std::string& expected_title, + int num_navigations) { + ui_test_utils::TitleWatcher title_watcher( + browser()->GetSelectedTabContents(), + ASCIIToUTF16(expected_title)); + + ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( + browser(), url, num_navigations); + + EXPECT_EQ(title_watcher.WaitAndGetTitle(), ASCIIToUTF16(expected_title)); + } + + // Navigates back in the history and waits for |num_navigations| to occur, and + // the title to change to |expected_title|. + void GoBackAndWaitForTitle(const std::string& expected_title, + int num_navigations) { + NavigateHistoryAndWaitForTitle(expected_title, + num_navigations, + HISTORY_NAVIGATE_BACK); + } + + // Navigates forward in the history and waits for |num_navigations| to occur, + // and the title to change to |expected_title|. + void GoForwardAndWaitForTitle(const std::string& expected_title, + int num_navigations) { + NavigateHistoryAndWaitForTitle(expected_title, + num_navigations, + HISTORY_NAVIGATE_FORWARD); + } + + private: + // Navigates the browser the indicated direction in the history and waits for + // |num_navigations| to occur and the title to change to |expected_title|. + void NavigateHistoryAndWaitForTitle(const std::string& expected_title, + int num_navigations, + HistoryNavigationDirection direction) { + ui_test_utils::TitleWatcher title_watcher( + browser()->GetSelectedTabContents(), + ASCIIToUTF16(expected_title)); + + TestNavigationObserver test_navigation_observer( + Source<NavigationController>( + &browser()->GetSelectedTabContentsWrapper()->controller()), + NULL, + num_navigations); + if (direction == HISTORY_NAVIGATE_BACK) { + browser()->GoBack(CURRENT_TAB); + } else if (direction == HISTORY_NAVIGATE_FORWARD) { + browser()->GoForward(CURRENT_TAB); + } else { + FAIL(); + } + test_navigation_observer.WaitForObservation(); + + EXPECT_EQ(title_watcher.WaitAndGetTitle(), ASCIIToUTF16(expected_title)); + } +}; + +// Test that a DNS error occuring in the main frame redirects to an error page. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_Basic) { + GURL test_url(URLRequestFailedDnsJob::kTestUrl); + // The first navigation should fail, and the second one should be the error + // page. + NavigateToURLAndWaitForTitle(test_url, "Mock Link Doctor", 2); +} + +// Test that a DNS error occuring in the main frame does not result in an +// additional session history entry. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack1) { + GURL test_url(URLRequestFailedDnsJob::kTestUrl); + NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); + NavigateToURLAndWaitForTitle(test_url, "Mock Link Doctor", 2); + GoBackAndWaitForTitle("Title Of Awesomeness", 1); +} + +// Test that a DNS error occuring in the main frame does not result in an +// additional session history entry. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2) { + GURL test_url(URLRequestFailedDnsJob::kTestUrl); + NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); + + NavigateToURLAndWaitForTitle(test_url, "Mock Link Doctor", 2); + NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); + + GoBackAndWaitForTitle("Mock Link Doctor", 2); + GoBackAndWaitForTitle("Title Of Awesomeness", 1); +} + +// Test that a DNS error occuring in the main frame does not result in an +// additional session history entry. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2AndForward) { + GURL test_url(URLRequestFailedDnsJob::kTestUrl); + NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); + + NavigateToURLAndWaitForTitle(test_url, "Mock Link Doctor", 2); + NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); + + GoBackAndWaitForTitle("Mock Link Doctor", 2); + GoBackAndWaitForTitle("Title Of Awesomeness", 1); + + GoForwardAndWaitForTitle("Mock Link Doctor", 2); +} + +// Test that a DNS error occuring in the main frame does not result in an +// additional session history entry. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2Forward2) { + GURL test_url(URLRequestFailedDnsJob::kTestUrl); + NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); + + NavigateToURLAndWaitForTitle(test_url, "Mock Link Doctor", 2); + NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); + + GoBackAndWaitForTitle("Mock Link Doctor", 2); + GoBackAndWaitForTitle("Title Of More Awesomeness", 1); + + GoForwardAndWaitForTitle("Mock Link Doctor", 2); + GoForwardAndWaitForTitle("Title Of Awesomeness", 1); +} + +// Test that a DNS error occuring in an iframe. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_Basic) { + NavigateToURLAndWaitForTitle( + URLRequestMockHTTPJob::GetMockUrl( + FilePath(FILE_PATH_LITERAL("iframe_dns_error.html"))), + "Blah", + 1); +} + +// Test that a DNS error occuring in an iframe does not result in an +// additional session history entry. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_GoBack) { + NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); + NavigateToFileURL(FILE_PATH_LITERAL("iframe_dns_error.html")); + GoBackAndWaitForTitle("Title Of Awesomeness", 1); +} + +// Test that a DNS error occuring in an iframe does not result in an +// additional session history entry. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_GoBackAndForward) { + NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); + NavigateToFileURL(FILE_PATH_LITERAL("iframe_dns_error.html")); + GoBackAndWaitForTitle("Title Of Awesomeness", 1); + GoForwardAndWaitForTitle("Blah", 1); +} + +// Checks that the Link Doctor is not loaded when we receive an actual 404 page. +IN_PROC_BROWSER_TEST_F(ErrorPageTest, Page404) { + NavigateToURLAndWaitForTitle( + URLRequestMockHTTPJob::GetMockUrl( + FilePath(FILE_PATH_LITERAL("page404.html"))), + "SUCCESS", + 1); +} diff --git a/chrome/browser/errorpage_uitest.cc b/chrome/browser/errorpage_uitest.cc index fe82efb..e69de29 100644 --- a/chrome/browser/errorpage_uitest.cc +++ b/chrome/browser/errorpage_uitest.cc @@ -1,192 +0,0 @@ -// Copyright (c) 2011 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 "base/string_util.h" -#include "base/test/test_timeouts.h" -#include "base/threading/platform_thread.h" -#include "chrome/test/automation/tab_proxy.h" -#include "chrome/test/ui/ui_test.h" -#include "content/browser/net/url_request_failed_dns_job.h" -#include "content/browser/net/url_request_mock_http_job.h" -#include "net/test/test_server.h" - -class ErrorPageTest : public UITest { - protected: - bool WaitForTitleMatching(const std::wstring& title) { - for (int i = 0; i < 10; ++i) { - if (GetActiveTabTitle() == title) - return true; - base::PlatformThread::Sleep(TestTimeouts::action_timeout_ms()); - } - EXPECT_EQ(title, GetActiveTabTitle()); - return false; - } -}; - -TEST_F(ErrorPageTest, DNSError_Basic) { - GURL test_url(URLRequestFailedDnsJob::kTestUrl); - - // The first navigation should fail, and the second one should be the error - // page. - NavigateToURLBlockUntilNavigationsComplete(test_url, 2); - - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); -} - -TEST_F(ErrorPageTest, DNSError_GoBack1) { - // Test that a DNS error occuring in the main frame does not result in an - // additional session history entry. - GURL test_url(URLRequestFailedDnsJob::kTestUrl); - - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title2.html")))); - // The first navigation should fail, and the second one should be the error - // page. - NavigateToURLBlockUntilNavigationsComplete(test_url, 2); - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); - - EXPECT_TRUE(GetActiveTab()->GoBack()); - - EXPECT_TRUE(WaitForTitleMatching(L"Title Of Awesomeness")); -} - -// Flaky on Linux, see http://crbug.com/79412 -#if defined(OS_LINUX) -#define MAYBE_DNSError_GoBack2 FLAKY_DNSError_GoBack2 -#else -#define MAYBE_DNSError_GoBack2 DNSError_GoBack2 -#endif -TEST_F(ErrorPageTest, MAYBE_DNSError_GoBack2) { - // Test that a DNS error occuring in the main frame does not result in an - // additional session history entry. - GURL test_url(URLRequestFailedDnsJob::kTestUrl); - - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title2.html")))); - // The first navigation should fail, and the second one should be the error - // page. - NavigateToURLBlockUntilNavigationsComplete(test_url, 2); - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title3.html")))); - - // The first navigation should fail, and the second one should be the error - // page. - EXPECT_TRUE(GetActiveTab()->GoBackBlockUntilNavigationsComplete(2)); - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); - EXPECT_TRUE(GetActiveTab()->GoBack()); - - EXPECT_TRUE(WaitForTitleMatching(L"Title Of Awesomeness")); -} - -// Flaky on Linux, see http://crbug.com/79412 -#if defined(OS_LINUX) -#define MAYBE_DNSError_GoBack2AndForward FLAKY_DNSError_GoBack2AndForward -#else -#define MAYBE_DNSError_GoBack2AndForward DNSError_GoBack2AndForward -#endif -TEST_F(ErrorPageTest, MAYBE_DNSError_GoBack2AndForward) { - // Test that a DNS error occuring in the main frame does not result in an - // additional session history entry. - - GURL test_url(URLRequestFailedDnsJob::kTestUrl); - - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title2.html")))); - // The first navigation should fail, and the second one should be the error - // page. - NavigateToURLBlockUntilNavigationsComplete(test_url, 2); - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title3.html")))); - - // The first navigation should fail, and the second one should be the error - // page. - EXPECT_TRUE(GetActiveTab()->GoBackBlockUntilNavigationsComplete(2)); - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); - EXPECT_TRUE(GetActiveTab()->GoBack()); - // The first navigation should fail, and the second one should be the error - // page. - EXPECT_TRUE(GetActiveTab()->GoForwardBlockUntilNavigationsComplete(2)); - - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); -} - -// Flaky on Linux, see http://crbug.com/79412 -#if defined(OS_LINUX) -#define MAYBE_DNSError_GoBack2Forward2 FLAKY_DNSError_GoBack2Forward2 -#else -#define MAYBE_DNSError_GoBack2Forward2 DNSError_GoBack2Forward2 -#endif -TEST_F(ErrorPageTest, MAYBE_DNSError_GoBack2Forward2) { - // Test that a DNS error occuring in the main frame does not result in an - // additional session history entry. - - GURL test_url(URLRequestFailedDnsJob::kTestUrl); - - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title3.html")))); - // The first navigation should fail, and the second one should be the error - // page. - NavigateToURLBlockUntilNavigationsComplete(test_url, 2); - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title2.html")))); - - // The first navigation should fail, and the second one should be the error - // page. - EXPECT_TRUE(GetActiveTab()->GoBackBlockUntilNavigationsComplete(2)); - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); - EXPECT_TRUE(GetActiveTab()->GoBack()); - // The first navigation should fail, and the second one should be the error - // page. - EXPECT_TRUE(GetActiveTab()->GoForwardBlockUntilNavigationsComplete(2)); - EXPECT_TRUE(WaitForTitleMatching(L"Mock Link Doctor")); - EXPECT_TRUE(GetActiveTab()->GoForward()); - - EXPECT_TRUE(WaitForTitleMatching(L"Title Of Awesomeness")); -} - -TEST_F(ErrorPageTest, IFrameDNSError_Basic) { - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("iframe_dns_error.html")))); - EXPECT_TRUE(WaitForTitleMatching(L"Blah")); -} - -TEST_F(ErrorPageTest, IFrameDNSError_GoBack) { - // Test that a DNS error occuring in an iframe does not result in an - // additional session history entry. - - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title2.html")))); - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("iframe_dns_error.html")))); - - EXPECT_TRUE(GetActiveTab()->GoBack()); - - EXPECT_TRUE(WaitForTitleMatching(L"Title Of Awesomeness")); -} - -TEST_F(ErrorPageTest, IFrameDNSError_GoBackAndForward) { - // Test that a DNS error occuring in an iframe does not result in an - // additional session history entry. - - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("title2.html")))); - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("iframe_dns_error.html")))); - - EXPECT_TRUE(GetActiveTab()->GoBack()); - EXPECT_TRUE(GetActiveTab()->GoForward()); - - EXPECT_TRUE(WaitForTitleMatching(L"Blah")); -} - -// Checks that the Link Doctor is not loaded when we receive an actual 404 page. -TEST_F(ErrorPageTest, Page404) { - NavigateToURL(URLRequestMockHTTPJob::GetMockUrl( - FilePath(FILE_PATH_LITERAL("page404.html")))); - - EXPECT_TRUE(WaitForTitleMatching(L"SUCCESS")); -} diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index a247e3d..74ad1bf 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -670,7 +670,6 @@ 'browser/browser_encoding_uitest.cc', 'browser/custom_handlers/custom_handlers_uitest.cc', 'browser/download/save_page_uitest.cc', - 'browser/errorpage_uitest.cc', 'browser/default_plugin_uitest.cc', 'browser/fast_shutdown_uitest.cc', 'browser/gpu_uitest.cc', @@ -2237,6 +2236,7 @@ 'browser/custom_handlers/protocol_handler_registry_browsertest.cc', 'browser/download/download_browsertest.cc', 'browser/download/save_page_browsertest.cc', + 'browser/errorpage_browsertest.cc', 'browser/extensions/alert_apitest.cc', 'browser/extensions/all_urls_apitest.cc', 'browser/extensions/app_background_page_apitest.cc', diff --git a/chrome/test/base/ui_test_utils.cc b/chrome/test/base/ui_test_utils.cc index d087e68..9a2a006 100644 --- a/chrome/test/base/ui_test_utils.cc +++ b/chrome/test/base/ui_test_utils.cc @@ -811,7 +811,7 @@ void WindowedNotificationObserver::Observe(int type, TitleWatcher::TitleWatcher(TabContents* tab_contents, const string16& expected_title) - : expected_tab_(tab_contents), + : tab_contents_(tab_contents), expected_title_observed_(false), quit_loop_on_observation_(false) { EXPECT_TRUE(tab_contents != NULL); @@ -819,6 +819,16 @@ TitleWatcher::TitleWatcher(TabContents* tab_contents, notification_registrar_.Add(this, content::NOTIFICATION_TAB_CONTENTS_TITLE_UPDATED, Source<TabContents>(tab_contents)); + + // When navigating through the history, the restored NavigationEntry's title + // will be used. If the entry ends up having the same title after we return + // to it, as will usually be the case, the + // NOTIFICATION_TAB_CONTENTS_TITLE_UPDATED will then be suppressed, since the + // NavigationEntry's title hasn't changed. + notification_registrar_.Add( + this, + content::NOTIFICATION_LOAD_STOP, + Source<NavigationController>(&tab_contents->controller())); } void TitleWatcher::AlsoWaitForTitle(const string16& expected_title) { @@ -839,15 +849,21 @@ const string16& TitleWatcher::WaitAndGetTitle() { void TitleWatcher::Observe(int type, const NotificationSource& source, const NotificationDetails& details) { - if (type != content::NOTIFICATION_TAB_CONTENTS_TITLE_UPDATED) - return; + if (type == content::NOTIFICATION_TAB_CONTENTS_TITLE_UPDATED) { + TabContents* source_contents = Source<TabContents>(source).ptr(); + ASSERT_EQ(tab_contents_, source_contents); + } else if (type == content::NOTIFICATION_LOAD_STOP) { + NavigationController* controller = + Source<NavigationController>(source).ptr(); + ASSERT_EQ(&tab_contents_->controller(), controller); + } else { + FAIL() << "Unexpected notification received."; + } - TabContents* source_contents = Source<TabContents>(source).ptr(); - ASSERT_EQ(expected_tab_, source_contents); std::vector<string16>::const_iterator it = std::find(expected_titles_.begin(), expected_titles_.end(), - source_contents->GetTitle()); + tab_contents_->GetTitle()); if (it == expected_titles_.end()) return; observed_title_ = *it; diff --git a/chrome/test/base/ui_test_utils.h b/chrome/test/base/ui_test_utils.h index 07a4311..551959f 100644 --- a/chrome/test/base/ui_test_utils.h +++ b/chrome/test/base/ui_test_utils.h @@ -475,7 +475,7 @@ class TitleWatcher : public NotificationObserver { const NotificationSource& source, const NotificationDetails& details) OVERRIDE; - TabContents* expected_tab_; + TabContents* tab_contents_; std::vector<string16> expected_titles_; NotificationRegistrar notification_registrar_; |