Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: chrome/browser/errorpage_browsertest.cc

Issue 207553008: Surface button for loading stale cache copy on net error page. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make new functionality work transparently on IOS, which doesn't have gin bindings. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/command_line.h" 6 #include "base/command_line.h"
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 16 matching lines...) Expand all
27 #include "content/public/browser/browser_thread.h" 27 #include "content/public/browser/browser_thread.h"
28 #include "content/public/browser/notification_service.h" 28 #include "content/public/browser/notification_service.h"
29 #include "content/public/browser/render_frame_host.h" 29 #include "content/public/browser/render_frame_host.h"
30 #include "content/public/browser/render_view_host.h" 30 #include "content/public/browser/render_view_host.h"
31 #include "content/public/browser/web_contents.h" 31 #include "content/public/browser/web_contents.h"
32 #include "content/public/browser/web_contents_observer.h" 32 #include "content/public/browser/web_contents_observer.h"
33 #include "content/public/test/browser_test_utils.h" 33 #include "content/public/test/browser_test_utils.h"
34 #include "content/public/test/test_navigation_observer.h" 34 #include "content/public/test/test_navigation_observer.h"
35 #include "content/test/net/url_request_failed_job.h" 35 #include "content/test/net/url_request_failed_job.h"
36 #include "content/test/net/url_request_mock_http_job.h" 36 #include "content/test/net/url_request_mock_http_job.h"
37 #include "grit/generated_resources.h"
37 #include "net/base/net_errors.h" 38 #include "net/base/net_errors.h"
38 #include "net/base/net_util.h" 39 #include "net/base/net_util.h"
39 #include "net/http/failing_http_transaction_factory.h" 40 #include "net/http/failing_http_transaction_factory.h"
40 #include "net/http/http_cache.h" 41 #include "net/http/http_cache.h"
41 #include "net/test/spawned_test_server/spawned_test_server.h" 42 #include "net/test/spawned_test_server/spawned_test_server.h"
42 #include "net/url_request/url_request_context.h" 43 #include "net/url_request/url_request_context.h"
43 #include "net/url_request/url_request_context_getter.h" 44 #include "net/url_request/url_request_context_getter.h"
44 #include "net/url_request/url_request_filter.h" 45 #include "net/url_request/url_request_filter.h"
45 #include "net/url_request/url_request_job.h" 46 #include "net/url_request/url_request_job.h"
46 #include "net/url_request/url_request_job_factory.h" 47 #include "net/url_request/url_request_job_factory.h"
47 #include "net/url_request/url_request_test_job.h" 48 #include "net/url_request/url_request_test_job.h"
48 #include "net/url_request/url_request_test_util.h" 49 #include "net/url_request/url_request_test_util.h"
50 #include "ui/base/l10n/l10n_util.h"
49 51
50 using content::BrowserThread; 52 using content::BrowserThread;
51 using content::NavigationController; 53 using content::NavigationController;
52 using content::URLRequestFailedJob; 54 using content::URLRequestFailedJob;
53 using net::URLRequestJobFactory; 55 using net::URLRequestJobFactory;
54 using net::URLRequestTestJob; 56 using net::URLRequestTestJob;
55 57
56 namespace { 58 namespace {
57 59
58 // Returns true if |text| is displayed on the page |browser| is currently 60 // Returns true if |text| is displayed on the page |browser| is currently
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 244
243 void GoBackAndWaitForNavigations(int num_navigations) { 245 void GoBackAndWaitForNavigations(int num_navigations) {
244 NavigateHistory(num_navigations, HISTORY_NAVIGATE_BACK); 246 NavigateHistory(num_navigations, HISTORY_NAVIGATE_BACK);
245 } 247 }
246 248
247 void GoForwardAndWaitForNavigations(int num_navigations) { 249 void GoForwardAndWaitForNavigations(int num_navigations) {
248 NavigateHistory(num_navigations, HISTORY_NAVIGATE_FORWARD); 250 NavigateHistory(num_navigations, HISTORY_NAVIGATE_FORWARD);
249 } 251 }
250 252
251 // Confirms that the javascript variable indicating whether or not we have 253 // Confirms that the javascript variable indicating whether or not we have
252 // a stale copy in the cache has been set to |expected|. 254 // a stale copy in the cache has been set to |expected|, and that the
253 bool ProbeStaleCopyValue(bool expected) { 255 // stale load button is or isn't there based on the same expectation.
256 testing::AssertionResult ProbeStaleCopyValue(bool expected) {
254 const char* js_cache_probe = 257 const char* js_cache_probe =
255 "try {\n" 258 "try {\n"
256 " domAutomationController.send(\n" 259 " domAutomationController.send(\n"
257 " templateData.staleCopyInCache ? 'yes' : 'no');\n" 260 " 'staleLoadButton' in templateData ? 'yes' : 'no');\n"
258 "} catch (e) {\n" 261 "} catch (e) {\n"
259 " domAutomationController.send(e.message);\n" 262 " domAutomationController.send(e.message);\n"
260 "}\n"; 263 "}\n";
261 264
262 std::string result; 265 std::string result;
263 bool ret = 266 bool ret =
264 content::ExecuteScriptAndExtractString( 267 content::ExecuteScriptAndExtractString(
265 browser()->tab_strip_model()->GetActiveWebContents(), 268 browser()->tab_strip_model()->GetActiveWebContents(),
266 js_cache_probe, 269 js_cache_probe,
267 &result); 270 &result);
268 EXPECT_TRUE(ret); 271 if (!ret) {
269 if (!ret) 272 return testing::AssertionFailure()
270 return false; 273 << "Failing return from ExecuteScriptAndExtractString.";
271 EXPECT_EQ(expected ? "yes" : "no", result); 274 }
272 return ((expected ? "yes" : "no") == result); 275
276 if ((expected && "yes" == result) || (!expected && "no" == result))
277 return testing::AssertionSuccess();
278
279 return testing::AssertionFailure() << "Result is " << result;
mmenke 2014/04/15 16:02:25 nit: "Cache probe result is..." maybe?
Randy Smith (Not in Mondays) 2014/04/15 18:27:29 Done.
273 } 280 }
274 281
275 testing::AssertionResult ReloadStaleCopyFromCache() { 282 testing::AssertionResult ReloadStaleCopyFromCache() {
276 const char* js_reload_script = 283 const char* js_reload_script =
277 "try {\n" 284 "try {\n"
278 " errorCacheLoad.reloadStaleInstance();\n" 285 " document.getElementById('stale-load-button').click();\n"
279 " domAutomationController.send('success');\n" 286 " domAutomationController.send('success');\n"
280 "} catch (e) {\n" 287 "} catch (e) {\n"
281 " domAutomationController.send(e.message);\n" 288 " domAutomationController.send(e.message);\n"
282 "}\n"; 289 "}\n";
283 290
284 std::string result; 291 std::string result;
285 bool ret = content::ExecuteScriptAndExtractString( 292 bool ret = content::ExecuteScriptAndExtractString(
286 browser()->tab_strip_model()->GetActiveWebContents(), 293 browser()->tab_strip_model()->GetActiveWebContents(),
287 js_reload_script, 294 js_reload_script,
288 &result); 295 &result);
289 EXPECT_TRUE(ret); 296 EXPECT_TRUE(ret);
290 if (!ret) 297 if (!ret)
291 return testing::AssertionFailure(); 298 return testing::AssertionFailure();
292 return ("success" == result ? testing::AssertionSuccess() : 299 return ("success" == result ? testing::AssertionSuccess() :
293 (testing::AssertionFailure() << "Exception message is " << result)); 300 (testing::AssertionFailure() << "Exception message is " << result));
294 } 301 }
295 302
303 std::string LoadStaleButtonLabel() {
mmenke 2014/04/15 16:02:25 Suggest either making this static, or putting in a
Randy Smith (Not in Mondays) 2014/04/15 18:27:29 Done.
304 return l10n_util::GetStringUTF8(IDS_ERRORPAGES_BUTTON_LOAD_STALE);
305 }
306
296 protected: 307 protected:
297 static void EnableMocks(const GURL& search_url) { 308 static void EnableMocks(const GURL& search_url) {
298 chrome_browser_net::SetUrlRequestMocksEnabled(true); 309 chrome_browser_net::SetUrlRequestMocksEnabled(true);
299 310
300 // Add a mock for the search engine the error page will use. 311 // Add a mock for the search engine the error page will use.
301 base::FilePath root_http; 312 base::FilePath root_http;
302 PathService::Get(chrome::DIR_TEST_DATA, &root_http); 313 PathService::Get(chrome::DIR_TEST_DATA, &root_http);
303 content::URLRequestMockHTTPJob::AddHostnameToFileHandler( 314 content::URLRequestMockHTTPJob::AddHostnameToFileHandler(
304 search_url.host(), root_http.AppendASCII("title3.html")); 315 search_url.host(), root_http.AppendASCII("title3.html"));
305 } 316 }
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 browser()->profile()->GetRequestContext(); 685 browser()->profile()->GetRequestContext();
675 BrowserThread::PostTask( 686 BrowserThread::PostTask(
676 BrowserThread::IO, FROM_HERE, 687 BrowserThread::IO, FROM_HERE,
677 base::Bind(&InterceptNetworkTransactions, url_request_context_getter, 688 base::Bind(&InterceptNetworkTransactions, url_request_context_getter,
678 net::ERR_FAILED)); 689 net::ERR_FAILED));
679 690
680 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 691 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
681 // With no navigation corrections to load, there's only one navigation. 692 // With no navigation corrections to load, there's only one navigation.
682 browser(), test_url, 1); 693 browser(), test_url, 1);
683 EXPECT_TRUE(ProbeStaleCopyValue(true)); 694 EXPECT_TRUE(ProbeStaleCopyValue(true));
695 EXPECT_TRUE(IsDisplayingText(browser(), LoadStaleButtonLabel()));
684 EXPECT_NE(base::ASCIIToUTF16("Nocache Test Page"), 696 EXPECT_NE(base::ASCIIToUTF16("Nocache Test Page"),
685 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); 697 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
686 698
687 // Confirm that loading the stale copy from the cache works. 699 // Confirm that loading the stale copy from the cache works.
688 content::TestNavigationObserver same_tab_observer( 700 content::TestNavigationObserver same_tab_observer(
689 browser()->tab_strip_model()->GetActiveWebContents(), 1); 701 browser()->tab_strip_model()->GetActiveWebContents(), 1);
690 ASSERT_TRUE(ReloadStaleCopyFromCache()); 702 ASSERT_TRUE(ReloadStaleCopyFromCache());
691 same_tab_observer.Wait(); 703 same_tab_observer.Wait();
692 EXPECT_EQ(base::ASCIIToUTF16("Nocache Test Page"), 704 EXPECT_EQ(base::ASCIIToUTF16("Nocache Test Page"),
693 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); 705 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
694 706
695 // Clear the cache and reload the same URL; confirm the error page is told 707 // Clear the cache and reload the same URL; confirm the error page is told
696 // that there is no cached copy. 708 // that there is no cached copy.
697 BrowsingDataRemover* remover = 709 BrowsingDataRemover* remover =
698 BrowsingDataRemover::CreateForUnboundedRange(browser()->profile()); 710 BrowsingDataRemover::CreateForUnboundedRange(browser()->profile());
699 remover->Remove(BrowsingDataRemover::REMOVE_CACHE, 711 remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
700 BrowsingDataHelper::UNPROTECTED_WEB); 712 BrowsingDataHelper::UNPROTECTED_WEB);
701 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 713 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
702 browser(), test_url, 1); 714 browser(), test_url, 1);
703 EXPECT_TRUE(ProbeStaleCopyValue(false)); 715 EXPECT_TRUE(ProbeStaleCopyValue(false));
716 EXPECT_FALSE(IsDisplayingText(browser(), LoadStaleButtonLabel()));
704 } 717 }
705 718
706 class ErrorPageAutoReloadTest : public InProcessBrowserTest { 719 class ErrorPageAutoReloadTest : public InProcessBrowserTest {
707 public: 720 public:
708 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 721 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
709 command_line->AppendSwitch(switches::kEnableOfflineAutoReload); 722 command_line->AppendSwitch(switches::kEnableOfflineAutoReload);
710 } 723 }
711 724
712 void InstallProtocolHandler(const GURL& url, int requests_to_fail) { 725 void InstallProtocolHandler(const GURL& url, int requests_to_fail) {
713 protocol_handler_ = new FailFirstNRequestsProtocolHandler( 726 protocol_handler_ = new FailFirstNRequestsProtocolHandler(
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 // confirm that the error page is told the cached copy exists. 868 // confirm that the error page is told the cached copy exists.
856 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter = 869 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter =
857 browser()->profile()->GetRequestContext(); 870 browser()->profile()->GetRequestContext();
858 BrowserThread::PostTask( 871 BrowserThread::PostTask(
859 BrowserThread::IO, FROM_HERE, 872 BrowserThread::IO, FROM_HERE,
860 base::Bind(&InterceptNetworkTransactions, url_request_context_getter, 873 base::Bind(&InterceptNetworkTransactions, url_request_context_getter,
861 net::ERR_CONNECTION_FAILED)); 874 net::ERR_CONNECTION_FAILED));
862 875
863 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 876 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
864 browser(), test_url, 2); 877 browser(), test_url, 2);
865 ProbeStaleCopyValue(true); 878 EXPECT_TRUE(IsDisplayingText(browser(), LoadStaleButtonLabel()));
879 EXPECT_TRUE(ProbeStaleCopyValue(true));
866 880
867 // Confirm that loading the stale copy from the cache works. 881 // Confirm that loading the stale copy from the cache works.
868 content::TestNavigationObserver same_tab_observer( 882 content::TestNavigationObserver same_tab_observer(
869 browser()->tab_strip_model()->GetActiveWebContents(), 1); 883 browser()->tab_strip_model()->GetActiveWebContents(), 1);
870 ASSERT_TRUE(ReloadStaleCopyFromCache()); 884 ASSERT_TRUE(ReloadStaleCopyFromCache());
871 same_tab_observer.Wait(); 885 same_tab_observer.Wait();
872 EXPECT_EQ(base::ASCIIToUTF16("Nocache Test Page"), 886 EXPECT_EQ(base::ASCIIToUTF16("Nocache Test Page"),
873 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); 887 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
874 888
875 // Clear the cache and reload the same URL; confirm the error page is told 889 // Clear the cache and reload the same URL; confirm the error page is told
876 // that there is no cached copy. 890 // that there is no cached copy.
877 BrowsingDataRemover* remover = 891 BrowsingDataRemover* remover =
878 BrowsingDataRemover::CreateForUnboundedRange(browser()->profile()); 892 BrowsingDataRemover::CreateForUnboundedRange(browser()->profile());
879 remover->Remove(BrowsingDataRemover::REMOVE_CACHE, 893 remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
880 BrowsingDataHelper::UNPROTECTED_WEB); 894 BrowsingDataHelper::UNPROTECTED_WEB);
881 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 895 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
882 browser(), test_url, 2); 896 browser(), test_url, 2);
883 ProbeStaleCopyValue(false); 897 EXPECT_TRUE(ProbeStaleCopyValue(false));
898 EXPECT_FALSE(IsDisplayingText(browser(), LoadStaleButtonLabel()));
884 } 899 }
885 900
886 // A test fixture that simulates failing requests for an IDN domain name. 901 // A test fixture that simulates failing requests for an IDN domain name.
887 class ErrorPageForIDNTest : public InProcessBrowserTest { 902 class ErrorPageForIDNTest : public InProcessBrowserTest {
888 public: 903 public:
889 // Target hostname in different forms. 904 // Target hostname in different forms.
890 static const char kHostname[]; 905 static const char kHostname[];
891 static const char kHostnameJSUnicode[]; 906 static const char kHostnameJSUnicode[];
892 907
893 // InProcessBrowserTest: 908 // InProcessBrowserTest:
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 browser(), 946 browser(),
932 URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT, 947 URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT,
933 kHostname), 948 kHostname),
934 1); 949 1);
935 950
936 ToggleHelpBox(browser()); 951 ToggleHelpBox(browser());
937 EXPECT_TRUE(IsDisplayingText(browser(), kHostnameJSUnicode)); 952 EXPECT_TRUE(IsDisplayingText(browser(), kHostnameJSUnicode));
938 } 953 }
939 954
940 } // namespace 955 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698