| 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..74538f0c91e920a4abbdc97e7b055d499c8efedf 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,61 @@ 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);
|
| + // Deletes the last session.
|
| + virtual void DeleteLastSession() = 0;
|
| };
|
|
|
| #endif // CHROME_BROWSER_SESSIONS_TAB_RESTORE_SERVICE_H_
|
|
|