summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-02 19:23:45 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-02 19:23:45 +0000
commit15d79e12a0831ac527dc938297c14a386dcf5f0a (patch)
tree22c72b70cd8d4534433a1005b5e680c66eeb9463 /chrome/browser
parent30de967447ec9f048578cda8b22aba5fad2c68d8 (diff)
downloadchromium_src-15d79e12a0831ac527dc938297c14a386dcf5f0a.zip
chromium_src-15d79e12a0831ac527dc938297c14a386dcf5f0a.tar.gz
chromium_src-15d79e12a0831ac527dc938297c14a386dcf5f0a.tar.bz2
Move alternate error page loading out of WebFrame.
Make the RenderView be in charge of loading alternate error pages. While working on this change, I noticed several related bugs: 1- Loading an URL with an invalid host name from the new tab page results in an error page. If you hit back and then forward, you will be left with an empty location bar. In a debug build this trips an assertion in ClassifyNavigation because the given page_id is -1. This problem is caused by not duplicating the NavigationState of the failed load when creating a load for the error page. Hence, the pending_page_id of the forward navigation is lost. 2- Loading an URL with an invalid host name as a subframe results in an extra navigation in session history. One navigation for the main frame and one navigation for the error page load. This is another symptom of the problem described in #1. However, the solution is different. Here, we need to know that the subframe load is an AUTO_SUBFRAME load so that we load the error page using 'replace' semantics (so that WebCore does not generate a new session history entry). Finally, I decided to restrict alternative DNS error pages to only work for the main frame to match what we do for alternative 404 error pages. It doesn't seem worth it to show link doctor results for subframes since their primary purpose is to assist people who mis-type an URL. R=tony,brettw BUG=15648 TEST=covered by errorpage_uitest.cc Review URL: http://codereview.chromium.org/159575 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@22253 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/errorpage_uitest.cc161
1 files changed, 126 insertions, 35 deletions
diff --git a/chrome/browser/errorpage_uitest.cc b/chrome/browser/errorpage_uitest.cc
index 9b2c489..b72308c 100644
--- a/chrome/browser/errorpage_uitest.cc
+++ b/chrome/browser/errorpage_uitest.cc
@@ -3,35 +3,141 @@
// found in the LICENSE file.
#include "base/string_util.h"
+#include "chrome/test/automation/tab_proxy.h"
#include "chrome/test/ui/ui_test.h"
#include "chrome/browser/net/url_request_failed_dns_job.h"
+#include "chrome/browser/net/url_request_mock_http_job.h"
#include "net/url_request/url_request_unittest.h"
class ErrorPageTest : public UITest {
+ protected:
+ bool WaitForTitleMatching(const std::wstring& title) {
+ for (int i = 0; i < 100; ++i) {
+ if (GetActiveTabTitle() == title)
+ return true;
+ PlatformThread::Sleep(sleep_timeout_ms() / 10);
+ }
+ return false;
+ }
+ bool WaitForTitleContaining(const std::string& title_substring) {
+ for (int i = 0; i < 100; ++i) {
+ std::wstring title = GetActiveTabTitle();
+ if (title.find(UTF8ToWide(title_substring)) != std::wstring::npos)
+ return true;
+ PlatformThread::Sleep(sleep_timeout_ms() / 10);
+ }
+ return false;
+ }
};
-TEST_F(ErrorPageTest, DNSError) {
+TEST_F(ErrorPageTest, DNSError_Basic) {
GURL test_url(URLRequestFailedDnsJob::kTestUrl);
- std::wstring test_host = UTF8ToWide(test_url.host());
+
NavigateToURL(test_url);
- // Verify that the url is in the title. Since it's set via Javascript, we
- // need to give it a chance to run.
- int i;
- std::wstring title;
- for (i = 0; i < 10; ++i) {
- PlatformThread::Sleep(sleep_timeout_ms());
- title = GetActiveTabTitle();
- if (title.find(test_host) != std::wstring::npos) {
- // Success, bail out.
- break;
- }
- }
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+}
- if (i == 10) {
- FAIL() << "failed to get error page title; got " << title;
- }
-};
+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(L"title2.html"));
+ NavigateToURL(test_url);
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+
+ GetActiveTab()->GoBack();
+
+ EXPECT_TRUE(WaitForTitleMatching(L"Title Of Awesomeness"));
+}
+
+TEST_F(ErrorPageTest, 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(L"title2.html"));
+ NavigateToURL(test_url);
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+ NavigateToURL(URLRequestMockHTTPJob::GetMockUrl(L"title3.html"));
+
+ GetActiveTab()->GoBack();
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+ GetActiveTab()->GoBack();
+
+ EXPECT_TRUE(WaitForTitleMatching(L"Title Of Awesomeness"));
+}
+
+TEST_F(ErrorPageTest, 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(L"title2.html"));
+ NavigateToURL(test_url);
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+ NavigateToURL(URLRequestMockHTTPJob::GetMockUrl(L"title3.html"));
+
+ GetActiveTab()->GoBack();
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+ GetActiveTab()->GoBack();
+ GetActiveTab()->GoForward();
+
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+}
+
+TEST_F(ErrorPageTest, 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(L"title3.html"));
+ NavigateToURL(test_url);
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+ NavigateToURL(URLRequestMockHTTPJob::GetMockUrl(L"title2.html"));
+
+ GetActiveTab()->GoBack();
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+ GetActiveTab()->GoBack();
+ GetActiveTab()->GoForward();
+ EXPECT_TRUE(WaitForTitleContaining(test_url.host()));
+ GetActiveTab()->GoForward();
+
+ EXPECT_TRUE(WaitForTitleMatching(L"Title Of Awesomeness"));
+}
+
+TEST_F(ErrorPageTest, IFrameDNSError_Basic) {
+ NavigateToURL(URLRequestMockHTTPJob::GetMockUrl(L"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(L"title2.html"));
+ NavigateToURL(URLRequestMockHTTPJob::GetMockUrl(L"iframe_dns_error.html"));
+
+ 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(L"title2.html"));
+ NavigateToURL(URLRequestMockHTTPJob::GetMockUrl(L"iframe_dns_error.html"));
+
+ GetActiveTab()->GoBack();
+ GetActiveTab()->GoForward();
+
+ EXPECT_TRUE(WaitForTitleMatching(L"Blah"));
+}
TEST_F(ErrorPageTest, IFrame404) {
// iframes that have 404 pages should not trigger an alternate error page.
@@ -44,20 +150,5 @@ TEST_F(ErrorPageTest, IFrame404) {
GURL test_url = server->TestServerPage("files/iframe404.html");
NavigateToURL(test_url);
- // Verify that the url is in the title. Since it's set via Javascript, we
- // need to give it a chance to run.
- int i;
- std::wstring title;
- for (i = 0; i < 10; ++i) {
- PlatformThread::Sleep(sleep_timeout_ms());
- title = GetActiveTabTitle();
- if (title == L"SUCCESS") {
- // Success, bail out.
- break;
- }
- }
-
- if (i == 10) {
- FAIL() << "iframe 404 didn't load properly";
- }
-};
+ EXPECT_TRUE(WaitForTitleMatching(L"SUCCESS"));
+}