better_session_restore_browsertest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/session_startup_pref.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_filter.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_job.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We need to serve the test files so that PRE_Test and Test can access the same 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page using the same URL. In addition, perceived security origin of the page 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// needs to stay the same, so e.g., redirecting the URL requests doesn't 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// work. (If we used a test server, the PRE_Test and Test would have separate 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instances running on separate ports.) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<std::map<std::string, std::string> > file_contents = 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestJob* URLRequestFaker( 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new net::URLRequestTestJob( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request, network_delegate, net::URLRequestTestJob::test_headers(), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_contents.Get()[request->url().path()], true); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BetterSessionRestoreTest : public InProcessBrowserTest { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BetterSessionRestoreTest() 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : title_pass_(ASCIIToUTF16("PASS")), 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_storing_(ASCIIToUTF16("STORING")), 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_error_write_failed_(ASCIIToUTF16("ERROR_WRITE_FAILED")), 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_error_empty_(ASCIIToUTF16("ERROR_EMPTY")), 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_server_address_("http://www.test.com/"), 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_path_("session_restore/") { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the URL request filtering. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> test_files; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_files.push_back("common.js"); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_files.push_back("local_storage.html"); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_files.push_back("session_cookies.html"); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_files.push_back("session_storage.html"); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath test_file_dir; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &test_file_dir)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file_dir = 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_file_dir.AppendASCII("chrome/test/data").AppendASCII(test_path_); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = test_files.begin(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != test_files.end(); ++it) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath path = test_file_dir.AppendASCII(*it); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(file_util::ReadFileToString(path, &contents)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_contents.Get()["/" + test_path_ + *it] = contents; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlHandler( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(fake_server_address_ + test_path_ + *it), 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &URLRequestFaker); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StoreDataWithPage(const std::string& filename) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents = 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GetActiveWebContents(browser()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TitleWatcher title_watcher(web_contents, title_storing_); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_watcher.AlsoWaitForTitle(title_pass_); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_watcher.AlsoWaitForTitle(title_error_write_failed_); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_watcher.AlsoWaitForTitle(title_error_empty_); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), GURL(fake_server_address_ + test_path_ + filename)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 final_title = title_watcher.WaitAndGetTitle(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(title_storing_, final_title); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckReloadedPageRestored() { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckTitle(title_pass_); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckReloadedPageNotRestored() { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckTitle(title_storing_); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckTitle(const string16& expected_title) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents = chrome::GetWebContentsAt(browser(), 0); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_watcher.AlsoWaitForTitle(title_pass_); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_watcher.AlsoWaitForTitle(title_storing_); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_watcher.AlsoWaitForTitle(title_error_write_failed_); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_watcher.AlsoWaitForTitle(title_error_empty_); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible that the title was already the right one before 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title_watcher was created. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 first_title = web_contents->GetTitle(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (first_title != title_pass_ && 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_title != title_storing_ && 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_title != title_error_write_failed_ && 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_title != title_error_empty_) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 final_title = title_watcher.WaitAndGetTitle(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_title, final_title); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_title, first_title); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title_pass_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title_storing_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title_error_write_failed_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title_error_empty_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string fake_server_address_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_path_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BetterSessionRestoreTest); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BetterSessionRestoreTest, PRE_SessionCookies) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the startup preference to "continue where I left off" and visit a page 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which stores a session cookie. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStartupPref::SetStartupPref( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile(), SessionStartupPref(SessionStartupPref::LAST)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoreDataWithPage("session_cookies.html"); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BetterSessionRestoreTest, SessionCookies) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The browsing session will be continued; just wait for the page to reload 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and check the stored data. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckReloadedPageRestored(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BetterSessionRestoreTest, PRE_SessionStorage) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStartupPref::SetStartupPref( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile(), SessionStartupPref(SessionStartupPref::LAST)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoreDataWithPage("session_storage.html"); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BetterSessionRestoreTest, SessionStorage) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckReloadedPageRestored(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BetterSessionRestoreTest, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRE_PRE_LocalStorageClearedOnExit) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStartupPref::SetStartupPref( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile(), SessionStartupPref(SessionStartupPref::LAST)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoreDataWithPage("local_storage.html"); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BetterSessionRestoreTest, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRE_LocalStorageClearedOnExit) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normally localStorage is restored. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckReloadedPageRestored(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ... but not if it's set to clear on exit. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings::Factory::GetForProfile(browser()->profile())-> 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultCookieSetting(CONTENT_SETTING_SESSION_ONLY); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BetterSessionRestoreTest, LocalStorageClearedOnExit) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckReloadedPageNotRestored(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 177