| // Copyright 2019 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 "weblayer/test/weblayer_browser_test.h" |
| |
| #include "base/macros.h" |
| #include "base/test/bind_test_util.h" |
| #include "base/test/scoped_feature_list.h" |
| #include "content/public/test/url_loader_interceptor.h" |
| #include "net/base/mock_network_change_notifier.h" |
| #include "net/test/url_request/url_request_failed_job.h" |
| #include "weblayer/common/features.h" |
| #include "weblayer/shell/browser/shell.h" |
| #include "weblayer/test/weblayer_browser_test_utils.h" |
| |
| #if defined(OS_ANDROID) |
| #include "components/strings/grit/components_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #endif |
| |
| namespace weblayer { |
| |
| using ErrorPageBrowserTest = WebLayerBrowserTest; |
| |
| IN_PROC_BROWSER_TEST_F(ErrorPageBrowserTest, NameNotResolved) { |
| GURL error_page_url = |
| net::URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED); |
| |
| NavigateAndWaitForFailure(error_page_url, shell()); |
| |
| // Currently, interstitials for error pages are displayed only on Android. |
| #if defined(OS_ANDROID) |
| base::string16 expected_title = |
| l10n_util::GetStringUTF16(IDS_ANDROID_ERROR_PAGE_WEBPAGE_NOT_AVAILABLE); |
| EXPECT_EQ(expected_title, GetTitle(shell())); |
| #endif |
| } |
| |
| // Verifies that navigating to a URL that returns a 404 with an empty body |
| // results in the navigation failing. |
| IN_PROC_BROWSER_TEST_F(ErrorPageBrowserTest, 404WithEmptyBody) { |
| EXPECT_TRUE(embedded_test_server()->Start()); |
| |
| GURL error_page_url = embedded_test_server()->GetURL("/empty404.html"); |
| |
| NavigateAndWaitForFailure(error_page_url, shell()); |
| } |
| |
| class ErrorPageReloadBrowserTest : public ErrorPageBrowserTest { |
| public: |
| ErrorPageReloadBrowserTest() { |
| feature_list_.InitAndEnableFeature(features::kEnableAutoReload); |
| } |
| |
| private: |
| base::test::ScopedFeatureList feature_list_; |
| }; |
| |
| IN_PROC_BROWSER_TEST_F(ErrorPageReloadBrowserTest, ReloadOnNetworkChanged) { |
| // Make sure the renderer thinks it's online, since that is a necessary |
| // condition for the reload. |
| net::test::ScopedMockNetworkChangeNotifier mock_network_change_notifier; |
| mock_network_change_notifier.mock_network_change_notifier() |
| ->SetConnectionType(net::NetworkChangeNotifier::CONNECTION_4G); |
| |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| GURL url = embedded_test_server()->GetURL("/error_page"); |
| // We send net::ERR_NETWORK_CHANGED on the first load, and the reload should |
| // get a net::OK response. |
| bool first_try = true; |
| content::URLLoaderInterceptor interceptor(base::BindLambdaForTesting( |
| [&url, &first_try](content::URLLoaderInterceptor::RequestParams* params) { |
| if (params->url_request.url == url) { |
| if (first_try) { |
| first_try = false; |
| params->client->OnComplete( |
| network::URLLoaderCompletionStatus(net::ERR_NETWORK_CHANGED)); |
| } else { |
| content::URLLoaderInterceptor::WriteResponse( |
| "weblayer/test/data/simple_page.html", params->client.get()); |
| } |
| return true; |
| } |
| return false; |
| })); |
| |
| NavigateAndWaitForCompletion(url, shell()); |
| } |
| |
| } // namespace weblayer |