Chromium Code Reviews| Index: chrome/browser/sessions/tab_restore_service.h |
| diff --git a/chrome/browser/sessions/tab_restore_service.h b/chrome/browser/sessions/tab_restore_service.h |
| index 13d202fa9a0f7f74aa0549f934b1ad520b505c4a..c73f742ab69ae567dffc60790c3f2ca55d18f247 100644 |
| --- a/chrome/browser/sessions/tab_restore_service.h |
| +++ b/chrome/browser/sessions/tab_restore_service.h |
| @@ -6,25 +6,21 @@ |
| #define CHROME_BROWSER_SESSIONS_TAB_RESTORE_SERVICE_H_ |
| #include <list> |
| -#include <set> |
| +#include <string> |
| #include <vector> |
| -#include "base/gtest_prod_util.h" |
| -#include "base/observer_list.h" |
| +#include "base/memory/ref_counted.h" |
| #include "base/time.h" |
| -#include "chrome/browser/sessions/base_session_service.h" |
| +#include "chrome/browser/profiles/profile_keyed_service.h" |
| #include "chrome/browser/sessions/session_id.h" |
| #include "chrome/browser/sessions/session_types.h" |
| #include "content/public/browser/session_storage_namespace.h" |
| #include "webkit/glue/window_open_disposition.h" |
| -class Profile; |
| class TabRestoreServiceDelegate; |
| class TabRestoreServiceObserver; |
| -struct SessionWindow; |
| namespace content { |
| -class NavigationController; |
| class SessionStorageNamespace; |
| class WebContents; |
| } |
| @@ -40,7 +36,7 @@ class WebContents; |
| // |
| // To listen for changes to the set of entries managed by the TabRestoreService |
| // add an observer. |
| -class TabRestoreService : public BaseSessionService { |
| +class TabRestoreService : public ProfileKeyedService { |
| public: |
| // Interface used to allow the test to provide a custom time. |
| class TimeFactory { |
| @@ -126,265 +122,60 @@ class TabRestoreService : public BaseSessionService { |
| typedef std::list<Entry*> Entries; |
| - // Creates a new TabRestoreService and provides an object that provides the |
| - // current time. The TabRestoreService does not take ownership of the |
| - // |time_factory_|. |
| - TabRestoreService(Profile* profile, TimeFactory* time_factory_ = NULL); |
| - |
| virtual ~TabRestoreService(); |
| // Adds/removes an observer. TabRestoreService does not take ownership of |
| // the observer. |
| - void AddObserver(TabRestoreServiceObserver* observer); |
| - void RemoveObserver(TabRestoreServiceObserver* observer); |
| + virtual void AddObserver(TabRestoreServiceObserver* observer) = 0; |
| + virtual void RemoveObserver(TabRestoreServiceObserver* observer) = 0; |
| // Creates a Tab to represent |contents| and notifies observers the list of |
| // entries has changed. |
| - void CreateHistoricalTab(content::WebContents* contents, int index); |
| + virtual void CreateHistoricalTab(content::WebContents* contents, |
| + int index) = 0; |
| // Invoked when a browser is closing. If |delegate| is a tabbed browser with |
| // at least one tab, a Window is created, added to entries and observers are |
| // notified. |
| - void BrowserClosing(TabRestoreServiceDelegate* delegate); |
| + virtual void BrowserClosing(TabRestoreServiceDelegate* delegate) = 0; |
| // Invoked when the browser is done closing. |
| - void BrowserClosed(TabRestoreServiceDelegate* delegate); |
| + virtual void BrowserClosed(TabRestoreServiceDelegate* delegate) = 0; |
| // Removes all entries from the list and notifies observers the list |
| // of tabs has changed. |
| - void ClearEntries(); |
| + virtual void ClearEntries() = 0; |
| // Returns the entries, ordered with most recently closed entries at the |
| // front. |
| - virtual const Entries& entries() const; |
| + virtual const Entries& entries() const = 0; |
| // Restores the most recently closed entry. Does nothing if there are no |
| // entries to restore. If the most recently restored entry is a tab, it is |
| // added to |delegate|. |
| - void RestoreMostRecentEntry(TabRestoreServiceDelegate* delegate); |
| + virtual void RestoreMostRecentEntry(TabRestoreServiceDelegate* delegate) = 0; |
| // Removes the Tab with id |id| from the list and returns it; ownership is |
| // passed to the caller. |
| - Tab* RemoveTabEntryById(SessionID::id_type id); |
| + virtual Tab* RemoveTabEntryById(SessionID::id_type id) = 0; |
| // Restores an entry by id. If there is no entry with an id matching |id|, |
| // this does nothing. If |delegate| is NULL, this creates a new window for the |
| // entry. |disposition| is respected, but the attributes (tabstrip index, |
| // browser window) of the tab when it was closed will be respected if |
| // disposition is UNKNOWN. |
| - void RestoreEntryById(TabRestoreServiceDelegate* delegate, |
| - SessionID::id_type id, |
| - WindowOpenDisposition disposition); |
| + virtual void RestoreEntryById(TabRestoreServiceDelegate* delegate, |
| + SessionID::id_type id, |
| + WindowOpenDisposition disposition) = 0; |
| // Loads the tabs and previous session. This does nothing if the tabs |
| // from the previous session have already been loaded. |
| - void LoadTabsFromLastSession(); |
| + virtual void LoadTabsFromLastSession() = 0; |
| // Returns true if the tab entries have been loaded. |
| - bool IsLoaded() const; |
| - |
| - // Max number of entries we'll keep around. |
| - static const size_t kMaxEntries; |
| - |
| - // Creates and add entries to |entries| for each of the windows in |windows|. |
| - void CreateEntriesFromWindows(std::vector<SessionWindow*>* windows, |
| - std::vector<Entry*>* entries); |
| - |
| - protected: |
| - // ProfileKeyedService: |
| - virtual void Shutdown() OVERRIDE; |
| - |
| - // BaseSessionService: |
| - virtual void Save() OVERRIDE; |
| - |
| - private: |
| - friend class TabRestoreServiceTest; |
| - FRIEND_TEST_ALL_PREFIXES(TabRestoreServiceTest, PruneEntries); |
| - FRIEND_TEST_ALL_PREFIXES(TabRestoreServiceTest, PruneIsCalled); |
| - |
| - // Used to indicate what has loaded. |
| - enum LoadState { |
| - // Indicates we haven't loaded anything. |
| - NOT_LOADED = 1 << 0, |
| - |
| - // Indicates we've asked for the last sessions and tabs but haven't gotten |
| - // the result back yet. |
| - LOADING = 1 << 2, |
| - |
| - // Indicates we finished loading the last tabs (but not necessarily the |
| - // last session). |
| - LOADED_LAST_TABS = 1 << 3, |
| - |
| - // Indicates we finished loading the last session (but not necessarily the |
| - // last tabs). |
| - LOADED_LAST_SESSION = 1 << 4 |
| - }; |
| - |
| - // Populates the tab's navigations from the NavigationController, and its |
| - // browser_id and pinned state from the browser. |
| - void PopulateTab(Tab* tab, |
| - int index, |
| - TabRestoreServiceDelegate* delegate, |
| - content::NavigationController* controller); |
| - |
| - // Notifies observers the tabs have changed. |
| - void NotifyTabsChanged(); |
| - |
| - // Adds |entry| to the list of entries and takes ownership. If |prune| is true |
| - // |PruneAndNotify| is invoked. If |to_front| is true the entry is added to |
| - // the front, otherwise the back. Normal closes go to the front, but |
| - // tab/window closes from the previous session are added to the back. |
| - void AddEntry(Entry* entry, bool prune, bool to_front); |
| - |
| - // Prunes entries_ to contain only kMaxEntries, and removes uninteresting |
| - // entries. |
| - void PruneEntries(); |
| - |
| - // Returns an iterator into entries_ whose id matches |id|. If |id| identifies |
| - // a Window, then its iterator position will be returned. If it identifies a |
| - // tab, then the iterator position of the Window in which the Tab resides is |
| - // returned. |
| - Entries::iterator GetEntryIteratorById(SessionID::id_type id); |
| - |
| - // Schedules the commands for a window close. |
| - void ScheduleCommandsForWindow(const Window& window); |
| - |
| - // Schedules the commands for a tab close. |selected_index| gives the |
| - // index of the selected navigation. |
| - void ScheduleCommandsForTab(const Tab& tab, int selected_index); |
| - |
| - // Creates a window close command. |
| - SessionCommand* CreateWindowCommand(SessionID::id_type id, |
| - int selected_tab_index, |
| - int num_tabs, |
| - base::Time timestamp); |
| - |
| - // Creates a tab close command. |
| - SessionCommand* CreateSelectedNavigationInTabCommand( |
| - SessionID::id_type tab_id, |
| - int32 index, |
| - base::Time timestamp); |
| - |
| - // Creates a restore command. |
| - SessionCommand* CreateRestoredEntryCommand(SessionID::id_type entry_id); |
| - |
| - // Returns the index to persist as the selected index. This is the same |
| - // as |tab.current_navigation_index| unless the entry at |
| - // |tab.current_navigation_index| shouldn't be persisted. Returns -1 if |
| - // no valid navigation to persist. |
| - int GetSelectedNavigationIndexToPersist(const Tab& tab); |
| - |
| - // Invoked when we've loaded the session commands that identify the |
| - // previously closed tabs. This creates entries, adds them to |
| - // staging_entries_, and invokes LoadState. |
| - void OnGotLastSessionCommands( |
| - Handle handle, |
| - scoped_refptr<InternalGetCommandsRequest> request); |
| - |
| - // Populates |loaded_entries| with Entries from |request|. |
| - void CreateEntriesFromCommands( |
| - scoped_refptr<InternalGetCommandsRequest> request, |
| - std::vector<Entry*>* loaded_entries); |
| - |
| - // This is a helper function for RestoreEntryById() for restoring a single |
| - // tab. If |delegate| is NULL, this creates a new window for the entry. This |
| - // returns the TabRestoreServiceDelegate into which the tab was restored. |
| - // |disposition| will be respected, but if it is UNKNOWN then the tab's |
| - // original attributes will be respected instead. |
| - TabRestoreServiceDelegate* RestoreTab(const Tab& tab, |
| - TabRestoreServiceDelegate* delegate, |
| - WindowOpenDisposition disposition); |
| - |
| - // Returns true if |tab| has more than one navigation. If |tab| has more |
| - // than one navigation |tab->current_navigation_index| is constrained based |
| - // on the number of navigations. |
| - static bool ValidateTab(Tab* tab); |
| - |
| - // Validates all the tabs in a window, plus the window's active tab index. |
| - static bool ValidateWindow(Window* window); |
| - |
| - // Calls either ValidateTab or ValidateWindow as appropriate. |
| - static bool ValidateEntry(Entry* entry); |
| - |
| - // Returns true if |tab| is one we care about restoring. |
| - static bool IsTabInteresting(const Tab* tab); |
| - |
| - // Checks whether |window| is interesting --- if it only contains a single, |
| - // uninteresting tab, it's not interesting. |
| - static bool IsWindowInteresting(const Window* window); |
| - |
| - // Validates and checks |entry| for interesting. |
| - static bool FilterEntry(Entry* entry); |
| - |
| - // Validates all entries in |entries|, deleting any with no navigations. |
| - // This also deletes any entries beyond the max number of entries we can |
| - // hold. |
| - void ValidateAndDeleteEmptyEntries(std::vector<Entry*>* entries); |
| - |
| - // Finds tab entries with the old browser_id and sets it to the new one. |
| - void UpdateTabBrowserIDs(SessionID::id_type old_id, |
| - SessionID::id_type new_id); |
| - |
| - // Callback from SessionService when we've received the windows from the |
| - // previous session. This creates and add entries to |staging_entries_| |
| - // and invokes LoadStateChanged. |ignored_active_window| is ignored because |
| - // we don't need to restore activation. |
| - void OnGotPreviousSession(Handle handle, |
| - std::vector<SessionWindow*>* windows, |
| - SessionID::id_type ignored_active_window); |
| - |
| - // Converts a SessionWindow into a Window, returning true on success. We use 0 |
| - // as the timestamp here since we do not know when the window/tab was closed. |
| - bool ConvertSessionWindowToWindow( |
| - SessionWindow* session_window, |
| - Window* window); |
| - |
| - // Invoked when previous tabs or session is loaded. If both have finished |
| - // loading the entries in staging_entries_ are added to entries_ and |
| - // observers are notified. |
| - void LoadStateChanged(); |
| - |
| - // Gets the current time. This uses the time_factory_ if there is one. |
| - base::Time TimeNow() const; |
| - |
| - // Set of entries. They are ordered from most to least recent. |
| - Entries entries_; |
| - |
| - // Whether we've loaded the last session. |
| - int load_state_; |
| - |
| - // Are we restoring a tab? If this is true we ignore requests to create a |
| - // historical tab. |
| - bool restoring_; |
| - |
| - // The number of entries to write. |
| - int entries_to_write_; |
| - |
| - // Number of entries we've written. |
| - int entries_written_; |
| - |
| - ObserverList<TabRestoreServiceObserver> observer_list_; |
| - |
| - // Set of delegates that we've received a BrowserClosing method for but no |
| - // corresponding BrowserClosed. We cache the set of delegates closing to |
| - // avoid creating historical tabs for them. |
| - std::set<TabRestoreServiceDelegate*> closing_delegates_; |
| - |
| - // Used when loading open tabs/session when recovering from a crash. |
| - CancelableRequestConsumer crash_consumer_; |
| - |
| - // Used when loading previous tabs/session. |
| - CancelableRequestConsumer load_consumer_; |
| - |
| - // Results from previously closed tabs/sessions is first added here. When |
| - // the results from both us and the session restore service have finished |
| - // loading LoadStateChanged is invoked, which adds these entries to |
| - // entries_. |
| - std::vector<Entry*> staging_entries_; |
| - |
| - TimeFactory* time_factory_; |
| + virtual bool IsLoaded() const = 0; |
| - DISALLOW_COPY_AND_ASSIGN(TabRestoreService); |
| + virtual void DeleteLastSession() = 0; |
|
sky
2012/10/22 13:51:35
Add a comment.
Philippe
2012/10/23 15:07:36
Done. Let me know if you have a more useful commen
|
| }; |
| #endif // CHROME_BROWSER_SESSIONS_TAB_RESTORE_SERVICE_H_ |