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

Side by Side 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 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 unified diff | Download patch | Annotate | Revision Log
« 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_TAB_RESTORE_SERVICE_H__ 5 #ifndef CHROME_BROWSER_TAB_RESTORE_SERVICE_H_
6 #define CHROME_BROWSER_TAB_RESTORE_SERVICE_H__ 6 #define CHROME_BROWSER_TAB_RESTORE_SERVICE_H_
7 7
8 #include <list> 8 #include <list>
9 9
10 #include "base/observer_list.h" 10 #include "base/observer_list.h"
11 #include "base/time.h" 11 #include "base/time.h"
12 #include "chrome/browser/session_service.h" 12 #include "chrome/browser/session_service.h"
13 13
14 class NavigationController; 14 class NavigationController;
15 class Profile; 15 class Profile;
16 16
17 // TabRestoreService is responsible for maintaining the most recently closed 17 // TabRestoreService is responsible for maintaining the most recently closed
18 // tabs. When the user closes a tab TabRestoreService::CreateHistoricalTab is 18 // tabs and windows. When a tab is closed
19 // invoked and a HistoricalTab is created to represent the tab. 19 // TabRestoreService::CreateHistoricalTab is invoked and a Tab is created to
20 // represent the tab. Similarly, when a browser is closed, BrowserClosing is
21 // invoked and a Window is created to represent the window.
20 // 22 //
21 // TabRestoreService can recreate tabs from the previous session as well. 23 // To restore a tab/window from the TabRestoreService invoke RestoreEntryById
22 // LoadPreviousSessionTabs loads (asynchronously) the tabs from the previous 24 // or RestoreMostRecentEntry.
23 // session. When done, the observer is notified.
24 // 25 //
25 // To restore a tab from the TabRestoreService invoke AddRestoredTab on the 26 // To listen for changes to the set of entries managed by the TabRestoreService
26 // Browser you want to restore the tab to, followed by RemoveHistoricalTabById
27 // to remove the tab from the restore service.
28 //
29 // To listen for changes to the set of tabs managed by the TabRestoreService
30 // add an observer. 27 // add an observer.
31
32 class TabRestoreService { 28 class TabRestoreService {
33 public: 29 public:
34 // Observer is notified when the set of tabs managed by TabRestoreService 30 // Observer is notified when the set of entries managed by TabRestoreService
35 // changes in some way. 31 // changes in some way.
36 class Observer { 32 class Observer {
37 public: 33 public:
38 // Sent when the internal tab state changed 34 // Sent when the set of entries changes in some way.
39 virtual void TabRestoreServiceChanged(TabRestoreService* service) = 0; 35 virtual void TabRestoreServiceChanged(TabRestoreService* service) = 0;
40 36
41 // Sent to all remaining Observers when TabRestoreService's 37 // Sent to all remaining Observers when TabRestoreService's
42 // destructor is run. 38 // destructor is run.
43 virtual void TabRestoreServiceDestroyed(TabRestoreService* service) = 0; 39 virtual void TabRestoreServiceDestroyed(TabRestoreService* service) = 0;
44 }; 40 };
45 41
42 // The type of entry.
43 enum Type {
44 TAB,
45 WINDOW
46 };
47
48 struct Entry {
49 Entry();
50 explicit Entry(Type type);
51 virtual ~Entry() {}
52
53 // Unique id for this entry. The id is guaranteed to be unique for a
54 // session.
55 int id;
56
57 // The type of the entry.
58 Type type;
59 };
60
46 // Represents a previously open tab. 61 // Represents a previously open tab.
47 struct HistoricalTab { 62 struct Tab : public Entry {
48 HistoricalTab(); 63 Tab() : Entry(TAB), current_navigation_index(-1) {}
49
50 // Time the tab was closed.
51 base::Time close_time;
52
53 // If true, this is a historical session and not a closed tab.
54 bool from_last_session;
55 64
56 // The navigations. 65 // The navigations.
57 // WARNING: navigations may be empty. 66 // WARNING: navigations may be empty.
58 std::vector<TabNavigation> navigations; 67 std::vector<TabNavigation> navigations;
59 68
60 // Index of the selected navigation in navigations. 69 // Index of the selected navigation in navigations.
61 int current_navigation_index; 70 int current_navigation_index;
62
63 // Unique id for the closed tab. This is guaranteed to be unique for
64 // a session.
65 const int id;
66 }; 71 };
67 72
68 typedef std::list<HistoricalTab> Tabs; 73 // Represents a previously open window.
74 struct Window : public Entry {
75 Window() : Entry(WINDOW), selected_tab_index(-1) {}
69 76
70 // Creates a new TabRestoreService. This does not load tabs from the last 77 // The tabs that comprised the window, in order.
71 // session, you must explicitly invoke LoadPreviousSessionTabs to do that. 78 std::vector<Tab> tabs;
79
80 // Index of the selected tab.
81 int selected_tab_index;
82 };
83
84 typedef std::list<Entry*> Entries;
85
86 // Creates a new TabRestoreService.
72 explicit TabRestoreService(Profile* profile); 87 explicit TabRestoreService(Profile* profile);
73 ~TabRestoreService(); 88 ~TabRestoreService();
74 89
75 // Adds/removes an observer. TabRestoreService does not take ownership of 90 // Adds/removes an observer. TabRestoreService does not take ownership of
76 // the observer. 91 // the observer.
77 void AddObserver(Observer* observer); 92 void AddObserver(Observer* observer);
78 void RemoveObserver(Observer* observer); 93 void RemoveObserver(Observer* observer);
79 94
80 // If the previous session has not been loaded, it is loaded and the tabs 95 // Creates a Tab to represent |tab| and notifies observers the list of
81 // from it are placed at the end of the queue. 96 // entries has changed.
82 void LoadPreviousSessionTabs();
83
84 // Returns true if loading the previous sessions tabs.
85 bool IsLoadingPreviousSessionTabs();
86
87 // Returns true if LoadPreviousSessionTabs will attempt to load any tabs.
88 bool WillLoadPreviousSessionTabs();
89
90 // Creates a HistoricalTab to represent the tab and notifies observers the
91 // list of tabs has changed.
92 void CreateHistoricalTab(NavigationController* tab); 97 void CreateHistoricalTab(NavigationController* tab);
93 98
94 // Removes the HistoricalTab with the specified id and notifies observers. 99 // Invoked when a browser is closing. If |browser| is a tabbed browser with
95 // Does nothing if id does not identify a valid historical tab id. 100 // at least one tab, a Window is created, added to entries and observers are
96 void RemoveHistoricalTabById(int id); 101 // notified.
102 void BrowserClosing(Browser* browser);
97 103
98 // Removes all HistoricalTabs from the list and notifies observers the list 104 // Invoked when the browser is done closing.
105 void BrowserClosed(Browser* browser);
106
107 // Removes all entries from the list and notifies observers the list
99 // of tabs has changed. 108 // of tabs has changed.
100 void ClearHistoricalTabs(); 109 void ClearEntries();
101 110
102 // Returns the tabs, ordered with most recently closed tabs at the front. 111 // Returns the entries, ordered with most recently closed entries at the
103 const Tabs& tabs() const { return tabs_; } 112 // front.
113 const Entries& entries() const { return entries_; }
114
115 // Restores the most recently closed entry. Does nothing if there are no
116 // entries to restore. If the most recently restored entry is a tab, it is
117 // added to |browser|.
118 void RestoreMostRecentEntry(Browser* browser);
119
120 // Restores an entry by id. If there is no entry with an id matching |id|,
121 // this does nothing. If |replace_existing_tab| is true and id identifies a
122 // tab, the newly created tab replaces the selected tab in |browser|.
123 void RestoreEntryById(Browser* browser, int id, bool replace_existing_tab);
104 124
105 private: 125 private:
106 // Callback from loading the last session. As necessary adds the tabs to
107 // tabs_.
108 void OnGotLastSession(SessionService::Handle handle,
109 std::vector<SessionWindow*>* windows);
110
111 // Invoked from OnGotLastSession to add the necessary tabs from windows
112 // to tabs_.
113 void AddHistoricalTabs(std::vector<SessionWindow*>* windows);
114
115 // Creates a HistoricalTab from the tab.
116 void AppendHistoricalTabFromSessionTab(SessionTab* tab);
117
118 // Populates tabs->navigations from the NavigationController. 126 // Populates tabs->navigations from the NavigationController.
119 void PopulateTabFromController(NavigationController* controller, 127 void PopulateTabFromController(NavigationController* controller,
120 HistoricalTab* tab); 128 Tab* tab);
121
122 // Populates tab->navigations from a previous sessions navigations.
123 void PopulateTabFromSessionTab(SessionTab* session_tab,
124 HistoricalTab* tab);
125 129
126 // Notifies observers the tabs have changed. 130 // Notifies observers the tabs have changed.
127 void NotifyTabsChanged(); 131 void NotifyTabsChanged();
128 132
133 // Prunes entries_ to contain only kMaxEntries and invokes NotifyTabsChanged.
134 void PruneAndNotify();
135
136 // Returns an iterator into entries_ whose id matches |id|.
137 Entries::iterator GetEntryIteratorById(int id);
138
129 Profile* profile_; 139 Profile* profile_;
130 140
131 // Whether we've loaded the last session. 141 // Whether we've loaded the last session.
132 bool loaded_last_session_; 142 bool loaded_last_session_;
133 143
134 // Set of tabs. We own the NavigationControllers in this list. 144 // Set of entries.
135 Tabs tabs_; 145 Entries entries_;
136 146
137 // Used in requesting the last session. 147 // Are we restoring a tab? If this is true we ignore requests to create a
138 CancelableRequestConsumer cancelable_consumer_; 148 // historical tab.
149 bool restoring_;
139 150
140 ObserverList<Observer> observer_list_; 151 ObserverList<Observer> observer_list_;
141 152
142 DISALLOW_EVIL_CONSTRUCTORS(TabRestoreService); 153 // Set of tabs that we've received a BrowserClosing method for but no
154 // corresponding BrowserClosed. We cache the set of browsers closing to
155 // avoid creating historical tabs for them.
156 std::set<Browser*> closing_browsers_;
157
158 DISALLOW_COPY_AND_ASSIGN(TabRestoreService);
143 }; 159 };
144 160
145 #endif // CHROME_BROWSER_TAB_RESTORE_SERVICE_H__ 161 #endif // CHROME_BROWSER_TAB_RESTORE_SERVICE_H_
146
OLDNEW
« 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