Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6206)

Unified Diff: chrome/browser/tab_restore_service.h

Issue 11377: Changes tab restore service to handle restoring closed windows as a... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/dom_ui/new_tab_ui.cc ('k') | chrome/browser/tab_restore_service.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/tab_restore_service.h
===================================================================
--- chrome/browser/tab_restore_service.h (revision 5928)
+++ chrome/browser/tab_restore_service.h (working copy)
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_TAB_RESTORE_SERVICE_H__
-#define CHROME_BROWSER_TAB_RESTORE_SERVICE_H__
+#ifndef CHROME_BROWSER_TAB_RESTORE_SERVICE_H_
+#define CHROME_BROWSER_TAB_RESTORE_SERVICE_H_
#include <list>
@@ -15,27 +15,23 @@
class Profile;
// TabRestoreService is responsible for maintaining the most recently closed
-// tabs. When the user closes a tab TabRestoreService::CreateHistoricalTab is
-// invoked and a HistoricalTab is created to represent the tab.
+// tabs and windows. When a tab is closed
+// TabRestoreService::CreateHistoricalTab is invoked and a Tab is created to
+// represent the tab. Similarly, when a browser is closed, BrowserClosing is
+// invoked and a Window is created to represent the window.
//
-// TabRestoreService can recreate tabs from the previous session as well.
-// LoadPreviousSessionTabs loads (asynchronously) the tabs from the previous
-// session. When done, the observer is notified.
+// To restore a tab/window from the TabRestoreService invoke RestoreEntryById
+// or RestoreMostRecentEntry.
//
-// To restore a tab from the TabRestoreService invoke AddRestoredTab on the
-// Browser you want to restore the tab to, followed by RemoveHistoricalTabById
-// to remove the tab from the restore service.
-//
-// To listen for changes to the set of tabs managed by the TabRestoreService
+// To listen for changes to the set of entries managed by the TabRestoreService
// add an observer.
-
class TabRestoreService {
public:
- // Observer is notified when the set of tabs managed by TabRestoreService
+ // Observer is notified when the set of entries managed by TabRestoreService
// changes in some way.
class Observer {
public:
- // Sent when the internal tab state changed
+ // Sent when the set of entries changes in some way.
virtual void TabRestoreServiceChanged(TabRestoreService* service) = 0;
// Sent to all remaining Observers when TabRestoreService's
@@ -43,32 +39,51 @@
virtual void TabRestoreServiceDestroyed(TabRestoreService* service) = 0;
};
- // Represents a previously open tab.
- struct HistoricalTab {
- HistoricalTab();
+ // The type of entry.
+ enum Type {
+ TAB,
+ WINDOW
+ };
- // Time the tab was closed.
- base::Time close_time;
+ struct Entry {
+ Entry();
+ explicit Entry(Type type);
+ virtual ~Entry() {}
- // If true, this is a historical session and not a closed tab.
- bool from_last_session;
+ // Unique id for this entry. The id is guaranteed to be unique for a
+ // session.
+ int id;
+ // The type of the entry.
+ Type type;
+ };
+
+ // Represents a previously open tab.
+ struct Tab : public Entry {
+ Tab() : Entry(TAB), current_navigation_index(-1) {}
+
// The navigations.
// WARNING: navigations may be empty.
std::vector<TabNavigation> navigations;
// Index of the selected navigation in navigations.
int current_navigation_index;
+ };
- // Unique id for the closed tab. This is guaranteed to be unique for
- // a session.
- const int id;
+ // Represents a previously open window.
+ struct Window : public Entry {
+ Window() : Entry(WINDOW), selected_tab_index(-1) {}
+
+ // The tabs that comprised the window, in order.
+ std::vector<Tab> tabs;
+
+ // Index of the selected tab.
+ int selected_tab_index;
};
- typedef std::list<HistoricalTab> Tabs;
+ typedef std::list<Entry*> Entries;
- // Creates a new TabRestoreService. This does not load tabs from the last
- // session, you must explicitly invoke LoadPreviousSessionTabs to do that.
+ // Creates a new TabRestoreService.
explicit TabRestoreService(Profile* profile);
~TabRestoreService();
@@ -77,70 +92,70 @@
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
- // If the previous session has not been loaded, it is loaded and the tabs
- // from it are placed at the end of the queue.
- void LoadPreviousSessionTabs();
+ // Creates a Tab to represent |tab| and notifies observers the list of
+ // entries has changed.
+ void CreateHistoricalTab(NavigationController* tab);
- // Returns true if loading the previous sessions tabs.
- bool IsLoadingPreviousSessionTabs();
+ // Invoked when a browser is closing. If |browser| is a tabbed browser with
+ // at least one tab, a Window is created, added to entries and observers are
+ // notified.
+ void BrowserClosing(Browser* browser);
- // Returns true if LoadPreviousSessionTabs will attempt to load any tabs.
- bool WillLoadPreviousSessionTabs();
+ // Invoked when the browser is done closing.
+ void BrowserClosed(Browser* browser);
- // Creates a HistoricalTab to represent the tab and notifies observers the
- // list of tabs has changed.
- void CreateHistoricalTab(NavigationController* tab);
+ // Removes all entries from the list and notifies observers the list
+ // of tabs has changed.
+ void ClearEntries();
- // Removes the HistoricalTab with the specified id and notifies observers.
- // Does nothing if id does not identify a valid historical tab id.
- void RemoveHistoricalTabById(int id);
+ // Returns the entries, ordered with most recently closed entries at the
+ // front.
+ const Entries& entries() const { return entries_; }
- // Removes all HistoricalTabs from the list and notifies observers the list
- // of tabs has changed.
- void ClearHistoricalTabs();
+ // 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 |browser|.
+ void RestoreMostRecentEntry(Browser* browser);
- // Returns the tabs, ordered with most recently closed tabs at the front.
- const Tabs& tabs() const { return tabs_; }
+ // Restores an entry by id. If there is no entry with an id matching |id|,
+ // this does nothing. If |replace_existing_tab| is true and id identifies a
+ // tab, the newly created tab replaces the selected tab in |browser|.
+ void RestoreEntryById(Browser* browser, int id, bool replace_existing_tab);
private:
- // Callback from loading the last session. As necessary adds the tabs to
- // tabs_.
- void OnGotLastSession(SessionService::Handle handle,
- std::vector<SessionWindow*>* windows);
-
- // Invoked from OnGotLastSession to add the necessary tabs from windows
- // to tabs_.
- void AddHistoricalTabs(std::vector<SessionWindow*>* windows);
-
- // Creates a HistoricalTab from the tab.
- void AppendHistoricalTabFromSessionTab(SessionTab* tab);
-
// Populates tabs->navigations from the NavigationController.
void PopulateTabFromController(NavigationController* controller,
- HistoricalTab* tab);
+ Tab* tab);
- // Populates tab->navigations from a previous sessions navigations.
- void PopulateTabFromSessionTab(SessionTab* session_tab,
- HistoricalTab* tab);
-
// Notifies observers the tabs have changed.
void NotifyTabsChanged();
+ // Prunes entries_ to contain only kMaxEntries and invokes NotifyTabsChanged.
+ void PruneAndNotify();
+
+ // Returns an iterator into entries_ whose id matches |id|.
+ Entries::iterator GetEntryIteratorById(int id);
+
Profile* profile_;
// Whether we've loaded the last session.
bool loaded_last_session_;
- // Set of tabs. We own the NavigationControllers in this list.
- Tabs tabs_;
+ // Set of entries.
+ Entries entries_;
- // Used in requesting the last session.
- CancelableRequestConsumer cancelable_consumer_;
+ // Are we restoring a tab? If this is true we ignore requests to create a
+ // historical tab.
+ bool restoring_;
ObserverList<Observer> observer_list_;
- DISALLOW_EVIL_CONSTRUCTORS(TabRestoreService);
+ // Set of tabs that we've received a BrowserClosing method for but no
+ // corresponding BrowserClosed. We cache the set of browsers closing to
+ // avoid creating historical tabs for them.
+ std::set<Browser*> closing_browsers_;
+
+ DISALLOW_COPY_AND_ASSIGN(TabRestoreService);
};
-#endif // CHROME_BROWSER_TAB_RESTORE_SERVICE_H__
-
+#endif // CHROME_BROWSER_TAB_RESTORE_SERVICE_H_
« no previous file with comments | « chrome/browser/dom_ui/new_tab_ui.cc ('k') | chrome/browser/tab_restore_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698