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

Side by Side Diff: chrome/browser/sessions/session_service.cc

Issue 329040: Take 2 at this. The only change between this and the first is to add the GetT... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 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 unified diff | Download patch | Annotate | Revision Log
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 #include "build/build_config.h" 5 #include "build/build_config.h"
6 6
7 #include "chrome/browser/sessions/session_service.h" 7 #include "chrome/browser/sessions/session_service.h"
8 8
9 #include <limits> 9 #include <limits>
10 10
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 SessionID::id_type tab_id; 112 SessionID::id_type tab_id;
113 bool pinned_state; 113 bool pinned_state;
114 }; 114 };
115 115
116 } // namespace 116 } // namespace
117 117
118 // SessionService ------------------------------------------------------------- 118 // SessionService -------------------------------------------------------------
119 119
120 SessionService::SessionService(Profile* profile) 120 SessionService::SessionService(Profile* profile)
121 : BaseSessionService(SESSION_RESTORE, profile, FilePath()), 121 : BaseSessionService(SESSION_RESTORE, profile, FilePath()),
122 has_open_tabbed_browsers_(false), 122 has_open_trackable_browsers_(false),
123 move_on_new_browser_(false) { 123 move_on_new_browser_(false) {
124 Init(); 124 Init();
125 } 125 }
126 126
127 SessionService::SessionService(const FilePath& save_path) 127 SessionService::SessionService(const FilePath& save_path)
128 : BaseSessionService(SESSION_RESTORE, NULL, save_path), 128 : BaseSessionService(SESSION_RESTORE, NULL, save_path),
129 has_open_tabbed_browsers_(false), 129 has_open_trackable_browsers_(false),
130 move_on_new_browser_(false) { 130 move_on_new_browser_(false) {
131 Init(); 131 Init();
132 } 132 }
133 133
134 SessionService::~SessionService() { 134 SessionService::~SessionService() {
135 Save(); 135 Save();
136 } 136 }
137 137
138 void SessionService::ResetFromCurrentBrowsers() { 138 void SessionService::ResetFromCurrentBrowsers() {
139 ScheduleReset(); 139 ScheduleReset();
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 window_id.id()) != window_closing_ids_.end() || 209 window_id.id()) != window_closing_ids_.end() ||
210 !IsOnlyOneTabLeft()) { 210 !IsOnlyOneTabLeft()) {
211 // Tab closure is the result of a window close (and it isn't the last 211 // Tab closure is the result of a window close (and it isn't the last
212 // window), or closing a tab and there are other windows/tabs open. Mark the 212 // window), or closing a tab and there are other windows/tabs open. Mark the
213 // tab as closed. 213 // tab as closed.
214 ScheduleCommand(CreateTabClosedCommand(tab_id.id())); 214 ScheduleCommand(CreateTabClosedCommand(tab_id.id()));
215 } else { 215 } else {
216 // User closed the last tab in the last tabbed browser. Don't mark the 216 // User closed the last tab in the last tabbed browser. Don't mark the
217 // tab closed. 217 // tab closed.
218 pending_tab_close_ids_.insert(tab_id.id()); 218 pending_tab_close_ids_.insert(tab_id.id());
219 has_open_tabbed_browsers_ = false; 219 has_open_trackable_browsers_ = false;
220 } 220 }
221 } 221 }
222 222
223 void SessionService::WindowClosing(const SessionID& window_id) { 223 void SessionService::WindowClosing(const SessionID& window_id) {
224 if (!ShouldTrackChangesToWindow(window_id)) 224 if (!ShouldTrackChangesToWindow(window_id))
225 return; 225 return;
226 226
227 // The window is about to close. If there are other tabbed browsers with the 227 // The window is about to close. If there are other tabbed browsers with the
228 // same original profile commit the close immediately. 228 // same original profile commit the close immediately.
229 // 229 //
230 // NOTE: if the user chooses the exit menu item session service is destroyed 230 // NOTE: if the user chooses the exit menu item session service is destroyed
231 // and this code isn't hit. 231 // and this code isn't hit.
232 if (has_open_tabbed_browsers_) { 232 if (has_open_trackable_browsers_) {
233 // Closing a window can never make has_open_tabbed_browsers_ go from false 233 // Closing a window can never make has_open_trackable_browsers_ go from
234 // to true, so only update it if already true. 234 // false to true, so only update it if already true.
235 has_open_tabbed_browsers_ = HasOpenTabbedBrowsers(window_id); 235 has_open_trackable_browsers_ = HasOpenTrackableBrowsers(window_id);
236 } 236 }
237 if (!has_open_tabbed_browsers_) 237 if (!has_open_trackable_browsers_)
238 pending_window_close_ids_.insert(window_id.id()); 238 pending_window_close_ids_.insert(window_id.id());
239 else 239 else
240 window_closing_ids_.insert(window_id.id()); 240 window_closing_ids_.insert(window_id.id());
241 } 241 }
242 242
243 void SessionService::WindowClosed(const SessionID& window_id) { 243 void SessionService::WindowClosed(const SessionID& window_id) {
244 if (!ShouldTrackChangesToWindow(window_id)) 244 if (!ShouldTrackChangesToWindow(window_id))
245 return; 245 return;
246 246
247 windows_tracking_.erase(window_id.id()); 247 windows_tracking_.erase(window_id.id());
248 248
249 if (window_closing_ids_.find(window_id.id()) != window_closing_ids_.end()) { 249 if (window_closing_ids_.find(window_id.id()) != window_closing_ids_.end()) {
250 window_closing_ids_.erase(window_id.id()); 250 window_closing_ids_.erase(window_id.id());
251 ScheduleCommand(CreateWindowClosedCommand(window_id.id())); 251 ScheduleCommand(CreateWindowClosedCommand(window_id.id()));
252 } else if (pending_window_close_ids_.find(window_id.id()) == 252 } else if (pending_window_close_ids_.find(window_id.id()) ==
253 pending_window_close_ids_.end()) { 253 pending_window_close_ids_.end()) {
254 // We'll hit this if user closed the last tab in a window. 254 // We'll hit this if user closed the last tab in a window.
255 has_open_tabbed_browsers_ = HasOpenTabbedBrowsers(window_id); 255 has_open_trackable_browsers_ = HasOpenTrackableBrowsers(window_id);
256 if (!has_open_tabbed_browsers_) 256 if (!has_open_trackable_browsers_)
257 pending_window_close_ids_.insert(window_id.id()); 257 pending_window_close_ids_.insert(window_id.id());
258 else 258 else
259 ScheduleCommand(CreateWindowClosedCommand(window_id.id())); 259 ScheduleCommand(CreateWindowClosedCommand(window_id.id()));
260 } 260 }
261 } 261 }
262 262
263 void SessionService::SetWindowType(const SessionID& window_id, 263 void SessionService::SetWindowType(const SessionID& window_id,
264 Browser::Type type) { 264 Browser::Type type) {
265 if (!should_track_changes_for_browser_type(type)) 265 if (!should_track_changes_for_browser_type(type))
266 return; 266 return;
267 267
268 windows_tracking_.insert(window_id.id()); 268 windows_tracking_.insert(window_id.id());
269 269
270 // The user created a new tabbed browser with our profile. Commit any 270 // The user created a new tabbed browser with our profile. Commit any
271 // pending closes. 271 // pending closes.
272 CommitPendingCloses(); 272 CommitPendingCloses();
273 273
274 has_open_tabbed_browsers_ = true; 274 has_open_trackable_browsers_ = true;
275 move_on_new_browser_ = true; 275 move_on_new_browser_ = true;
276 276
277 ScheduleCommand(CreateSetWindowTypeCommand(window_id, type)); 277 ScheduleCommand(CreateSetWindowTypeCommand(window_id, type));
278 } 278 }
279 279
280 void SessionService::TabNavigationPathPrunedFromBack(const SessionID& window_id, 280 void SessionService::TabNavigationPathPrunedFromBack(const SessionID& window_id,
281 const SessionID& tab_id, 281 const SessionID& tab_id,
282 int count) { 282 int count) {
283 if (!ShouldTrackChangesToWindow(window_id)) 283 if (!ShouldTrackChangesToWindow(window_id))
284 return; 284 return;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 const NotificationDetails& details) { 402 const NotificationDetails& details) {
403 // All of our messages have the NavigationController as the source. 403 // All of our messages have the NavigationController as the source.
404 switch (type.value) { 404 switch (type.value) {
405 case NotificationType::BROWSER_OPENED: { 405 case NotificationType::BROWSER_OPENED: {
406 Browser* browser = Source<Browser>(source).ptr(); 406 Browser* browser = Source<Browser>(source).ptr();
407 if (browser->profile() != profile() || 407 if (browser->profile() != profile() ||
408 !should_track_changes_for_browser_type(browser->type())) { 408 !should_track_changes_for_browser_type(browser->type())) {
409 return; 409 return;
410 } 410 }
411 411
412 if (!has_open_tabbed_browsers_ && !BrowserInit::InProcessStartup()) { 412 if (!has_open_trackable_browsers_ && !BrowserInit::InProcessStartup()) {
413 // We're going from no tabbed browsers to a tabbed browser (and not in 413 // We're going from no tabbed browsers to a tabbed browser (and not in
414 // process startup), restore the last session. 414 // process startup), restore the last session.
415 if (move_on_new_browser_) { 415 if (move_on_new_browser_) {
416 // Make the current session the last. 416 // Make the current session the last.
417 MoveCurrentSessionToLastSession(); 417 MoveCurrentSessionToLastSession();
418 move_on_new_browser_ = false; 418 move_on_new_browser_ = false;
419 } 419 }
420 SessionStartupPref pref = SessionStartupPref::GetStartupPref(profile()); 420 SessionStartupPref pref = SessionStartupPref::GetStartupPref(profile());
421 if (pref.type == SessionStartupPref::LAST) { 421 if (pref.type == SessionStartupPref::LAST) {
422 SessionRestore::RestoreSession( 422 SessionRestore::RestoreSession(
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 void SessionService::ScheduleReset() { 1012 void SessionService::ScheduleReset() {
1013 set_pending_reset(true); 1013 set_pending_reset(true);
1014 STLDeleteElements(&pending_commands()); 1014 STLDeleteElements(&pending_commands());
1015 tab_to_available_range_.clear(); 1015 tab_to_available_range_.clear();
1016 windows_tracking_.clear(); 1016 windows_tracking_.clear();
1017 BuildCommandsFromBrowsers(&pending_commands(), &tab_to_available_range_, 1017 BuildCommandsFromBrowsers(&pending_commands(), &tab_to_available_range_,
1018 &windows_tracking_); 1018 &windows_tracking_);
1019 if (!windows_tracking_.empty()) { 1019 if (!windows_tracking_.empty()) {
1020 // We're lazily created on startup and won't get an initial batch of 1020 // We're lazily created on startup and won't get an initial batch of
1021 // SetWindowType messages. Set these here to make sure our state is correct. 1021 // SetWindowType messages. Set these here to make sure our state is correct.
1022 has_open_tabbed_browsers_ = true; 1022 has_open_trackable_browsers_ = true;
1023 move_on_new_browser_ = true; 1023 move_on_new_browser_ = true;
1024 } 1024 }
1025 StartSaveTimer(); 1025 StartSaveTimer();
1026 } 1026 }
1027 1027
1028 bool SessionService::ReplacePendingCommand(SessionCommand* command) { 1028 bool SessionService::ReplacePendingCommand(SessionCommand* command) {
1029 // We only optimize page navigations, which can happen quite frequently and 1029 // We only optimize page navigations, which can happen quite frequently and
1030 // are expensive. If necessary, other commands could be searched for as 1030 // are expensive. If necessary, other commands could be searched for as
1031 // well. 1031 // well.
1032 if (command->id() != kCommandUpdateTabNavigation) 1032 if (command->id() != kCommandUpdateTabNavigation)
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 pending_window_close_ids_.clear(); 1101 pending_window_close_ids_.clear();
1102 } 1102 }
1103 1103
1104 bool SessionService::IsOnlyOneTabLeft() { 1104 bool SessionService::IsOnlyOneTabLeft() {
1105 if (!profile()) { 1105 if (!profile()) {
1106 // We're testing, always return false. 1106 // We're testing, always return false.
1107 return false; 1107 return false;
1108 } 1108 }
1109 1109
1110 // NOTE: This uses the original profile so that closing the last non-off the 1110 // NOTE: This uses the original profile so that closing the last non-off the
1111 // record window while there are open off the record window resets state). 1111 // record window while there are open off the record windows resets state).
1112 int window_count = 0; 1112 int window_count = 0;
1113 for (BrowserList::const_iterator i = BrowserList::begin(); 1113 for (BrowserList::const_iterator i = BrowserList::begin();
1114 i != BrowserList::end(); ++i) { 1114 i != BrowserList::end(); ++i) {
1115 const SessionID::id_type window_id = (*i)->session_id().id(); 1115 const SessionID::id_type window_id = (*i)->session_id().id();
1116 if (should_track_changes_for_browser_type((*i)->type()) && 1116 if (should_track_changes_for_browser_type((*i)->type()) &&
1117 (*i)->profile()->GetOriginalProfile() == profile() && 1117 (*i)->profile()->GetOriginalProfile() == profile() &&
1118 window_closing_ids_.find(window_id) == window_closing_ids_.end()) { 1118 window_closing_ids_.find(window_id) == window_closing_ids_.end()) {
1119 if (++window_count > 1) 1119 if (++window_count > 1)
1120 return false; 1120 return false;
1121 // By the time this is invoked the tab has been removed. As such, we use 1121 // By the time this is invoked the tab has been removed. As such, we use
1122 // > 0 here rather than > 1. 1122 // > 0 here rather than > 1.
1123 if ((*i)->tab_count() > 0) 1123 if ((*i)->tab_count() > 0)
1124 return false; 1124 return false;
1125 } 1125 }
1126 } 1126 }
1127 return true; 1127 return true;
1128 } 1128 }
1129 1129
1130 bool SessionService::HasOpenTabbedBrowsers(const SessionID& window_id) { 1130 bool SessionService::HasOpenTrackableBrowsers(const SessionID& window_id) {
1131 if (!profile()) { 1131 if (!profile()) {
1132 // We're testing, always return false. 1132 // We're testing, always return false.
1133 return true; 1133 return true;
1134 } 1134 }
1135 1135
1136 // NOTE: This uses the original profile so that closing the last non-off the 1136 // NOTE: This uses the original profile so that closing the last non-off the
1137 // record window while there are open off the record window resets state). 1137 // record window while there are open off the record window resets state).
1138 for (BrowserList::const_iterator i = BrowserList::begin(); 1138 for (BrowserList::const_iterator i = BrowserList::begin();
1139 i != BrowserList::end(); ++i) { 1139 i != BrowserList::end(); ++i) {
1140 Browser* browser = *i; 1140 Browser* browser = *i;
1141 const SessionID::id_type browser_id = browser->session_id().id(); 1141 const SessionID::id_type browser_id = browser->session_id().id();
1142 if (browser_id != window_id.id() && 1142 if (browser_id != window_id.id() &&
1143 window_closing_ids_.find(browser_id) == window_closing_ids_.end() && 1143 window_closing_ids_.find(browser_id) == window_closing_ids_.end() &&
1144 should_track_changes_for_browser_type(browser->type()) && 1144 should_track_changes_for_browser_type(browser->type()) &&
1145 browser->profile()->GetOriginalProfile() == profile()) { 1145 browser->profile()->GetOriginalProfile() == profile()) {
1146 return true; 1146 return true;
1147 } 1147 }
1148 } 1148 }
1149 return false; 1149 return false;
1150 } 1150 }
1151 1151
1152 bool SessionService::ShouldTrackChangesToWindow(const SessionID& window_id) { 1152 bool SessionService::ShouldTrackChangesToWindow(const SessionID& window_id) {
1153 return windows_tracking_.find(window_id.id()) != windows_tracking_.end(); 1153 return windows_tracking_.find(window_id.id()) != windows_tracking_.end();
1154 } 1154 }
OLDNEW
« no previous file with comments | « chrome/browser/sessions/session_service.h ('k') | chrome/browser/sessions/session_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698