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

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: Fix incorrect spelling of iOS. 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 // Check that the search box is populated correctly. 131 // Check that the search box is populated correctly.
130 bool search_box_populated = false; 132 bool search_box_populated = false;
131 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 133 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
132 browser->tab_strip_model()->GetActiveWebContents(), 134 browser->tab_strip_model()->GetActiveWebContents(),
133 "var searchText = document.getElementById('search-box').value;" 135 "var searchText = document.getElementById('search-box').value;"
134 "domAutomationController.send(searchText == 'search query');", 136 "domAutomationController.send(searchText == 'search query');",
135 &search_box_populated)); 137 &search_box_populated));
136 EXPECT_TRUE(search_box_populated); 138 EXPECT_TRUE(search_box_populated);
137 } 139 }
138 140
141 std::string GetLoadStaleButtonLabel() {
142 return l10n_util::GetStringUTF8(IDS_ERRORPAGES_BUTTON_LOAD_STALE);
143 }
144
139 // A protocol handler that fails a configurable number of requests, then 145 // A protocol handler that fails a configurable number of requests, then
140 // succeeds all requests after that, keeping count of failures and successes. 146 // succeeds all requests after that, keeping count of failures and successes.
141 class FailFirstNRequestsProtocolHandler 147 class FailFirstNRequestsProtocolHandler
142 : public URLRequestJobFactory::ProtocolHandler { 148 : public URLRequestJobFactory::ProtocolHandler {
143 public: 149 public:
144 FailFirstNRequestsProtocolHandler(const GURL& url, int requests_to_fail) 150 FailFirstNRequestsProtocolHandler(const GURL& url, int requests_to_fail)
145 : url_(url), requests_(0), failures_(0), 151 : url_(url), requests_(0), failures_(0),
146 requests_to_fail_(requests_to_fail) {} 152 requests_to_fail_(requests_to_fail) {}
147 virtual ~FailFirstNRequestsProtocolHandler() {} 153 virtual ~FailFirstNRequestsProtocolHandler() {}
148 154
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 248
243 void GoBackAndWaitForNavigations(int num_navigations) { 249 void GoBackAndWaitForNavigations(int num_navigations) {
244 NavigateHistory(num_navigations, HISTORY_NAVIGATE_BACK); 250 NavigateHistory(num_navigations, HISTORY_NAVIGATE_BACK);
245 } 251 }
246 252
247 void GoForwardAndWaitForNavigations(int num_navigations) { 253 void GoForwardAndWaitForNavigations(int num_navigations) {
248 NavigateHistory(num_navigations, HISTORY_NAVIGATE_FORWARD); 254 NavigateHistory(num_navigations, HISTORY_NAVIGATE_FORWARD);
249 } 255 }
250 256
251 // Confirms that the javascript variable indicating whether or not we have 257 // Confirms that the javascript variable indicating whether or not we have
252 // a stale copy in the cache has been set to |expected|. 258 // a stale copy in the cache has been set to |expected|, and that the
253 bool ProbeStaleCopyValue(bool expected) { 259 // stale load button is or isn't there based on the same expectation.
260 testing::AssertionResult ProbeStaleCopyValue(bool expected) {
254 const char* js_cache_probe = 261 const char* js_cache_probe =
255 "try {\n" 262 "try {\n"
256 " domAutomationController.send(\n" 263 " domAutomationController.send(\n"
257 " templateData.staleCopyInCache ? 'yes' : 'no');\n" 264 " 'staleLoadButton' in templateData ? 'yes' : 'no');\n"
258 "} catch (e) {\n" 265 "} catch (e) {\n"
259 " domAutomationController.send(e.message);\n" 266 " domAutomationController.send(e.message);\n"
260 "}\n"; 267 "}\n";
261 268
262 std::string result; 269 std::string result;
263 bool ret = 270 bool ret =
264 content::ExecuteScriptAndExtractString( 271 content::ExecuteScriptAndExtractString(
265 browser()->tab_strip_model()->GetActiveWebContents(), 272 browser()->tab_strip_model()->GetActiveWebContents(),
266 js_cache_probe, 273 js_cache_probe,
267 &result); 274 &result);
268 EXPECT_TRUE(ret); 275 if (!ret) {
269 if (!ret) 276 return testing::AssertionFailure()
270 return false; 277 << "Failing return from ExecuteScriptAndExtractString.";
271 EXPECT_EQ(expected ? "yes" : "no", result); 278 }
272 return ((expected ? "yes" : "no") == result); 279
280 if ((expected && "yes" == result) || (!expected && "no" == result))
281 return testing::AssertionSuccess();
282
283 return testing::AssertionFailure() << "Cache probe result is " << result;
273 } 284 }
274 285
275 testing::AssertionResult ReloadStaleCopyFromCache() { 286 testing::AssertionResult ReloadStaleCopyFromCache() {
276 const char* js_reload_script = 287 const char* js_reload_script =
277 "try {\n" 288 "try {\n"
278 " errorCacheLoad.reloadStaleInstance();\n" 289 " document.getElementById('stale-load-button').click();\n"
279 " domAutomationController.send('success');\n" 290 " domAutomationController.send('success');\n"
280 "} catch (e) {\n" 291 "} catch (e) {\n"
281 " domAutomationController.send(e.message);\n" 292 " domAutomationController.send(e.message);\n"
282 "}\n"; 293 "}\n";
283 294
284 std::string result; 295 std::string result;
285 bool ret = content::ExecuteScriptAndExtractString( 296 bool ret = content::ExecuteScriptAndExtractString(
286 browser()->tab_strip_model()->GetActiveWebContents(), 297 browser()->tab_strip_model()->GetActiveWebContents(),
287 js_reload_script, 298 js_reload_script,
288 &result); 299 &result);
(...skipping 385 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(), GetLoadStaleButtonLabel()));
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(), GetLoadStaleButtonLabel()));
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(), GetLoadStaleButtonLabel()));
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(), GetLoadStaleButtonLabel()));
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