OLD | NEW |
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" | |
11 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
12 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
13 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
14 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 13 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
15 #include "chrome/browser/browsing_data/browsing_data_remover.h" | 14 #include "chrome/browser/browsing_data/browsing_data_remover.h" |
16 #include "chrome/browser/google/google_util.h" | 15 #include "chrome/browser/google/google_util.h" |
17 #include "chrome/browser/net/url_request_mock_util.h" | 16 #include "chrome/browser/net/url_request_mock_util.h" |
18 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
19 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
20 #include "chrome/browser/ui/browser_commands.h" | 19 #include "chrome/browser/ui/browser_commands.h" |
21 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 20 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
22 #include "chrome/common/chrome_paths.h" | |
23 #include "chrome/common/chrome_switches.h" | 21 #include "chrome/common/chrome_switches.h" |
24 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
25 #include "chrome/test/base/in_process_browser_test.h" | 23 #include "chrome/test/base/in_process_browser_test.h" |
26 #include "chrome/test/base/ui_test_utils.h" | 24 #include "chrome/test/base/ui_test_utils.h" |
27 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
28 #include "content/public/browser/notification_service.h" | 26 #include "content/public/browser/notification_service.h" |
29 #include "content/public/browser/render_frame_host.h" | 27 #include "content/public/browser/render_frame_host.h" |
30 #include "content/public/browser/render_view_host.h" | 28 #include "content/public/browser/render_view_host.h" |
31 #include "content/public/browser/web_contents.h" | 29 #include "content/public/browser/web_contents.h" |
32 #include "content/public/browser/web_contents_observer.h" | 30 #include "content/public/browser/web_contents_observer.h" |
(...skipping 15 matching lines...) Expand all Loading... |
48 #include "net/url_request/url_request_test_util.h" | 46 #include "net/url_request/url_request_test_util.h" |
49 | 47 |
50 using content::BrowserThread; | 48 using content::BrowserThread; |
51 using content::NavigationController; | 49 using content::NavigationController; |
52 using content::URLRequestFailedJob; | 50 using content::URLRequestFailedJob; |
53 using net::URLRequestJobFactory; | 51 using net::URLRequestJobFactory; |
54 using net::URLRequestTestJob; | 52 using net::URLRequestTestJob; |
55 | 53 |
56 namespace { | 54 namespace { |
57 | 55 |
58 // Returns true if |text| is displayed on the page |browser| is currently | |
59 // displaying. Uses "innerText", so will miss hidden text, and whitespace | |
60 // space handling may be weird. | |
61 bool WARN_UNUSED_RESULT IsDisplayingText(Browser* browser, | |
62 const std::string& text) { | |
63 std::string command = base::StringPrintf( | |
64 "var textContent = document.body.innerText;" | |
65 "var hasText = textContent.indexOf('%s') >= 0;" | |
66 "domAutomationController.send(hasText);", | |
67 text.c_str()); | |
68 bool result = false; | |
69 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | |
70 browser->tab_strip_model()->GetActiveWebContents(), command, &result)); | |
71 return result; | |
72 } | |
73 | |
74 // Expands the more box on the currently displayed error page. | |
75 void ToggleHelpBox(Browser* browser) { | |
76 EXPECT_TRUE(content::ExecuteScript( | |
77 browser->tab_strip_model()->GetActiveWebContents(), | |
78 "document.getElementById('more-less-button').click();")); | |
79 } | |
80 | |
81 // Returns true if |browser| is displaying the text representation of | |
82 // |error_code| on the current page. | |
83 bool WARN_UNUSED_RESULT IsDisplayingNetError(Browser* browser, | |
84 net::Error error_code) { | |
85 // Get the error as a string, and remove the leading "net::", which is not | |
86 // included on error pages. | |
87 std::string error_string = net::ErrorToString(error_code); | |
88 base::RemoveChars(error_string, "net:", &error_string); | |
89 | |
90 return IsDisplayingText(browser, error_string); | |
91 } | |
92 | |
93 // Checks that the local error page is being displayed, without remotely | |
94 // retrieved navigation corrections, and with the specified error code. | |
95 void ExpectDisplayingLocalErrorPage(Browser* browser, net::Error error_code) { | |
96 // Expand the help box so innerText will include text below the fold. | |
97 ToggleHelpBox(browser); | |
98 | |
99 EXPECT_TRUE(IsDisplayingNetError(browser, error_code)); | |
100 | |
101 // Locally generated error pages should not have navigation corrections. | |
102 EXPECT_FALSE(IsDisplayingText(browser, "http://correction1/")); | |
103 EXPECT_FALSE(IsDisplayingText(browser, "http://correction2/")); | |
104 | |
105 // Locally generated error pages should not have a populated search box. | |
106 bool search_box_populated = false; | |
107 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | |
108 browser->tab_strip_model()->GetActiveWebContents(), | |
109 "var searchText = document.getElementById('search-box').value;" | |
110 "domAutomationController.send(searchText == 'search query');", | |
111 &search_box_populated)); | |
112 EXPECT_FALSE(search_box_populated); | |
113 } | |
114 | |
115 // Checks that an error page with information retrieved from the navigation | |
116 // correction service is being displayed, with the specified specified error | |
117 // code. | |
118 void ExpectDisplayingNavigationCorrections(Browser* browser, | |
119 net::Error error_code) { | |
120 // Expand the help box so innerText will include text below the fold. | |
121 ToggleHelpBox(browser); | |
122 | |
123 EXPECT_TRUE(IsDisplayingNetError(browser, error_code)); | |
124 | |
125 // Check that the mock navigation corrections are displayed. | |
126 EXPECT_TRUE(IsDisplayingText(browser, "http://correction1/")); | |
127 EXPECT_TRUE(IsDisplayingText(browser, "http://correction2/")); | |
128 | |
129 // Check that the search box is populated correctly. | |
130 bool search_box_populated = false; | |
131 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | |
132 browser->tab_strip_model()->GetActiveWebContents(), | |
133 "var searchText = document.getElementById('search-box').value;" | |
134 "domAutomationController.send(searchText == 'search query');", | |
135 &search_box_populated)); | |
136 EXPECT_TRUE(search_box_populated); | |
137 } | |
138 | |
139 // A protocol handler that fails a configurable number of requests, then | 56 // A protocol handler that fails a configurable number of requests, then |
140 // succeeds all requests after that, keeping count of failures and successes. | 57 // succeeds all requests after that, keeping count of failures and successes. |
141 class FailFirstNRequestsProtocolHandler | 58 class FailFirstNRequestsProtocolHandler |
142 : public URLRequestJobFactory::ProtocolHandler { | 59 : public URLRequestJobFactory::ProtocolHandler { |
143 public: | 60 public: |
144 FailFirstNRequestsProtocolHandler(const GURL& url, int requests_to_fail) | 61 FailFirstNRequestsProtocolHandler(const GURL& url, int requests_to_fail) |
145 : url_(url), requests_(0), failures_(0), | 62 : url_(url), requests_(0), failures_(0), |
146 requests_to_fail_(requests_to_fail) {} | 63 requests_to_fail_(requests_to_fail) {} |
147 virtual ~FailFirstNRequestsProtocolHandler() {} | 64 virtual ~FailFirstNRequestsProtocolHandler() {} |
148 | 65 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 | 150 |
234 // Navigates forward in the history and waits for |num_navigations| to occur, | 151 // Navigates forward in the history and waits for |num_navigations| to occur, |
235 // and the title to change to |expected_title|. | 152 // and the title to change to |expected_title|. |
236 void GoForwardAndWaitForTitle(const std::string& expected_title, | 153 void GoForwardAndWaitForTitle(const std::string& expected_title, |
237 int num_navigations) { | 154 int num_navigations) { |
238 NavigateHistoryAndWaitForTitle(expected_title, | 155 NavigateHistoryAndWaitForTitle(expected_title, |
239 num_navigations, | 156 num_navigations, |
240 HISTORY_NAVIGATE_FORWARD); | 157 HISTORY_NAVIGATE_FORWARD); |
241 } | 158 } |
242 | 159 |
243 void GoBackAndWaitForNavigations(int num_navigations) { | |
244 NavigateHistory(num_navigations, HISTORY_NAVIGATE_BACK); | |
245 } | |
246 | |
247 void GoForwardAndWaitForNavigations(int num_navigations) { | |
248 NavigateHistory(num_navigations, HISTORY_NAVIGATE_FORWARD); | |
249 } | |
250 | |
251 // Confirms that the javascript variable indicating whether or not we have | 160 // Confirms that the javascript variable indicating whether or not we have |
252 // a stale copy in the cache has been set to |expected|. | 161 // a stale copy in the cache has been set to |expected|. |
253 bool ProbeStaleCopyValue(bool expected) { | 162 bool ProbeStaleCopyValue(bool expected) { |
254 const char* js_cache_probe = | 163 const char* js_cache_probe = |
255 "try {\n" | 164 "try {\n" |
256 " domAutomationController.send(\n" | 165 " domAutomationController.send(\n" |
257 " templateData.staleCopyInCache ? 'yes' : 'no');\n" | 166 " templateData.staleCopyInCache ? 'yes' : 'no');\n" |
258 "} catch (e) {\n" | 167 "} catch (e) {\n" |
259 " domAutomationController.send(e.message);\n" | 168 " domAutomationController.send(e.message);\n" |
260 "}\n"; | 169 "}\n"; |
(...skipping 26 matching lines...) Expand all Loading... |
287 js_reload_script, | 196 js_reload_script, |
288 &result); | 197 &result); |
289 EXPECT_TRUE(ret); | 198 EXPECT_TRUE(ret); |
290 if (!ret) | 199 if (!ret) |
291 return testing::AssertionFailure(); | 200 return testing::AssertionFailure(); |
292 return ("success" == result ? testing::AssertionSuccess() : | 201 return ("success" == result ? testing::AssertionSuccess() : |
293 (testing::AssertionFailure() << "Exception message is " << result)); | 202 (testing::AssertionFailure() << "Exception message is " << result)); |
294 } | 203 } |
295 | 204 |
296 protected: | 205 protected: |
297 static void EnableMocks(const GURL& search_url) { | |
298 chrome_browser_net::SetUrlRequestMocksEnabled(true); | |
299 | |
300 // Add a mock for the search engine the error page will use. | |
301 base::FilePath root_http; | |
302 PathService::Get(chrome::DIR_TEST_DATA, &root_http); | |
303 content::URLRequestMockHTTPJob::AddHostnameToFileHandler( | |
304 search_url.host(), root_http.AppendASCII("title3.html")); | |
305 } | |
306 | |
307 virtual void SetUpOnMainThread() OVERRIDE { | 206 virtual void SetUpOnMainThread() OVERRIDE { |
308 BrowserThread::PostTask( | 207 BrowserThread::PostTask( |
309 BrowserThread::IO, FROM_HERE, | 208 BrowserThread::IO, FROM_HERE, |
310 base::Bind(&ErrorPageTest::EnableMocks, | 209 base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); |
311 google_util::GetGoogleSearchURL(browser()->profile()))); | |
312 } | 210 } |
313 | 211 |
314 // Returns a GURL that results in a DNS error. | 212 // Returns a GURL that results in a DNS error. |
315 GURL GetDnsErrorURL() const { | 213 GURL GetDnsErrorURL() const { |
316 return URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED); | 214 return URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED); |
317 } | 215 } |
318 | 216 |
319 private: | 217 private: |
320 // Navigates the browser the indicated direction in the history and waits for | 218 // Navigates the browser the indicated direction in the history and waits for |
321 // |num_navigations| to occur and the title to change to |expected_title|. | 219 // |num_navigations| to occur and the title to change to |expected_title|. |
322 void NavigateHistoryAndWaitForTitle(const std::string& expected_title, | 220 void NavigateHistoryAndWaitForTitle(const std::string& expected_title, |
323 int num_navigations, | 221 int num_navigations, |
324 HistoryNavigationDirection direction) { | 222 HistoryNavigationDirection direction) { |
325 content::TitleWatcher title_watcher( | 223 content::TitleWatcher title_watcher( |
326 browser()->tab_strip_model()->GetActiveWebContents(), | 224 browser()->tab_strip_model()->GetActiveWebContents(), |
327 base::ASCIIToUTF16(expected_title)); | 225 base::ASCIIToUTF16(expected_title)); |
328 | 226 |
329 NavigateHistory(num_navigations, direction); | |
330 | |
331 EXPECT_EQ(title_watcher.WaitAndGetTitle(), | |
332 base::ASCIIToUTF16(expected_title)); | |
333 } | |
334 | |
335 void NavigateHistory(int num_navigations, | |
336 HistoryNavigationDirection direction) { | |
337 content::TestNavigationObserver test_navigation_observer( | 227 content::TestNavigationObserver test_navigation_observer( |
338 browser()->tab_strip_model()->GetActiveWebContents(), | 228 browser()->tab_strip_model()->GetActiveWebContents(), |
339 num_navigations); | 229 num_navigations); |
340 if (direction == HISTORY_NAVIGATE_BACK) { | 230 if (direction == HISTORY_NAVIGATE_BACK) { |
341 chrome::GoBack(browser(), CURRENT_TAB); | 231 chrome::GoBack(browser(), CURRENT_TAB); |
342 } else if (direction == HISTORY_NAVIGATE_FORWARD) { | 232 } else if (direction == HISTORY_NAVIGATE_FORWARD) { |
343 chrome::GoForward(browser(), CURRENT_TAB); | 233 chrome::GoForward(browser(), CURRENT_TAB); |
344 } else { | 234 } else { |
345 FAIL(); | 235 FAIL(); |
346 } | 236 } |
347 test_navigation_observer.Wait(); | 237 test_navigation_observer.Wait(); |
| 238 |
| 239 EXPECT_EQ(title_watcher.WaitAndGetTitle(), |
| 240 base::ASCIIToUTF16(expected_title)); |
348 } | 241 } |
349 }; | 242 }; |
350 | 243 |
351 class TestFailProvisionalLoadObserver : public content::WebContentsObserver { | 244 class TestFailProvisionalLoadObserver : public content::WebContentsObserver { |
352 public: | 245 public: |
353 explicit TestFailProvisionalLoadObserver(content::WebContents* contents) | 246 explicit TestFailProvisionalLoadObserver(content::WebContents* contents) |
354 : content::WebContentsObserver(contents) {} | 247 : content::WebContentsObserver(contents) {} |
355 virtual ~TestFailProvisionalLoadObserver() {} | 248 virtual ~TestFailProvisionalLoadObserver() {} |
356 | 249 |
357 // This method is invoked when the provisional load failed. | 250 // This method is invoked when the provisional load failed. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 // See crbug.com/109669 | 283 // See crbug.com/109669 |
391 #if defined(USE_AURA) || defined(OS_WIN) | 284 #if defined(USE_AURA) || defined(OS_WIN) |
392 #define MAYBE_DNSError_Basic DISABLED_DNSError_Basic | 285 #define MAYBE_DNSError_Basic DISABLED_DNSError_Basic |
393 #else | 286 #else |
394 #define MAYBE_DNSError_Basic DNSError_Basic | 287 #define MAYBE_DNSError_Basic DNSError_Basic |
395 #endif | 288 #endif |
396 // Test that a DNS error occuring in the main frame redirects to an error page. | 289 // Test that a DNS error occuring in the main frame redirects to an error page. |
397 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_DNSError_Basic) { | 290 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_DNSError_Basic) { |
398 // The first navigation should fail, and the second one should be the error | 291 // The first navigation should fail, and the second one should be the error |
399 // page. | 292 // page. |
400 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 293 NavigateToURLAndWaitForTitle(GetDnsErrorURL(), "Mock Link Doctor", 2); |
401 browser(), GetDnsErrorURL(), 2); | |
402 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
403 } | 294 } |
404 | 295 |
405 // See crbug.com/109669 | 296 // See crbug.com/109669 |
406 #if defined(USE_AURA) | 297 #if defined(USE_AURA) |
407 #define MAYBE_DNSError_GoBack1 DISABLED_DNSError_GoBack1 | 298 #define MAYBE_DNSError_GoBack1 DISABLED_DNSError_GoBack1 |
408 #else | 299 #else |
409 #define MAYBE_DNSError_GoBack1 DNSError_GoBack1 | 300 #define MAYBE_DNSError_GoBack1 DNSError_GoBack1 |
410 #endif | 301 #endif |
411 | 302 |
412 // Test that a DNS error occuring in the main frame does not result in an | 303 // Test that a DNS error occuring in the main frame does not result in an |
413 // additional session history entry. | 304 // additional session history entry. |
414 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_DNSError_GoBack1) { | 305 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_DNSError_GoBack1) { |
415 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 306 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
416 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 307 NavigateToURLAndWaitForTitle(GetDnsErrorURL(), "Mock Link Doctor", 2); |
417 browser(), GetDnsErrorURL(), 2); | |
418 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
419 GoBackAndWaitForTitle("Title Of Awesomeness", 1); | 308 GoBackAndWaitForTitle("Title Of Awesomeness", 1); |
420 } | 309 } |
421 | 310 |
422 // See crbug.com/109669 | 311 // See crbug.com/109669 |
423 #if defined(USE_AURA) | 312 #if defined(USE_AURA) |
424 #define MAYBE_DNSError_GoBack2 DISABLED_DNSError_GoBack2 | 313 #define MAYBE_DNSError_GoBack2 DISABLED_DNSError_GoBack2 |
425 #else | 314 #else |
426 #define MAYBE_DNSError_GoBack2 DNSError_GoBack2 | 315 #define MAYBE_DNSError_GoBack2 DNSError_GoBack2 |
427 #endif | 316 #endif |
428 // Test that a DNS error occuring in the main frame does not result in an | 317 // Test that a DNS error occuring in the main frame does not result in an |
429 // additional session history entry. | 318 // additional session history entry. |
430 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2) { | 319 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2) { |
431 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 320 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
432 | 321 |
433 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 322 NavigateToURLAndWaitForTitle(GetDnsErrorURL(), "Mock Link Doctor", 2); |
434 browser(), GetDnsErrorURL(), 2); | |
435 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
436 | |
437 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); | 323 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); |
438 | 324 |
439 GoBackAndWaitForNavigations(2); | 325 GoBackAndWaitForTitle("Mock Link Doctor", 2); |
440 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
441 | |
442 GoBackAndWaitForTitle("Title Of Awesomeness", 1); | 326 GoBackAndWaitForTitle("Title Of Awesomeness", 1); |
443 } | 327 } |
444 | 328 |
445 // See crbug.com/109669 | 329 // See crbug.com/109669 |
446 #if defined(USE_AURA) | 330 #if defined(USE_AURA) |
447 #define MAYBE_DNSError_GoBack2AndForward DISABLED_DNSError_GoBack2AndForward | 331 #define MAYBE_DNSError_GoBack2AndForward DISABLED_DNSError_GoBack2AndForward |
448 #else | 332 #else |
449 #define MAYBE_DNSError_GoBack2AndForward DNSError_GoBack2AndForward | 333 #define MAYBE_DNSError_GoBack2AndForward DNSError_GoBack2AndForward |
450 #endif | 334 #endif |
451 // Test that a DNS error occuring in the main frame does not result in an | 335 // Test that a DNS error occuring in the main frame does not result in an |
452 // additional session history entry. | 336 // additional session history entry. |
453 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2AndForward) { | 337 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2AndForward) { |
454 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 338 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
455 | 339 |
456 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 340 NavigateToURLAndWaitForTitle(GetDnsErrorURL(), "Mock Link Doctor", 2); |
457 browser(), GetDnsErrorURL(), 2); | |
458 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
459 | |
460 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); | 341 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); |
461 | 342 |
462 GoBackAndWaitForNavigations(2); | 343 GoBackAndWaitForTitle("Mock Link Doctor", 2); |
463 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
464 | |
465 GoBackAndWaitForTitle("Title Of Awesomeness", 1); | 344 GoBackAndWaitForTitle("Title Of Awesomeness", 1); |
466 | 345 |
467 GoForwardAndWaitForNavigations(2); | 346 GoForwardAndWaitForTitle("Mock Link Doctor", 2); |
468 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
469 } | 347 } |
470 | 348 |
471 // See crbug.com/109669 | 349 // See crbug.com/109669 |
472 #if defined(USE_AURA) | 350 #if defined(USE_AURA) |
473 #define MAYBE_DNSError_GoBack2Forward2 DISABLED_DNSError_GoBack2Forward2 | 351 #define MAYBE_DNSError_GoBack2Forward2 DISABLED_DNSError_GoBack2Forward2 |
474 #else | 352 #else |
475 #define MAYBE_DNSError_GoBack2Forward2 DNSError_GoBack2Forward2 | 353 #define MAYBE_DNSError_GoBack2Forward2 DNSError_GoBack2Forward2 |
476 #endif | 354 #endif |
477 // Test that a DNS error occuring in the main frame does not result in an | 355 // Test that a DNS error occuring in the main frame does not result in an |
478 // additional session history entry. | 356 // additional session history entry. |
479 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2Forward2) { | 357 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2Forward2) { |
480 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); | 358 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); |
481 | 359 |
482 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 360 NavigateToURLAndWaitForTitle(GetDnsErrorURL(), "Mock Link Doctor", 2); |
483 browser(), GetDnsErrorURL(), 2); | |
484 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
485 | |
486 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 361 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
487 | 362 |
488 GoBackAndWaitForNavigations(2); | 363 GoBackAndWaitForTitle("Mock Link Doctor", 2); |
489 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
490 | |
491 GoBackAndWaitForTitle("Title Of More Awesomeness", 1); | 364 GoBackAndWaitForTitle("Title Of More Awesomeness", 1); |
492 | 365 |
493 GoForwardAndWaitForNavigations(2); | 366 GoForwardAndWaitForTitle("Mock Link Doctor", 2); |
494 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
495 | |
496 GoForwardAndWaitForTitle("Title Of Awesomeness", 1); | 367 GoForwardAndWaitForTitle("Title Of Awesomeness", 1); |
497 } | 368 } |
498 | 369 |
499 // See crbug.com/109669 | 370 // Test that a DNS error occuring in an iframe. |
500 #if defined(USE_AURA) | |
501 #define MAYBE_DNSError_DoSearch DNSError_DoSearch | |
502 #else | |
503 #define MAYBE_DNSError_DoSearch DNSError_DoSearch | |
504 #endif | |
505 // Test that the search button on a DNS error page works. | |
506 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_DNSError_DoSearch) { | |
507 // The first navigation should fail, and the second one should be the error | |
508 // page. | |
509 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | |
510 browser(), GetDnsErrorURL(), 2); | |
511 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
512 | |
513 // Do a search and make sure the browser ends up at the right page. | |
514 content::TestNavigationObserver nav_observer( | |
515 browser()->tab_strip_model()->GetActiveWebContents(), | |
516 1); | |
517 content::TitleWatcher title_watcher( | |
518 browser()->tab_strip_model()->GetActiveWebContents(), | |
519 base::ASCIIToUTF16("Title Of More Awesomeness")); | |
520 ASSERT_TRUE(content::ExecuteScript( | |
521 browser()->tab_strip_model()->GetActiveWebContents(), | |
522 "document.getElementById('search-button').click();")); | |
523 nav_observer.Wait(); | |
524 EXPECT_EQ(base::ASCIIToUTF16("Title Of More Awesomeness"), | |
525 title_watcher.WaitAndGetTitle()); | |
526 | |
527 // Check the path and query string. | |
528 std::string url; | |
529 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | |
530 browser()->tab_strip_model()->GetActiveWebContents(), | |
531 "domAutomationController.send(window.location.href);", | |
532 &url)); | |
533 EXPECT_EQ("/search", GURL(url).path()); | |
534 EXPECT_EQ("q=search%20query", GURL(url).query()); | |
535 | |
536 // Go back to the error page, to make sure the history is correct. | |
537 GoBackAndWaitForNavigations(2); | |
538 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | |
539 } | |
540 | |
541 // Test that a DNS error occuring in an iframe does not result in showing | |
542 // navigation corrections. | |
543 IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_Basic) { | 371 IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_Basic) { |
544 NavigateToURLAndWaitForTitle( | 372 NavigateToURLAndWaitForTitle( |
545 content::URLRequestMockHTTPJob::GetMockUrl( | 373 content::URLRequestMockHTTPJob::GetMockUrl( |
546 base::FilePath(FILE_PATH_LITERAL("iframe_dns_error.html"))), | 374 base::FilePath(FILE_PATH_LITERAL("iframe_dns_error.html"))), |
547 "Blah", | 375 "Blah", |
548 1); | 376 1); |
549 // We expect to have two history entries, since we started off with navigation | 377 // We expect to have two history entries, since we started off with navigation |
550 // to "about:blank" and then navigated to "iframe_dns_error.html". | 378 // to "about:blank" and then navigated to "iframe_dns_error.html". |
551 EXPECT_EQ(2, | 379 EXPECT_EQ(2, |
552 browser()->tab_strip_model()->GetActiveWebContents()-> | 380 browser()->tab_strip_model()->GetActiveWebContents()-> |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 content::NOTIFICATION_LOAD_STOP, | 469 content::NOTIFICATION_LOAD_STOP, |
642 content::Source<NavigationController>(&wc->GetController())); | 470 content::Source<NavigationController>(&wc->GetController())); |
643 wc->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(script)); | 471 wc->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(script)); |
644 load_observer.Wait(); | 472 load_observer.Wait(); |
645 | 473 |
646 EXPECT_EQ(fail_url, fail_observer.fail_url()); | 474 EXPECT_EQ(fail_url, fail_observer.fail_url()); |
647 EXPECT_EQ(2, wc->GetController().GetEntryCount()); | 475 EXPECT_EQ(2, wc->GetController().GetEntryCount()); |
648 } | 476 } |
649 } | 477 } |
650 | 478 |
651 // Checks that navigation corrections are not loaded when we receive an actual | 479 // Checks that the Link Doctor is not loaded when we receive an actual 404 page. |
652 // 404 page. | |
653 IN_PROC_BROWSER_TEST_F(ErrorPageTest, Page404) { | 480 IN_PROC_BROWSER_TEST_F(ErrorPageTest, Page404) { |
654 NavigateToURLAndWaitForTitle( | 481 NavigateToURLAndWaitForTitle( |
655 content::URLRequestMockHTTPJob::GetMockUrl( | 482 content::URLRequestMockHTTPJob::GetMockUrl( |
656 base::FilePath(FILE_PATH_LITERAL("page404.html"))), | 483 base::FilePath(FILE_PATH_LITERAL("page404.html"))), |
657 "SUCCESS", | 484 "SUCCESS", |
658 1); | 485 1); |
659 } | 486 } |
660 | 487 |
661 // Checks that when an error occurs, the stale cache status of the page | 488 // Checks that when an error occurs, the stale cache status of the page |
662 // is correctly transferred, and that stale cached copied can be loaded | 489 // is correctly transferred, and that stale cached copied can be loaded |
663 // from the javascript. | 490 // from the javascript. |
664 IN_PROC_BROWSER_TEST_F(ErrorPageTest, StaleCacheStatus) { | 491 IN_PROC_BROWSER_TEST_F(ErrorPageTest, StaleCacheStatus) { |
665 ASSERT_TRUE(test_server()->Start()); | 492 ASSERT_TRUE(test_server()->Start()); |
666 // Load cache with entry with "nocache" set, to create stale | 493 // Load cache with entry with "nocache" set, to create stale |
667 // cache. | 494 // cache. |
668 GURL test_url(test_server()->GetURL("files/nocache.html")); | 495 GURL test_url(test_server()->GetURL("files/nocache.html")); |
669 NavigateToURLAndWaitForTitle(test_url, "Nocache Test Page", 1); | 496 NavigateToURLAndWaitForTitle(test_url, "Nocache Test Page", 1); |
670 | 497 |
671 // Reload same URL after forcing an error from the the network layer; | 498 // Reload same URL after forcing an error from the the network layer; |
672 // confirm that the error page is told the cached copy exists. | 499 // confirm that the error page is told the cached copy exists. |
673 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter = | 500 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter = |
674 browser()->profile()->GetRequestContext(); | 501 browser()->profile()->GetRequestContext(); |
675 BrowserThread::PostTask( | 502 BrowserThread::PostTask( |
676 BrowserThread::IO, FROM_HERE, | 503 BrowserThread::IO, FROM_HERE, |
677 base::Bind(&InterceptNetworkTransactions, url_request_context_getter, | 504 base::Bind(&InterceptNetworkTransactions, url_request_context_getter, |
| 505 // Note that we can't use an error that'll invoke the link |
| 506 // doctor. In normal network error conditions that would |
| 507 // work (because the link doctor fetch would also fail, |
| 508 // putting us back in the main offline path), but |
| 509 // SetUrlRequestMocksEnabled() has also specfied a link |
| 510 // doctor mock, which will be accessible because it |
| 511 // won't go through the network cache. |
678 net::ERR_FAILED)); | 512 net::ERR_FAILED)); |
679 | 513 |
680 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 514 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
681 // With no navigation corrections to load, there's only one navigation. | 515 // With no link doctor load, there's only one navigation. |
682 browser(), test_url, 1); | 516 browser(), test_url, 1); |
683 EXPECT_TRUE(ProbeStaleCopyValue(true)); | 517 EXPECT_TRUE(ProbeStaleCopyValue(true)); |
684 EXPECT_NE(base::ASCIIToUTF16("Nocache Test Page"), | 518 EXPECT_NE(base::ASCIIToUTF16("Nocache Test Page"), |
685 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); | 519 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); |
686 | 520 |
687 // Confirm that loading the stale copy from the cache works. | 521 // Confirm that loading the stale copy from the cache works. |
688 content::TestNavigationObserver same_tab_observer( | 522 content::TestNavigationObserver same_tab_observer( |
689 browser()->tab_strip_model()->GetActiveWebContents(), 1); | 523 browser()->tab_strip_model()->GetActiveWebContents(), 1); |
690 ASSERT_TRUE(ReloadStaleCopyFromCache()); | 524 ASSERT_TRUE(ReloadStaleCopyFromCache()); |
691 same_tab_observer.Wait(); | 525 same_tab_observer.Wait(); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 InstallProtocolHandler(test_url, kRequestsToFail); | 593 InstallProtocolHandler(test_url, kRequestsToFail); |
760 NavigateToURLAndWaitForTitle(test_url, "Test One", kRequestsToFail + 1); | 594 NavigateToURLAndWaitForTitle(test_url, "Test One", kRequestsToFail + 1); |
761 // Note that the protocol handler updates these variables on the IO thread, | 595 // Note that the protocol handler updates these variables on the IO thread, |
762 // but this function reads them on the main thread. The requests have to be | 596 // but this function reads them on the main thread. The requests have to be |
763 // created (on the IO thread) before NavigateToURLAndWaitForTitle returns or | 597 // created (on the IO thread) before NavigateToURLAndWaitForTitle returns or |
764 // this becomes racey. | 598 // this becomes racey. |
765 EXPECT_EQ(kRequestsToFail, protocol_handler()->failures()); | 599 EXPECT_EQ(kRequestsToFail, protocol_handler()->failures()); |
766 EXPECT_EQ(kRequestsToFail + 1, protocol_handler()->requests()); | 600 EXPECT_EQ(kRequestsToFail + 1, protocol_handler()->requests()); |
767 } | 601 } |
768 | 602 |
| 603 // Returns Javascript code that executes plain text search for the page. |
| 604 // Pass into content::ExecuteScriptAndExtractBool as |script| parameter. |
| 605 std::string GetTextContentContainsStringScript( |
| 606 const std::string& value_to_search) { |
| 607 return base::StringPrintf( |
| 608 "var textContent = document.body.textContent;" |
| 609 "var hasError = textContent.indexOf('%s') >= 0;" |
| 610 "domAutomationController.send(hasError);", |
| 611 value_to_search.c_str()); |
| 612 } |
| 613 |
769 // Protocol handler that fails all requests with net::ERR_ADDRESS_UNREACHABLE. | 614 // Protocol handler that fails all requests with net::ERR_ADDRESS_UNREACHABLE. |
770 class AddressUnreachableProtocolHandler | 615 class AddressUnreachableProtocolHandler |
771 : public net::URLRequestJobFactory::ProtocolHandler { | 616 : public net::URLRequestJobFactory::ProtocolHandler { |
772 public: | 617 public: |
773 AddressUnreachableProtocolHandler() {} | 618 AddressUnreachableProtocolHandler() {} |
774 virtual ~AddressUnreachableProtocolHandler() {} | 619 virtual ~AddressUnreachableProtocolHandler() {} |
775 | 620 |
776 // net::URLRequestJobFactory::ProtocolHandler: | 621 // net::URLRequestJobFactory::ProtocolHandler: |
777 virtual net::URLRequestJob* MaybeCreateJob( | 622 virtual net::URLRequestJob* MaybeCreateJob( |
778 net::URLRequest* request, | 623 net::URLRequest* request, |
779 net::NetworkDelegate* network_delegate) const OVERRIDE { | 624 net::NetworkDelegate* network_delegate) const OVERRIDE { |
780 return new URLRequestFailedJob(request, | 625 return new URLRequestFailedJob(request, |
781 network_delegate, | 626 network_delegate, |
782 net::ERR_ADDRESS_UNREACHABLE); | 627 net::ERR_ADDRESS_UNREACHABLE); |
783 } | 628 } |
784 | 629 |
785 private: | 630 private: |
786 DISALLOW_COPY_AND_ASSIGN(AddressUnreachableProtocolHandler); | 631 DISALLOW_COPY_AND_ASSIGN(AddressUnreachableProtocolHandler); |
787 }; | 632 }; |
788 | 633 |
789 // A test fixture that returns ERR_ADDRESS_UNREACHABLE for all navigation | 634 // A test fixture that returns ERR_ADDRESS_UNREACHABLE for all Link Doctor |
790 // correction requests. ERR_NAME_NOT_RESOLVED is more typical, but need to use | 635 // requests. ERR_NAME_NOT_RESOLVED is more typical, but need to use a different |
791 // a different error for the correction service and the original page to | 636 // error for the Link Doctor and the original page to validate the right page |
792 // validate the right page is being displayed. | 637 // is being displayed. |
793 class ErrorPageNavigationCorrectionsFailTest : public ErrorPageTest { | 638 class ErrorPageLinkDoctorFailTest : public ErrorPageTest { |
794 public: | 639 public: |
795 // InProcessBrowserTest: | 640 // InProcessBrowserTest: |
796 virtual void SetUpOnMainThread() OVERRIDE { | 641 virtual void SetUpOnMainThread() OVERRIDE { |
797 BrowserThread::PostTask( | 642 BrowserThread::PostTask( |
798 BrowserThread::IO, FROM_HERE, | 643 BrowserThread::IO, FROM_HERE, |
799 base::Bind(&ErrorPageNavigationCorrectionsFailTest::AddFilters)); | 644 base::Bind(&ErrorPageLinkDoctorFailTest::AddFilters)); |
800 } | 645 } |
801 | 646 |
802 virtual void CleanUpOnMainThread() OVERRIDE { | 647 virtual void CleanUpOnMainThread() OVERRIDE { |
803 BrowserThread::PostTask( | 648 BrowserThread::PostTask( |
804 BrowserThread::IO, FROM_HERE, | 649 BrowserThread::IO, FROM_HERE, |
805 base::Bind(&ErrorPageNavigationCorrectionsFailTest::RemoveFilters)); | 650 base::Bind(&ErrorPageLinkDoctorFailTest::RemoveFilters)); |
806 } | 651 } |
807 | 652 |
808 private: | 653 private: |
809 // Adds a filter that causes all correction service requests to fail with | 654 // Adds a filter that causes all requests for the Link Doctor's scheme and |
810 // ERR_ADDRESS_UNREACHABLE. | 655 // host to fail with ERR_ADDRESS_UNREACHABLE. Since the Link Doctor adds |
| 656 // query strings, it's not enough to just fail exact matches. |
811 // | 657 // |
812 // Also adds the content::URLRequestFailedJob filter. | 658 // Also adds the content::URLRequestFailedJob filter. |
813 static void AddFilters() { | 659 static void AddFilters() { |
814 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 660 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
815 content::URLRequestFailedJob::AddUrlHandler(); | 661 content::URLRequestFailedJob::AddUrlHandler(); |
816 | 662 |
817 net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( | 663 net::URLRequestFilter::GetInstance()->AddHostnameProtocolHandler( |
818 google_util::LinkDoctorBaseURL(), | 664 google_util::LinkDoctorBaseURL().scheme(), |
| 665 google_util::LinkDoctorBaseURL().host(), |
819 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>( | 666 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>( |
820 new AddressUnreachableProtocolHandler())); | 667 new AddressUnreachableProtocolHandler())); |
821 } | 668 } |
822 | 669 |
823 static void RemoveFilters() { | 670 static void RemoveFilters() { |
824 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 671 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
825 net::URLRequestFilter::GetInstance()->ClearHandlers(); | 672 net::URLRequestFilter::GetInstance()->ClearHandlers(); |
826 } | 673 } |
827 }; | 674 }; |
828 | 675 |
829 // Make sure that when corrections fail to load, the network error page is | 676 // Make sure that when the Link Doctor fails to load, the network error page is |
830 // successfully loaded. | 677 // successfully loaded. |
831 IN_PROC_BROWSER_TEST_F(ErrorPageNavigationCorrectionsFailTest, | 678 IN_PROC_BROWSER_TEST_F(ErrorPageLinkDoctorFailTest, LinkDoctorFail) { |
832 FetchCorrectionsFails) { | |
833 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 679 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
834 browser(), | 680 browser(), |
835 URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED), | 681 URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED), |
836 2); | 682 2); |
837 | 683 |
838 // Verify that the expected error page is being displayed. | 684 // Verify that the expected error page is being displayed. Do this by making |
839 ExpectDisplayingLocalErrorPage(browser(), net::ERR_NAME_NOT_RESOLVED); | 685 // sure the original error code (ERR_NAME_NOT_RESOLVED) is displayed. |
| 686 bool result = false; |
| 687 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( |
| 688 browser()->tab_strip_model()->GetActiveWebContents(), |
| 689 GetTextContentContainsStringScript("ERR_NAME_NOT_RESOLVED"), |
| 690 &result)); |
| 691 EXPECT_TRUE(result); |
840 } | 692 } |
841 | 693 |
842 // Checks that when an error occurs and a corrections fail to load, the stale | 694 // Checks that when an error occurs and a link doctor load fails, the stale |
843 // cache status of the page is correctly transferred, and we can load the | 695 // cache status of the page is correctly transferred, and we can load the |
844 // stale copy from the javascript. Most logic copied from StaleCacheStatus | 696 // stale copy from the javascript. Most logic copied from StaleCacheStatus |
845 // above. | 697 // above. |
846 IN_PROC_BROWSER_TEST_F(ErrorPageNavigationCorrectionsFailTest, | 698 IN_PROC_BROWSER_TEST_F(ErrorPageLinkDoctorFailTest, |
847 StaleCacheStatusFailedCorrections) { | 699 StaleCacheStatusFailedLinkDoctor) { |
848 ASSERT_TRUE(test_server()->Start()); | 700 ASSERT_TRUE(test_server()->Start()); |
849 // Load cache with entry with "nocache" set, to create stale | 701 // Load cache with entry with "nocache" set, to create stale |
850 // cache. | 702 // cache. |
851 GURL test_url(test_server()->GetURL("files/nocache.html")); | 703 GURL test_url(test_server()->GetURL("files/nocache.html")); |
852 NavigateToURLAndWaitForTitle(test_url, "Nocache Test Page", 1); | 704 NavigateToURLAndWaitForTitle(test_url, "Nocache Test Page", 1); |
853 | 705 |
854 // Reload same URL after forcing an error from the the network layer; | 706 // Reload same URL after forcing an error from the the network layer; |
855 // confirm that the error page is told the cached copy exists. | 707 // confirm that the error page is told the cached copy exists. |
856 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter = | 708 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter = |
857 browser()->profile()->GetRequestContext(); | 709 browser()->profile()->GetRequestContext(); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 }; | 771 }; |
920 | 772 |
921 const char ErrorPageForIDNTest::kHostname[] = | 773 const char ErrorPageForIDNTest::kHostname[] = |
922 "xn--d1abbgf6aiiy.xn--p1ai"; | 774 "xn--d1abbgf6aiiy.xn--p1ai"; |
923 const char ErrorPageForIDNTest::kHostnameJSUnicode[] = | 775 const char ErrorPageForIDNTest::kHostnameJSUnicode[] = |
924 "\\u043f\\u0440\\u0435\\u0437\\u0438\\u0434\\u0435\\u043d\\u0442." | 776 "\\u043f\\u0440\\u0435\\u0437\\u0438\\u0434\\u0435\\u043d\\u0442." |
925 "\\u0440\\u0444"; | 777 "\\u0440\\u0444"; |
926 | 778 |
927 // Make sure error page shows correct unicode for IDN. | 779 // Make sure error page shows correct unicode for IDN. |
928 IN_PROC_BROWSER_TEST_F(ErrorPageForIDNTest, IDN) { | 780 IN_PROC_BROWSER_TEST_F(ErrorPageForIDNTest, IDN) { |
929 // ERR_UNSAFE_PORT will not trigger navigation corrections. | 781 // ERR_UNSAFE_PORT will not trigger the link doctor. |
930 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 782 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
931 browser(), | 783 browser(), |
932 URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT, | 784 URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT, |
933 kHostname), | 785 kHostname), |
934 1); | 786 1); |
935 | 787 |
936 ToggleHelpBox(browser()); | 788 bool result = false; |
937 EXPECT_TRUE(IsDisplayingText(browser(), kHostnameJSUnicode)); | 789 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( |
| 790 browser()->tab_strip_model()->GetActiveWebContents(), |
| 791 GetTextContentContainsStringScript(kHostnameJSUnicode), |
| 792 &result)); |
| 793 EXPECT_TRUE(result); |
938 } | 794 } |
939 | 795 |
940 } // namespace | 796 } // namespace |
OLD | NEW |