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