[email protected] | 871dc68 | 2012-06-11 19:35:33 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
dcheng | e73d8520c | 2015-12-27 01:19:09 | [diff] [blame] | 5 | #include <utility> |
| 6 | |
brettw | f195891 | 2015-10-07 19:43:12 | [diff] [blame] | 7 | #include "base/base_switches.h" |
[email protected] | 9c29c465 | 2014-05-22 17:33:52 | [diff] [blame] | 8 | #include "base/command_line.h" |
[email protected] | 5799981 | 2013-02-24 05:40:52 | [diff] [blame] | 9 | #include "base/files/file_path.h" |
avi | e4d7b6f | 2015-12-26 00:59:18 | [diff] [blame] | 10 | #include "base/macros.h" |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 11 | #include "base/strings/stringprintf.h" |
avi | e4d7b6f | 2015-12-26 00:59:18 | [diff] [blame] | 12 | #include "build/build_config.h" |
[email protected] | 440348f | 2010-11-16 00:30:19 | [diff] [blame] | 13 | #include "chrome/browser/ui/browser.h" |
[email protected] | a37d4b0 | 2012-06-25 21:56:10 | [diff] [blame] | 14 | #include "chrome/browser/ui/browser_commands.h" |
[email protected] | cc87237 | 2013-01-28 21:57:07 | [diff] [blame] | 15 | #include "chrome/browser/ui/tabs/tab_strip_model.h" |
[email protected] | 76543b9 | 2009-08-31 17:27:45 | [diff] [blame] | 16 | #include "chrome/common/url_constants.h" |
[email protected] | af44e7fb | 2011-07-29 18:32:32 | [diff] [blame] | 17 | #include "chrome/test/base/in_process_browser_test.h" |
| 18 | #include "chrome/test/base/ui_test_utils.h" |
[email protected] | ad50def5 | 2011-10-19 23:17:07 | [diff] [blame] | 19 | #include "content/public/browser/notification_service.h" |
[email protected] | 0d6e9bd | 2011-10-18 04:29:16 | [diff] [blame] | 20 | #include "content/public/browser/notification_types.h" |
[email protected] | 83ff91c | 2012-01-05 20:54:13 | [diff] [blame] | 21 | #include "content/public/browser/web_contents.h" |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 22 | #include "content/public/test/browser_test_utils.h" |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 23 | #include "net/test/embedded_test_server/embedded_test_server.h" |
| 24 | #include "net/test/embedded_test_server/http_request.h" |
| 25 | #include "net/test/embedded_test_server/http_response.h" |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 26 | #include "testing/gtest/include/gtest/gtest.h" |
Sylvain Defresne | c6ccc77d | 2014-09-19 10:19:35 | [diff] [blame] | 27 | #include "ui/base/page_transition_types.h" |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 28 | |
[email protected] | e5d549d | 2011-12-28 01:29:20 | [diff] [blame] | 29 | using content::OpenURLParams; |
| 30 | using content::Referrer; |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 31 | using content::WebContents; |
[email protected] | e5d549d | 2011-12-28 01:29:20 | [diff] [blame] | 32 | |
[email protected] | bc947b8 | 2014-03-18 07:29:18 | [diff] [blame] | 33 | // TODO(jam): http://crbug.com/350550 |
| 34 | #if !(defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER)) |
| 35 | |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 36 | namespace { |
| 37 | |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 38 | void SimulateRendererCrash(Browser* browser) { |
[email protected] | a7fe911 | 2012-07-20 02:34:45 | [diff] [blame] | 39 | content::WindowedNotificationObserver observer( |
[email protected] | fbc5e5f9 | 2012-01-02 06:08:32 | [diff] [blame] | 40 | content::NOTIFICATION_WEB_CONTENTS_DISCONNECTED, |
[email protected] | ad50def5 | 2011-10-19 23:17:07 | [diff] [blame] | 41 | content::NotificationService::AllSources()); |
nick | 3b04f32 | 2016-08-31 19:29:19 | [diff] [blame^] | 42 | browser->OpenURL(OpenURLParams(GURL(content::kChromeUICrashURL), Referrer(), |
| 43 | WindowOpenDisposition::CURRENT_TAB, |
| 44 | ui::PAGE_TRANSITION_TYPED, false)); |
[email protected] | 6b4e8e4 | 2011-08-17 19:36:06 | [diff] [blame] | 45 | observer.Wait(); |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 46 | } |
| 47 | |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 48 | // A request handler which returns a different result each time but stays fresh |
| 49 | // into the far future. |
| 50 | class CacheMaxAgeHandler { |
| 51 | public: |
| 52 | explicit CacheMaxAgeHandler(const std::string& path) |
| 53 | : path_(path), request_count_(0) { } |
| 54 | |
dcheng | 4af4858 | 2016-04-19 00:29:35 | [diff] [blame] | 55 | std::unique_ptr<net::test_server::HttpResponse> HandleRequest( |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 56 | const net::test_server::HttpRequest& request) { |
| 57 | if (request.relative_url != path_) |
dcheng | 4af4858 | 2016-04-19 00:29:35 | [diff] [blame] | 58 | return std::unique_ptr<net::test_server::HttpResponse>(); |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 59 | |
| 60 | request_count_++; |
dcheng | 4af4858 | 2016-04-19 00:29:35 | [diff] [blame] | 61 | std::unique_ptr<net::test_server::BasicHttpResponse> response( |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 62 | new net::test_server::BasicHttpResponse); |
| 63 | response->set_content(base::StringPrintf("<title>%d</title>", |
| 64 | request_count_)); |
| 65 | response->set_content_type("text/html"); |
| 66 | response->AddCustomHeader("Cache-Control", "max-age=99999"); |
dcheng | e73d8520c | 2015-12-27 01:19:09 | [diff] [blame] | 67 | return std::move(response); |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 68 | } |
| 69 | private: |
| 70 | std::string path_; |
| 71 | int request_count_; |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 72 | |
[email protected] | 9c29c465 | 2014-05-22 17:33:52 | [diff] [blame] | 73 | DISALLOW_COPY_AND_ASSIGN(CacheMaxAgeHandler); |
| 74 | }; |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 75 | |
| 76 | class CrashRecoveryBrowserTest : public InProcessBrowserTest { |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 77 | protected: |
| 78 | WebContents* GetActiveWebContents() { |
| 79 | return browser()->tab_strip_model()->GetActiveWebContents(); |
| 80 | } |
[email protected] | 9c29c465 | 2014-05-22 17:33:52 | [diff] [blame] | 81 | |
| 82 | private: |
Daniel Cheng | a542fca | 2014-10-21 09:51:29 | [diff] [blame] | 83 | void SetUpCommandLine(base::CommandLine* command_line) override { |
[email protected] | 9c29c465 | 2014-05-22 17:33:52 | [diff] [blame] | 84 | command_line->AppendSwitch(switches::kDisableBreakpad); |
| 85 | } |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 86 | }; |
| 87 | |
| 88 | // Test that reload works after a crash. |
[email protected] | 4a63e24 | 2011-12-12 15:23:08 | [diff] [blame] | 89 | // Disabled, http://crbug.com/29331 , http://crbug.com/69637 . |
[email protected] | afbfc9a | 2011-01-18 18:37:40 | [diff] [blame] | 90 | IN_PROC_BROWSER_TEST_F(CrashRecoveryBrowserTest, Reload) { |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 91 | // The title of the active tab should change each time this URL is loaded. |
| 92 | GURL url( |
| 93 | "data:text/html,<script>document.title=new Date().valueOf()</script>"); |
| 94 | ui_test_utils::NavigateToURL(browser(), url); |
| 95 | |
[email protected] | 9692015 | 2013-12-04 21:00:16 | [diff] [blame] | 96 | base::string16 title_before_crash; |
| 97 | base::string16 title_after_crash; |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 98 | |
| 99 | ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), |
| 100 | &title_before_crash)); |
| 101 | SimulateRendererCrash(browser()); |
nick | 3b04f32 | 2016-08-31 19:29:19 | [diff] [blame^] | 102 | chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 103 | content::WaitForLoadStop(GetActiveWebContents()); |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 104 | ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), |
| 105 | &title_after_crash)); |
| 106 | EXPECT_NE(title_before_crash, title_after_crash); |
| 107 | } |
| 108 | |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 109 | // Test that reload after a crash forces a cache revalidation. |
| 110 | IN_PROC_BROWSER_TEST_F(CrashRecoveryBrowserTest, ReloadCacheRevalidate) { |
| 111 | const char kTestPath[] = "/test"; |
| 112 | |
| 113 | // Use the test server so as not to bypass cache behavior. The title of the |
| 114 | // active tab should change only when this URL is reloaded. |
svaldez | a01f7d9 | 2015-11-18 17:47:56 | [diff] [blame] | 115 | ASSERT_TRUE(embedded_test_server()->Start()); |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 116 | embedded_test_server()->RegisterRequestHandler( |
| 117 | base::Bind(&CacheMaxAgeHandler::HandleRequest, |
| 118 | base::Owned(new CacheMaxAgeHandler(kTestPath)))); |
| 119 | ui_test_utils::NavigateToURL(browser(), |
| 120 | embedded_test_server()->GetURL(kTestPath)); |
| 121 | |
| 122 | base::string16 title_before_crash; |
| 123 | base::string16 title_after_crash; |
| 124 | |
| 125 | ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), |
| 126 | &title_before_crash)); |
| 127 | SimulateRendererCrash(browser()); |
nick | 3b04f32 | 2016-08-31 19:29:19 | [diff] [blame^] | 128 | chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 129 | content::WaitForLoadStop(GetActiveWebContents()); |
[email protected] | a8ff8ed | 2014-01-09 07:32:26 | [diff] [blame] | 130 | ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), |
| 131 | &title_after_crash)); |
| 132 | EXPECT_NE(title_before_crash, title_after_crash); |
| 133 | } |
| 134 | |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 135 | // Tests that loading a crashed page in a new tab correctly updates the title. |
| 136 | // There was an earlier bug (1270510) in process-per-site in which the max page |
| 137 | // ID of the RenderProcessHost was stale, so the NavigationEntry in the new tab |
| 138 | // was not committed. This prevents regression of that bug. |
[email protected] | 8285332 | 2012-11-15 18:02:27 | [diff] [blame] | 139 | IN_PROC_BROWSER_TEST_F(CrashRecoveryBrowserTest, LoadInNewTab) { |
[email protected] | 9c29c465 | 2014-05-22 17:33:52 | [diff] [blame] | 140 | const base::FilePath::CharType kTitle2File[] = |
[email protected] | 650b2d5 | 2013-02-10 03:41:45 | [diff] [blame] | 141 | FILE_PATH_LITERAL("title2.html"); |
[email protected] | 5a145436 | 2010-03-31 08:56:47 | [diff] [blame] | 142 | |
[email protected] | 650b2d5 | 2013-02-10 03:41:45 | [diff] [blame] | 143 | ui_test_utils::NavigateToURL( |
| 144 | browser(), ui_test_utils::GetTestUrl( |
| 145 | base::FilePath(base::FilePath::kCurrentDirectory), |
| 146 | base::FilePath(kTitle2File))); |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 147 | |
[email protected] | 9692015 | 2013-12-04 21:00:16 | [diff] [blame] | 148 | base::string16 title_before_crash; |
| 149 | base::string16 title_after_crash; |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 150 | |
| 151 | ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), |
| 152 | &title_before_crash)); |
| 153 | SimulateRendererCrash(browser()); |
nick | 3b04f32 | 2016-08-31 19:29:19 | [diff] [blame^] | 154 | chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 155 | content::WaitForLoadStop(GetActiveWebContents()); |
[email protected] | 3a4f703 | 2009-07-08 20:43:53 | [diff] [blame] | 156 | ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), |
| 157 | &title_after_crash)); |
| 158 | EXPECT_EQ(title_before_crash, title_after_crash); |
| 159 | } |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 160 | |
| 161 | // Tests that reloads of navigation errors behave correctly after a crash. |
| 162 | // Regression test for http://crbug.com/348918 |
| 163 | IN_PROC_BROWSER_TEST_F(CrashRecoveryBrowserTest, DoubleReloadWithError) { |
| 164 | GURL url("chrome://bogus"); |
| 165 | ui_test_utils::NavigateToURL(browser(), url); |
| 166 | ASSERT_EQ(url, GetActiveWebContents()->GetVisibleURL()); |
| 167 | |
| 168 | SimulateRendererCrash(browser()); |
| 169 | |
nick | 3b04f32 | 2016-08-31 19:29:19 | [diff] [blame^] | 170 | chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 171 | content::WaitForLoadStop(GetActiveWebContents()); |
| 172 | ASSERT_EQ(url, GetActiveWebContents()->GetVisibleURL()); |
| 173 | |
nick | 3b04f32 | 2016-08-31 19:29:19 | [diff] [blame^] | 174 | chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); |
[email protected] | 9a001bc | 2014-03-12 07:59:21 | [diff] [blame] | 175 | content::WaitForLoadStop(GetActiveWebContents()); |
| 176 | ASSERT_EQ(url, GetActiveWebContents()->GetVisibleURL()); |
| 177 | } |
[email protected] | bc947b8 | 2014-03-18 07:29:18 | [diff] [blame] | 178 | |
[email protected] | 9c29c465 | 2014-05-22 17:33:52 | [diff] [blame] | 179 | } // namespace |
| 180 | |
[email protected] | bc947b8 | 2014-03-18 07:29:18 | [diff] [blame] | 181 | #endif |