summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/app_controller_mac.mm3
-rw-r--r--chrome/browser/sessions/better_session_restore_browsertest.cc129
-rw-r--r--chrome/browser/sessions/session_service_factory.cc18
-rw-r--r--chrome/browser/sessions/session_service_factory.h8
-rw-r--r--chrome/browser/ui/browser_commands.cc3
-rw-r--r--chrome/browser/ui/startup/startup_browser_creator_impl.cc3
6 files changed, 142 insertions, 22 deletions
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index ed1640f..881bc06 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -1100,7 +1100,8 @@ class AppControllerProfileObserver : public ProfileInfoCacheObserver {
doneOnce = YES;
if (base::mac::WasLaunchedAsHiddenLoginItem()) {
SessionService* sessionService =
- SessionServiceFactory::GetForProfile([self lastProfile]);
+ SessionServiceFactory::GetForProfileForSessionRestore(
+ [self lastProfile]);
if (sessionService &&
sessionService->RestoreIfNecessary(std::vector<GURL>()))
return NO;
diff --git a/chrome/browser/sessions/better_session_restore_browsertest.cc b/chrome/browser/sessions/better_session_restore_browsertest.cc
index ad68c95..40c6103 100644
--- a/chrome/browser/sessions/better_session_restore_browsertest.cc
+++ b/chrome/browser/sessions/better_session_restore_browsertest.cc
@@ -303,11 +303,14 @@ class BetterSessionRestoreTest : public InProcessBrowserTest {
}
}
- void CloseBrowserSynchronously(Browser* browser) {
+ void CloseBrowserSynchronously(Browser* browser, bool close_all_windows) {
content::WindowedNotificationObserver observer(
chrome::NOTIFICATION_BROWSER_CLOSED,
content::NotificationService::AllSources());
- browser->window()->Close();
+ if (close_all_windows)
+ chrome::CloseAllBrowsers();
+ else
+ 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
@@ -317,12 +320,19 @@ class BetterSessionRestoreTest : public InProcessBrowserTest {
observer.Wait();
}
- virtual Browser* QuitBrowserAndRestore(Browser* browser) {
+ virtual Browser* QuitBrowserAndRestore(Browser* browser,
+ bool close_all_windows) {
Profile* profile = browser->profile();
// Close the browser.
chrome::StartKeepAlive();
- CloseBrowserSynchronously(browser);
+ CloseBrowserSynchronously(browser, close_all_windows);
+
+ SessionServiceTestHelper helper;
+ helper.SetService(
+ SessionServiceFactory::GetForProfileForSessionRestore(profile));
+ helper.SetForceBrowserNotAliveWithNoWindows(true);
+ helper.ReleaseService();
// Create a new window, which should trigger session restore.
ui_test_utils::BrowserAddedObserver window_observer;
@@ -375,12 +385,13 @@ class ContinueWhereILeftOffTest : public BetterSessionRestoreTest {
}
protected:
- virtual Browser* QuitBrowserAndRestore(Browser* browser) OVERRIDE {
+ virtual Browser* QuitBrowserAndRestore(Browser* browser,
+ bool close_all_windows) OVERRIDE {
content::WindowedNotificationObserver session_restore_observer(
chrome::NOTIFICATION_SESSION_RESTORE_DONE,
content::NotificationService::AllSources());
- Browser* new_browser =
- BetterSessionRestoreTest::QuitBrowserAndRestore(browser);
+ Browser* new_browser = BetterSessionRestoreTest::QuitBrowserAndRestore(
+ browser, close_all_windows);
session_restore_observer.Wait();
return new_browser;
}
@@ -465,7 +476,7 @@ 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());
+ Browser* new_browser = QuitBrowserAndRestore(browser(), false);
// The browsing session will be continued; just wait for the page to reload
// and check the stored data.
CheckReloadedPageRestored(new_browser);
@@ -475,18 +486,18 @@ IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
CookiesClearedOnBrowserClose) {
StoreDataWithPage("cookies.html");
// Normally cookies are restored.
- Browser* new_browser = QuitBrowserAndRestore(browser());
+ Browser* new_browser = QuitBrowserAndRestore(browser(), false);
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);
+ new_browser = QuitBrowserAndRestore(new_browser, false);
CheckReloadedPageRestored(new_browser);
DisableBackgroundMode();
- new_browser = QuitBrowserAndRestore(new_browser);
+ new_browser = QuitBrowserAndRestore(new_browser, false);
if (browser_defaults::kBrowserAliveWithNoWindows)
CheckReloadedPageRestored(new_browser);
else
@@ -495,14 +506,64 @@ IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, PostBrowserClose) {
PostFormWithPage("post.html", false);
- Browser* new_browser = QuitBrowserAndRestore(browser());
+ Browser* new_browser = QuitBrowserAndRestore(browser(), false);
CheckFormRestored(new_browser, true, false);
}
IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
PostWithPasswordBrowserClose) {
PostFormWithPage("post_with_password.html", true);
- Browser* new_browser = QuitBrowserAndRestore(browser());
+ Browser* new_browser = QuitBrowserAndRestore(browser(), false);
+ CheckReloadedPageRestored(new_browser);
+ // The form data contained passwords, so it's removed completely.
+ CheckFormRestored(new_browser, false, false);
+}
+
+// Check that session cookies are cleared on a wrench menu quit.
+IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
+ SessionCookiesCloseAllBrowsers) {
+ // 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(), true);
+ // The browsing session will be continued; just wait for the page to reload
+ // and check the stored data.
+ CheckReloadedPageRestored(new_browser);
+}
+
+// Check that cookies are cleared on a wrench menu quit only if cookies are set
+// to current session only, regardless of whether background mode is enabled.
+IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
+ CookiesClearedOnCloseAllBrowsers) {
+ StoreDataWithPage("cookies.html");
+ // Normally cookies are restored.
+ Browser* new_browser = QuitBrowserAndRestore(browser(), true);
+ 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);
+ // ... even if background mode is active.
+ EnableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser, true);
+ CheckReloadedPageNotRestored(new_browser);
+
+ DisableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser, true);
+ CheckReloadedPageNotRestored(new_browser);
+}
+
+// Check that form data is restored after wrench menu quit.
+IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, PostCloseAllBrowsers) {
+ PostFormWithPage("post.html", false);
+ Browser* new_browser = QuitBrowserAndRestore(browser(), true);
+ CheckFormRestored(new_browser, true, false);
+}
+
+// Check that form data with a password field is cleared after wrench menu quit.
+IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
+ PostWithPasswordCloseAllBrowsers) {
+ PostFormWithPage("post_with_password.html", true);
+ Browser* new_browser = QuitBrowserAndRestore(browser(), true);
CheckReloadedPageRestored(new_browser);
// The form data contained passwords, so it's removed completely.
CheckFormRestored(new_browser, false, false);
@@ -682,10 +743,10 @@ IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, CookiesClearedOnExit) {
IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, SessionCookiesBrowserClose) {
StoreDataWithPage("session_cookies.html");
EnableBackgroundMode();
- Browser* new_browser = QuitBrowserAndRestore(browser());
+ Browser* new_browser = QuitBrowserAndRestore(browser(), false);
NavigateAndCheckStoredData(new_browser, "session_cookies.html");
DisableBackgroundMode();
- new_browser = QuitBrowserAndRestore(new_browser);
+ new_browser = QuitBrowserAndRestore(new_browser, false);
if (browser_defaults::kBrowserAliveWithNoWindows)
NavigateAndCheckStoredData(new_browser, "session_cookies.html");
else
@@ -696,7 +757,7 @@ IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, CookiesClearedOnBrowserClose) {
StoreDataWithPage("cookies.html");
// Normally cookies are restored.
- Browser* new_browser = QuitBrowserAndRestore(browser());
+ Browser* new_browser = QuitBrowserAndRestore(browser(), false);
NavigateAndCheckStoredData(new_browser, "cookies.html");
// ... but not if the content setting is set to clear on exit.
@@ -704,12 +765,44 @@ IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, CookiesClearedOnBrowserClose) {
SetDefaultCookieSetting(CONTENT_SETTING_SESSION_ONLY);
// ... unless background mode is active.
EnableBackgroundMode();
- new_browser = QuitBrowserAndRestore(new_browser);
+ new_browser = QuitBrowserAndRestore(new_browser, false);
NavigateAndCheckStoredData(new_browser, "cookies.html");
DisableBackgroundMode();
- new_browser = QuitBrowserAndRestore(new_browser);
+ new_browser = QuitBrowserAndRestore(new_browser, false);
if (browser_defaults::kBrowserAliveWithNoWindows)
NavigateAndCheckStoredData(new_browser, "cookies.html");
else
StoreDataWithPage(new_browser, "cookies.html");
}
+
+// Check that session cookies are cleared on a wrench menu quit.
+IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, SessionCookiesCloseAllBrowsers) {
+ StoreDataWithPage("session_cookies.html");
+ EnableBackgroundMode();
+ Browser* new_browser = QuitBrowserAndRestore(browser(), true);
+ StoreDataWithPage(new_browser, "session_cookies.html");
+ DisableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser, true);
+ StoreDataWithPage(new_browser, "session_cookies.html");
+}
+
+// Check that cookies are cleared on a wrench menu quit only if cookies are set
+// to current session only, regardless of whether background mode is enabled.
+IN_PROC_BROWSER_TEST_F(NoSessionRestoreTest, CookiesClearedOnCloseAllBrowsers) {
+ StoreDataWithPage("cookies.html");
+
+ // Normally cookies are restored.
+ Browser* new_browser = QuitBrowserAndRestore(browser(), true);
+ 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);
+ // ... even if background mode is active.
+ EnableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser, true);
+ StoreDataWithPage(new_browser, "cookies.html");
+ DisableBackgroundMode();
+ new_browser = QuitBrowserAndRestore(new_browser, true);
+ StoreDataWithPage(new_browser, "cookies.html");
+}
diff --git a/chrome/browser/sessions/session_service_factory.cc b/chrome/browser/sessions/session_service_factory.cc
index 7e928f9..7ab2aa6 100644
--- a/chrome/browser/sessions/session_service_factory.cc
+++ b/chrome/browser/sessions/session_service_factory.cc
@@ -4,9 +4,11 @@
#include "chrome/browser/sessions/session_service_factory.h"
+#include "base/command_line.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/session_data_deleter.h"
#include "chrome/browser/sessions/session_service.h"
+#include "chrome/common/chrome_switches.h"
#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
// static
@@ -33,6 +35,22 @@ SessionService* SessionServiceFactory::GetForProfileIfExisting(
}
// static
+SessionService* SessionServiceFactory::GetForProfileForSessionRestore(
+ Profile* profile) {
+ SessionService* service = GetForProfile(profile);
+ if (!service && !CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDisableBatchedShutdown)) {
+ SessionServiceFactory* factory = GetInstance();
+ // If the service has been shutdown, remove the reference to NULL for
+ // |profile| so GetServiceForBrowserContext will recreate it.
+ factory->BrowserContextShutdown(profile);
+ factory->BrowserContextDestroyed(profile);
+ service = GetForProfile(profile);
+ }
+ return service;
+}
+
+// static
void SessionServiceFactory::ShutdownForProfile(Profile* profile) {
DeleteSessionOnlyData(profile);
diff --git a/chrome/browser/sessions/session_service_factory.h b/chrome/browser/sessions/session_service_factory.h
index 719dc8c..5d2b31a 100644
--- a/chrome/browser/sessions/session_service_factory.h
+++ b/chrome/browser/sessions/session_service_factory.h
@@ -18,7 +18,8 @@ class SessionServiceFactory : public BrowserContextKeyedServiceFactory {
// Returns the session service for |profile|. This may return NULL. If this
// profile supports a session service (it isn't incognito), and the session
// service hasn't yet been created, this forces creation of the session
- // service.
+ // service. This returns NULL if ShutdownForProfile has been called for
+ // |profile|.
//
// This returns NULL if the profile is incognito. Callers should always check
// the return value for NULL.
@@ -30,6 +31,11 @@ class SessionServiceFactory : public BrowserContextKeyedServiceFactory {
// always check the return value for NULL.
static SessionService* GetForProfileIfExisting(Profile* profile);
+ // Returns the session service for |profile|. This is the same as
+ // GetForProfile, but will force creation of the session service even if
+ // ShutdownForProfile has been called for |profile|.
+ static SessionService* GetForProfileForSessionRestore(Profile* profile);
+
// If |profile| has a session service, it is shut down. To properly record the
// current state this forces creation of the session service, then shuts it
// down.
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index a85c936..5565f1c 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -289,7 +289,8 @@ void NewEmptyWindow(Profile* profile, HostDesktopType desktop_type) {
} else {
content::RecordAction(UserMetricsAction("NewWindow"));
SessionService* session_service =
- SessionServiceFactory::GetForProfile(profile->GetOriginalProfile());
+ SessionServiceFactory::GetForProfileForSessionRestore(
+ profile->GetOriginalProfile());
if (!session_service ||
!session_service->RestoreIfNecessary(std::vector<GURL>())) {
OpenEmptyWindow(profile->GetOriginalProfile(), desktop_type);
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
index 3df66c2..8a2b513 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -605,7 +605,8 @@ void StartupBrowserCreatorImpl::ProcessLaunchURLs(
// Chrome may have been running in the background due to an app with a
// background page being installed, or running with only an app window
// displayed.
- SessionService* service = SessionServiceFactory::GetForProfile(profile_);
+ SessionService* service =
+ SessionServiceFactory::GetForProfileForSessionRestore(profile_);
if (service && service->ShouldNewWindowStartSession()) {
// Restore the last session if any.
if (!HasPendingUncleanExit(profile_) &&