| Index: chrome/browser/crash_recovery_browsertest.cc
|
| diff --git a/chrome/browser/crash_recovery_browsertest.cc b/chrome/browser/crash_recovery_browsertest.cc
|
| index fcde2cb825f748de6fb31e2cb43ceecc3d4161cd..e22d840b84ade57451492505b6b84b83fa58cfa9 100644
|
| --- a/chrome/browser/crash_recovery_browsertest.cc
|
| +++ b/chrome/browser/crash_recovery_browsertest.cc
|
| @@ -3,6 +3,7 @@
|
| // found in the LICENSE file.
|
|
|
| #include "base/files/file_path.h"
|
| +#include "base/strings/stringprintf.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_commands.h"
|
| #include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| @@ -13,6 +14,9 @@
|
| #include "content/public/browser/notification_types.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/common/page_transition_types.h"
|
| +#include "net/test/embedded_test_server/embedded_test_server.h"
|
| +#include "net/test/embedded_test_server/http_request.h"
|
| +#include "net/test/embedded_test_server/http_response.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| using content::NavigationController;
|
| @@ -31,6 +35,32 @@ void SimulateRendererCrash(Browser* browser) {
|
| observer.Wait();
|
| }
|
|
|
| +// A request handler which returns a different result each time but stays fresh
|
| +// into the far future.
|
| +class CacheMaxAgeHandler {
|
| + public:
|
| + explicit CacheMaxAgeHandler(const std::string& path)
|
| + : path_(path), request_count_(0) { }
|
| +
|
| + scoped_ptr<net::test_server::HttpResponse> HandleRequest(
|
| + const net::test_server::HttpRequest& request) {
|
| + if (request.relative_url != path_)
|
| + return scoped_ptr<net::test_server::HttpResponse>();
|
| +
|
| + request_count_++;
|
| + scoped_ptr<net::test_server::BasicHttpResponse> response(
|
| + new net::test_server::BasicHttpResponse);
|
| + response->set_content(base::StringPrintf("<title>%d</title>",
|
| + request_count_));
|
| + response->set_content_type("text/html");
|
| + response->AddCustomHeader("Cache-Control", "max-age=99999");
|
| + return response.PassAs<net::test_server::HttpResponse>();
|
| + }
|
| + private:
|
| + std::string path_;
|
| + int request_count_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| class CrashRecoveryBrowserTest : public InProcessBrowserTest {
|
| @@ -62,6 +92,37 @@ IN_PROC_BROWSER_TEST_F(CrashRecoveryBrowserTest, Reload) {
|
| EXPECT_NE(title_before_crash, title_after_crash);
|
| }
|
|
|
| +// Test that reload after a crash forces a cache revalidation.
|
| +IN_PROC_BROWSER_TEST_F(CrashRecoveryBrowserTest, ReloadCacheRevalidate) {
|
| + const char kTestPath[] = "/test";
|
| +
|
| + // Use the test server so as not to bypass cache behavior. The title of the
|
| + // active tab should change only when this URL is reloaded.
|
| + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
|
| + embedded_test_server()->RegisterRequestHandler(
|
| + base::Bind(&CacheMaxAgeHandler::HandleRequest,
|
| + base::Owned(new CacheMaxAgeHandler(kTestPath))));
|
| + ui_test_utils::NavigateToURL(browser(),
|
| + embedded_test_server()->GetURL(kTestPath));
|
| +
|
| + base::string16 title_before_crash;
|
| + base::string16 title_after_crash;
|
| +
|
| + ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(),
|
| + &title_before_crash));
|
| + SimulateRendererCrash(browser());
|
| + content::WindowedNotificationObserver observer(
|
| + content::NOTIFICATION_LOAD_STOP,
|
| + content::Source<NavigationController>(
|
| + &browser()->tab_strip_model()->GetActiveWebContents()->
|
| + GetController()));
|
| + chrome::Reload(browser(), CURRENT_TAB);
|
| + observer.Wait();
|
| + ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(),
|
| + &title_after_crash));
|
| + EXPECT_NE(title_before_crash, title_after_crash);
|
| +}
|
| +
|
| // Tests that loading a crashed page in a new tab correctly updates the title.
|
| // There was an earlier bug (1270510) in process-per-site in which the max page
|
| // ID of the RenderProcessHost was stale, so the NavigationEntry in the new tab
|
|
|