diff options
-rw-r--r-- | chrome/browser/app_controller_mac.mm | 3 | ||||
-rw-r--r-- | chrome/browser/sessions/better_session_restore_browsertest.cc | 129 | ||||
-rw-r--r-- | chrome/browser/sessions/session_service_factory.cc | 18 | ||||
-rw-r--r-- | chrome/browser/sessions/session_service_factory.h | 8 | ||||
-rw-r--r-- | chrome/browser/ui/browser_commands.cc | 3 | ||||
-rw-r--r-- | chrome/browser/ui/startup/startup_browser_creator_impl.cc | 3 |
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_) && |