summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sessions/better_session_restore_browsertest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sessions/better_session_restore_browsertest.cc')
-rw-r--r--chrome/browser/sessions/better_session_restore_browsertest.cc187
1 files changed, 185 insertions, 2 deletions
diff --git a/chrome/browser/sessions/better_session_restore_browsertest.cc b/chrome/browser/sessions/better_session_restore_browsertest.cc
index 11ea512..ad68c95 100644
--- a/chrome/browser/sessions/better_session_restore_browsertest.cc
+++ b/chrome/browser/sessions/better_session_restore_browsertest.cc
@@ -9,16 +9,21 @@
#include "base/path_service.h"
#include "base/prefs/pref_service.h"
#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/background/background_mode_manager.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/content_settings/cookie_settings.h"
+#include "chrome/browser/defaults.h"
#include "chrome/browser/infobars/confirm_infobar_delegate.h"
#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_impl.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/sessions/session_backend.h"
#include "chrome/browser/sessions/session_service_factory.h"
+#include "chrome/browser/sessions/session_service_test_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_iterator.h"
@@ -41,6 +46,10 @@
#include "net/url_request/url_request_filter.h"
#include "net/url_request/url_request_test_job.h"
+#if defined(OS_MACOSX)
+#include "base/mac/scoped_nsautorelease_pool.h"
+#endif
+
namespace {
Browser* FindOneOtherBrowserForProfile(Profile* profile,
@@ -97,6 +106,27 @@ net::URLRequestJob* URLRequestFakerForPostRequests(
true);
}
+class FakeBackgroundModeManager : public BackgroundModeManager {
+ public:
+ FakeBackgroundModeManager()
+ : BackgroundModeManager(
+ CommandLine::ForCurrentProcess(),
+ &g_browser_process->profile_manager()->GetProfileInfoCache()),
+ background_mode_active_(false) {}
+
+ void SetBackgroundModeActive(bool active) {
+ background_mode_active_ = active;
+ }
+
+ virtual bool IsBackgroundModeActive() OVERRIDE {
+ return background_mode_active_;
+ }
+
+ private:
+ bool background_mode_active_;
+
+};
+
} // namespace
class BetterSessionRestoreTest : public InProcessBrowserTest {
@@ -138,6 +168,15 @@ class BetterSessionRestoreTest : public InProcessBrowserTest {
}
protected:
+ virtual void SetUpOnMainThread() OVERRIDE {
+ SessionServiceTestHelper helper(
+ SessionServiceFactory::GetForProfile(browser()->profile()));
+ helper.SetForceBrowserNotAliveWithNoWindows(true);
+ helper.ReleaseService();
+ g_browser_process->set_background_mode_manager_for_test(
+ scoped_ptr<BackgroundModeManager>(new FakeBackgroundModeManager));
+ }
+
void StoreDataWithPage(const std::string& filename) {
StoreDataWithPage(browser(), filename);
}
@@ -184,7 +223,11 @@ class BetterSessionRestoreTest : public InProcessBrowserTest {
}
void CheckReloadedPageNotRestored() {
- CheckTitle(browser(), title_storing_);
+ CheckReloadedPageNotRestored(browser());
+ }
+
+ void CheckReloadedPageNotRestored(Browser* browser) {
+ CheckTitle(browser, title_storing_);
}
void CheckTitle(Browser* browser, const string16& expected_title) {
@@ -230,7 +273,12 @@ class BetterSessionRestoreTest : public InProcessBrowserTest {
}
void CheckFormRestored(bool text_present, bool password_present) {
- CheckReloadedPageRestored();
+ CheckFormRestored(browser(), text_present, password_present);
+ }
+
+ void CheckFormRestored(
+ Browser* browser, bool text_present, bool password_present) {
+ CheckReloadedPageRestored(browser);
if (text_present) {
EXPECT_TRUE(g_last_upload_bytes.Get().find("posted-text") !=
std::string::npos);
@@ -255,6 +303,36 @@ class BetterSessionRestoreTest : public InProcessBrowserTest {
}
}
+ void CloseBrowserSynchronously(Browser* browser) {
+ content::WindowedNotificationObserver observer(
+ chrome::NOTIFICATION_BROWSER_CLOSED,
+ content::NotificationService::AllSources());
+ browser->window()->Close();
+#if defined(OS_MACOSX)
+ // BrowserWindowController depends on the auto release pool being recycled
+ // in the message loop to delete itself, which frees the Browser object
+ // which fires this event.
+ AutoreleasePool()->Recycle();
+#endif
+ observer.Wait();
+ }
+
+ virtual Browser* QuitBrowserAndRestore(Browser* browser) {
+ Profile* profile = browser->profile();
+
+ // Close the browser.
+ chrome::StartKeepAlive();
+ CloseBrowserSynchronously(browser);
+
+ // Create a new window, which should trigger session restore.
+ ui_test_utils::BrowserAddedObserver window_observer;
+ chrome::NewEmptyWindow(profile, chrome::HOST_DESKTOP_TYPE_NATIVE);
+ Browser* new_browser = window_observer.WaitForSingleNewBrowser();
+ chrome::EndKeepAlive();
+
+ return new_browser;
+ }
+
std::string fake_server_address() {
return fake_server_address_;
}
@@ -263,6 +341,18 @@ class BetterSessionRestoreTest : public InProcessBrowserTest {
return test_path_;
}
+ void EnableBackgroundMode() {
+ static_cast<FakeBackgroundModeManager*>(
+ g_browser_process->background_mode_manager())->
+ SetBackgroundModeActive(true);
+ }
+
+ void DisableBackgroundMode() {
+ static_cast<FakeBackgroundModeManager*>(
+ g_browser_process->background_mode_manager())->
+ SetBackgroundModeActive(false);
+ }
+
private:
const std::string fake_server_address_;
const std::string test_path_;
@@ -284,6 +374,17 @@ class ContinueWhereILeftOffTest : public BetterSessionRestoreTest {
browser()->profile(), SessionStartupPref(SessionStartupPref::LAST));
}
+ protected:
+ virtual Browser* QuitBrowserAndRestore(Browser* browser) OVERRIDE {
+ content::WindowedNotificationObserver session_restore_observer(
+ chrome::NOTIFICATION_SESSION_RESTORE_DONE,
+ content::NotificationService::AllSources());
+ Browser* new_browser =
+ BetterSessionRestoreTest::QuitBrowserAndRestore(browser);
+ session_restore_observer.Wait();
+ return new_browser;
+ }
+
DISALLOW_COPY_AND_ASSIGN(ContinueWhereILeftOffTest);
};
@@ -360,6 +461,53 @@ IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, PostWithPassword) {
CheckFormRestored(false, false);
}
+IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, SessionCookiesBrowserClose) {
+ // Set the startup preference to "continue where I left off" and visit a page
+ // which stores a session cookie.
+ StoreDataWithPage("session_cookies.html");
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+ // The browsing session will be continued; just wait for the page to reload
+ // and check the stored data.
+ CheckReloadedPageRestored(new_browser);
+}
+
+IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
+ CookiesClearedOnBrowserClose) {
+ StoreDataWithPage("cookies.html");
+ // Normally cookies are restored.
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+ CheckReloadedPageRestored(new_browser);
+ // ... but not if the content setting is set to clear on exit.
+ CookieSettings::Factory::GetForProfile(new_browser->profile())->
+ SetDefaultCookieSetting(CONTENT_SETTING_SESSION_ONLY);
+ // ... unless background mode is active.
+ EnableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser);
+ CheckReloadedPageRestored(new_browser);
+
+ DisableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser);
+ if (browser_defaults::kBrowserAliveWithNoWindows)
+ CheckReloadedPageRestored(new_browser);
+ else
+ CheckReloadedPageNotRestored(new_browser);
+}
+
+IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, PostBrowserClose) {
+ PostFormWithPage("post.html", false);
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+ CheckFormRestored(new_browser, true, false);
+}
+
+IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
+ PostWithPasswordBrowserClose) {
+ PostFormWithPage("post_with_password.html", true);
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+ CheckReloadedPageRestored(new_browser);
+ // The form data contained passwords, so it's removed completely.
+ CheckFormRestored(new_browser, false, false);
+}
+
class RestartTest : public BetterSessionRestoreTest {
public:
RestartTest() { }
@@ -530,3 +678,38 @@ IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, CookiesClearedOnExit) {
web_contents->GetURL().spec());
StoreDataWithPage("local_storage.html");
}
+
+IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, SessionCookiesBrowserClose) {
+ StoreDataWithPage("session_cookies.html");
+ EnableBackgroundMode();
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+ NavigateAndCheckStoredData(new_browser, "session_cookies.html");
+ DisableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser);
+ if (browser_defaults::kBrowserAliveWithNoWindows)
+ NavigateAndCheckStoredData(new_browser, "session_cookies.html");
+ else
+ StoreDataWithPage(new_browser, "session_cookies.html");
+}
+
+IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, CookiesClearedOnBrowserClose) {
+ StoreDataWithPage("cookies.html");
+
+ // Normally cookies are restored.
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+ NavigateAndCheckStoredData(new_browser, "cookies.html");
+
+ // ... but not if the content setting is set to clear on exit.
+ CookieSettings::Factory::GetForProfile(new_browser->profile())->
+ SetDefaultCookieSetting(CONTENT_SETTING_SESSION_ONLY);
+ // ... unless background mode is active.
+ EnableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser);
+ NavigateAndCheckStoredData(new_browser, "cookies.html");
+ DisableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser);
+ if (browser_defaults::kBrowserAliveWithNoWindows)
+ NavigateAndCheckStoredData(new_browser, "cookies.html");
+ else
+ StoreDataWithPage(new_browser, "cookies.html");
+}