Index: chrome/browser/sync/glue/synced_session_tracker.h |
diff --git a/chrome/browser/sync/glue/synced_session_tracker.h b/chrome/browser/sync/glue/synced_session_tracker.h |
index 5140f9000f6a48516346bc57341ce6a175dc2903..f86e2a7117703fc5a210acd188f7b5f11f44bfcd 100644 |
--- a/chrome/browser/sync/glue/synced_session_tracker.h |
+++ b/chrome/browser/sync/glue/synced_session_tracker.h |
@@ -9,6 +9,7 @@ |
#include <map> |
#include <set> |
#include <string> |
+#include <utility> |
#include <vector> |
#include "base/basictypes.h" |
@@ -55,22 +56,43 @@ class SyncedSessionTracker { |
SessionID::id_type tab_id, |
const SessionTab** tab); |
- // Returns a pointer to the SyncedSession object associated with session_tag. |
- // If none exists, creates one and returns its pointer. |
+ // Returns a pointer to the SyncedSession object associated with |
+ // |session_tag|. If none exists, creates one. |
SyncedSession* GetSession(const std::string& session_tag); |
// Deletes the session associated with |session_tag| if it exists. |
// Returns true if the session existed and was deleted, false otherwise. |
bool DeleteSession(const std::string& session_tag); |
+ // Resets the tracking information for the session specified by |session_tag|. |
+ // Once reset, all calls to GetWindow and GetTabForWindow will denote |
+ // that the requested windows and tabs are in use (by setting the boolean |
+ // in their SessionWindowWrapper/SessionTabWrapper to true). The next call to |
+ // CleanupSession(...) will delete those windows and tabs not in use. |
+ void ResetSessionTracking(const std::string& session_tag); |
+ |
+ // Deletes those windows and tabs associated with |session_tag| that are no |
+ // longer in use from memory (and removes unused windows from their |
+ // SyncedSession object). |
+ // See ResetSessionTracking(...). |
+ void CleanupSession(const std::string& session_tag); |
+ |
+ // Returns a pointer to the SessionWindow object associated with |window_id| |
+ // for the session specified with |session_tag|. If none exists, creates one. |
+ SessionWindow* GetWindow(const std::string& session_tag, |
+ SessionID::id_type window_id); |
+ |
+ // Same as GetTab, but internally notes that window |window_id| is now |
+ // holding tab |tab_id|. As a result, when CleanupSession(...) is called, |
+ // the tab will not be destroyed. |
+ SessionTab* GetTabForWindow(const std::string& session_tag, |
+ SessionID::id_type window_id, |
+ SessionID::id_type tab_id); |
+ |
// Returns a pointer to the SessionTab object associated with |tab_id| for |
- // the session specified with |session_tag|. If none exists, creates one and |
- // returns its pointer. |
- // |has_window| determines if newly created tabs are added to the pool of |
- // orphaned tabs (those which can't be reached by traversing sessions). |
- SessionTab* GetSessionTab(const std::string& session_tag, |
- SessionID::id_type tab_id, |
- bool has_window); |
+ // the session specified with |session_tag|. If none exists, creates one. |
+ SessionTab* GetTab(const std::string& session_tag, |
+ SessionID::id_type tab_id); |
// Free the memory for all dynamically allocated objects and clear the |
// tracking structures. |
@@ -95,15 +117,49 @@ class SyncedSessionTracker { |
} |
private: |
// Datatypes for accessing session data. |
- typedef std::map<SessionID::id_type, SessionTab*> IDToSessionTabMap; |
+ // Note, we pair pointers with bools so that we can track what is in use and |
+ // what can be deleted (see ResetSessionTracking(..) and CleanupSession(..) |
+ // above). |
+ struct SessionTabWrapper { |
+ SessionTabWrapper() : tab_ptr(NULL), used(false) {} |
+ SessionTabWrapper(SessionTab* tab_ptr, bool used) |
+ : tab_ptr(tab_ptr), |
+ used(used) {} |
+ SessionTab* tab_ptr; |
+ bool used; |
+ }; |
+ typedef std::map<SessionID::id_type, SessionTabWrapper> IDToSessionTabMap; |
typedef std::map<std::string, IDToSessionTabMap*> SyncedTabMap; |
+ |
+ struct SessionWindowWrapper { |
+ SessionWindowWrapper() : window_ptr(NULL), used(false) {} |
+ SessionWindowWrapper(SessionWindow* window_ptr, bool used) |
+ : window_ptr(window_ptr), |
+ used(used) {} |
+ SessionWindow* window_ptr; |
+ bool used; |
+ }; |
+ typedef std::map<SessionID::id_type, SessionWindowWrapper> |
+ IDToSessionWindowMap; |
+ typedef std::map<std::string, IDToSessionWindowMap*> SyncedWindowMap; |
+ |
typedef std::map<std::string, SyncedSession*> SyncedSessionMap; |
+ // Helper methods for deleting SessionWindows and SessionTabs. |
+ bool ClearUnusedSessionWindow(SessionWindowWrapper window_wrapper, |
+ SyncedSession* session); |
+ bool ClearUnusedSessionTab(SessionTabWrapper tab_wrapper); |
+ |
// Per client mapping of tab id's to their SessionTab objects. |
// Key: session tag. |
// Value: Tab id to SessionTab map pointer. |
SyncedTabMap synced_tab_map_; |
+ // Per client mapping of the window id's to their SessionWindow objects. |
+ // Key: session_tag |
+ // Value: Window id to SessionWindow map pointer. |
+ SyncedWindowMap synced_window_map_; |
+ |
// Per client mapping synced session objects. |
// Key: session tag. |
// Value: SyncedSession object pointer. |